Python 与 Excel 表格综合实例:给表格增加序号,对表格已有内容增加索引

Python与Office 专栏收录该内容
15 篇文章 165 订阅

Python 与 Excel 表格综合实例(一):给表格增加序号,根据表格已有内容增加索引

前言:

前面我们花了6篇博客,把Python的xlwt与xlrd两个第三方模块对Excel表格的基础操作讲完了。从这篇博客开始会选择三个实例来演示,Python对Excel表格可以做一些什么事情。

当然,实际工作中会遇到更多、更复杂的一些需求,希望接下来的三个实例能起到一点抛砖引玉的作用吧。

需求一:增加序列号

之前在工作中,遇到过一个需求。有一份软件(GIS)后台输出的表格,如下图所示(已把无关数据清除、减少数据量):

在这里插入图片描述
需求:在FID列上对所有有效行增加序列号:KH0001,KH0002…

总体实现思路:先读取表格,按行读取,对数据进行处理。将处理后的数据写入新的表格中。
总体来说还是比较简单的,以下是实现代码:

1、读取表格、处理数据:

import xlrd
import xlwt

# 读取表格内容,按行读取
# 打开需读取的Excel文件
read_work = xlrd.open_workbook('sample.xls')
# 获取sheet对象
read_sheet = read_work.sheet_by_index(0)
# 按行读取sheet表全部数据
read_data = read_sheet._cell_values
print(read_data) # 测试读取数据

# ------运行结果------
# [['FID', 'TBYBH', 'TBBH', 'DLBM', 'QSXZ', 'QSDWDM', 'TBDLMJ', 'SHAPE_Leng', 'SHAPE_Area', 'YTMC'], 
# ['', 259.0, 259.0, 1004.0, 30.0, 3.21204104014e+18, 423.17, 329.039887497, 423.170124975, '村庄道路用地'], 
# ['', 395.0, 395.0, 1004.0, 30.0, 3.21204104013e+18, 275.569999999999, 144.782244633, 275.565036626999, '村庄道路用地'], 
# ['', 415.0, 415.0, 1004.0, 30.0, 3.21204104007e+18, 657.97, 227.183826919, 657.971388514999, '城镇道路用地'], 
# ...
# ------运行结果------

# 创建自定义FID列数据
def create_fid(data):
    for i,ds in enumerate(data):
        if i >= 999:
            ds[0] = 'KH' + str(i+1)
        elif 99 <= i < 999:
            ds[0] = 'KH0' + str(i+1)
        elif 9 <= i < 99:
            ds[0] = 'KH00' + str(i+1)
        else:
            ds[0] = 'KH000' + str(i+1)

    return data

new_data = create_fid(read_data[1:])
new_data.insert(0,read_data[0])
print(new_data) # 测试新建数据
# ------运行结果------
# [['FID', 'TBYBH', 'TBBH', 'DLBM', 'QSXZ', 'QSDWDM', 'TBDLMJ', 'SHAPE_Leng', 'SHAPE_Area', 'YTMC'], 
# ['KH0001', 259.0, 259.0, 1004.0, 30.0, 3.21204104014e+18, 423.17, 329.039887497, 423.170124975, '村庄道路用地'], 
# ['KH0002', 395.0, 395.0, 1004.0, 30.0, 3.21204104013e+18, 275.569999999999, 144.782244633, 275.565036626999, '村庄道路用地'], 
# ['KH0003', 415.0, 415.0, 1004.0, 30.0, 3.21204104007e+18, 657.97, 227.183826919, 657.971388514999, '城镇道路用地'], 
# ...

可以看到读取的数据 read_data 经过自写的 create_fid 函数,new_data 列表已经满足我们的需求了。

2、写入新Excel文件:

# 将新建数据写入Excel表格
# 创建新的Excel表
new_work = xlwt.Workbook()
# 创建新的sheet表
new_sheet = new_work.add_sheet('Sheet1')
# 按行写入数据,按行写入
for row,ds in enumerate(new_data):
    for col,d in enumerate(ds):
        new_sheet.write(row,col,d)
# 保存文件
new_work.save('new_sample.xls')

这里我们先新建了一个Excel文件,然后将数据按行写入,最后保存为 new_sample.xls 文件。文件截图如下:

在这里插入图片描述
可以看到新保存的Excel文件已经在 FID 列上按照需求增加了序号列。

用自写的方法来实现写入功能:

我们在 xlwt 自写接口实现:按行按列写入、自定义格式方法、自动调整列宽等 博客里写了一个 My_xlwt 类:

在这里插入图片描述
我们用自写的类来实现创建表格,写入数据功能:

# 用自写的类来创建新的Excel表格
from my_xlwt import My_xlwt

my_work = My_xlwt()
# 创建格式:
head_style = my_work.diy_style('Times New Roman',15) # 首行格式
body_style = my_work.diy_style('Times New Roman',10,False,3) # 正文格式
# 写入首行数据
my_work.write_row(0,0,new_data[0],head_style)
# 按行写入多组数据
my_work.write_rows(1,0,new_data[1:],body_style)
# 自动调整列宽
my_work.adjust_col_width(6) # 自动调整列宽方法没写好,后期在博客里再更新吧...
# 保存数据
my_work.save('my_new_sample.xls')

解析:用自写类按行写入数据、设置单元格格式、设置自适应列宽(此方法还有点问题…)。
my_new_sample.xls 文件截图:

在这里插入图片描述

需求二:按已有内容新增列

需求描述: 根据 YTMC 列的值,新建一个 YTDM 用于显示用地编号的列,用地编号信息在s2_info.xls表格文件中。

在这里插入图片描述
主要思路:分别读取两个表格文件,构造数据,处理数据。将处理好的数据写入新的Excel表格文件里。代码:

读取文件数据:

import xlrd
import xlwt

# 读取两个Excel表格信息
# 打开需读取的Excel文件
read_work = xlrd.open_workbook('sample2.xls')
replace_work = xlrd.open_workbook('s2_info.xls')
# 获取sheet对象
read_sheet = read_work.sheet_by_index(0)
replace_sheet = replace_work.sheet_by_index(0)
# 按行读取 read_sheet 表全部数据
read_data = read_sheet._cell_values

# 按列读取 replace_sheet 数据
r_d = replace_sheet._cell_values
# 并储存为字典数据
replace_data = {key:values for key,values in r_d}

处理数据:

# 构造数据
for ds in read_data[1:]:
    if ds[-1] in replace_data.keys():
        ds.append(replace_data[ds[-1]])
    else:
        ds.append('error')

read_data[0].append('YTDM')

print(read_data) # 测试数据
# ------运行结果------
# [['FID', 'TBYBH', 'TBBH', 'DLBM', 'QSXZ', 'QSDWDM', 'TBDLMJ', 'SHAPE_Leng', 'SHAPE_Area', 'YTMC', 'YTDM'], 
# ['KH0001', 259.0, 259.0, 1004.0, 30.0, 3.21204104014e+18, 423.17, 329.039887497, 423.170124975, '村庄道路用地', 1002.0], 
# ['KH0002', 395.0, 395.0, 1004.0, 30.0, 3.21204104013e+18, 275.569999999999, 144.782244633, 275.565036626999, '村庄道路用地', 1002.0], 
# ['KH0003', 415.0, 415.0, 1004.0, 30.0, 3.21204104007e+18, 657.97, 227.183826919, 657.971388514999, '城镇道路用地', 1001.0], 
# ...
# ------运行结果------

创建新得Excel文件,写入数据:

# 新建工作薄,将处理好的数据写入
# 创建新的Excel表
new_work = xlwt.Workbook()
# 创建新的sheet表
new_sheet = new_work.add_sheet('Sheet1')
# 按行写入数据,按行写入
for row,ds in enumerate(read_data):
    for col,d in enumerate(ds):
        new_sheet.write(row,col,d)
# 保存文件
new_work.save('replace_sample.xls')

replace_sample.xls 文件截图:

在这里插入图片描述

结尾:

以上就是本篇博客所有内容,比较简单,主要是对前面介绍过的Excel文件读取和写入的知识在实例中运用一下,然后就是一些简单的业务逻辑。感谢阅读。

【Python与Office】专栏

该专栏会对 Python 的第三方模块,如:xlwt,xlrd,python-docx等,操作 Office 办公软件(Word Excel PPT)的方法进行详细讲解。同时也会搭配一些实例演练,一方面强化知识点的理解与运用,另一方面也希望能起到,引导读者进行思考:如何用 python 提高 offic 办公软件办公效率的作用。

感兴趣的朋友,可以点个 关注收藏 。如在博客中遇到任何问题或想法,可留言或私信。

创作不易,你的支持是我最大的动力,感谢 !

  • 8
    点赞
  • 0
    评论
  • 28
    收藏
  • 打赏
    打赏
  • 扫一扫,分享海报

©️2022 CSDN 皮肤主题:Age of Ai 设计师:meimeiellie 返回首页

打赏作者

YouMi Chou

原创不易,感谢支持。

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值