事件背景
当前实习中,事情发生在昨天,导师在外出差,原本这段时间没有啥任务,让我们这批实习生有时间做自己的毕设,偶尔有bug需要改一下,然后昨天导师远程给我丢了一个excel文件,让我处理一下,把整个表的数据给转换到另一个xls表里去,然后我打开看了一下数据,有2400多行,我滴个乖乖,但是一开始我还是老老实实在那儿复制粘贴,因为有些东西还是需要自己进行人为的判断,昨天上午10点钟给我发的任务,但是在那儿复制粘贴到了11点半的样子,我才粘了300多行,一直重复这一机械性劳动,让我心态裂了,然后我不想粘了,开始找其他方法 虽然我是一个java的后端开发者,但之前在学校也使用python写过一些程序,而且python用来写一些小工具是真的好用,然后我就尝试去用py写一个转换的程序
最后写出的py脚本
脚本如下:
import xlrd
import xlwt
result = []
list = ['类型','名称','单位','使用年限','物资类别']
def read_xls():
book = xlrd.open_workbook('E:\QC\桌面\origin.xls')
sheet1 = book.sheet_by_name("新固定资产目录")
print(sheet1)
rows = sheet1.nrows
print(rows)
label1 = ""
label2 = ""
for i in range(1,rows):
add = []
col2 = sheet1.cell_value(i,1)
col3 = sheet1.cell_value(i,2)
col4 = sheet1.cell_value(i,3)
col5 = sheet1.cell_value(i,4)
col6 = sheet1.cell_value(i,5)
col7 = sheet1.cell_value(i,6)
if col2 == '':
continue
elif col2 != '' and col3 == '':
label1 = col5.strip()
elif col3 != '' and col4 == '':
label2 = col5.strip()
else:
add.append(label1+'.'+label2)
add.append(col5.strip())
add.append(col6)
if col7 == '':
add.append(0)
else:
add.append(int(col7))
result.append(add)
print(result)
print(len(result))
write_xls()
def write_xls():
book = xlwt.Workbook()
sheet = book.add_sheet("转换后的文档")
for j in range(5):
sheet.write(0,j,list[j])
for i in range(len(result)):
for k in range(4):
sheet.write(i+1, k, result[i][k])
book.save("py输出文件结果.xls")
if __name__ == '__main__':
read_xls()
上述脚本功能描述
上述的脚本大致功能为将下面这张图的信息转化为 转换为如下的形式: 主要是将前面的那种层级关系写为多行的形式转换为单个列的形式二级目录和三级目录用一个“.”进行分隔开(如上图转换后的结果列“类型”)
这个自己亲自去把它给Ctrl c v弄过去也行 但是数量级上来后 一直在那儿反复的 c v 是一个很枯燥的过程,因为在那儿复制粘贴了半个多小时 我才处理300行眼睛都看疼了,更何况这个excel发给我的时候是有2400多行 于是心态炸了,所以就有了这个脚本
该脚本使用的工具包
主要是两个xlrd和xlwt 参考内容:https://www.cnblogs.com/Forever77/p/11135124.html 它们俩分别的作用: 因为脚本的功能要涉及xls文件的读取和写入,所以import了这两个包xlrd用于读取xls文件 xlwt用于写入xls文件
关于xlrd的使用:
1、首先要导入xlrd 也就是import xlrd 它即可读取xls文件也可读取xlsx文件 2、获取一个工作簿对象: book = xlrd.open_workbook(‘excel文件名称’) 3、获取所有工作表名称:names = book.sheet_names() 4、根据索引获取工作表对象:sheet = book.sheet_by_index(i) 索引下标i从0开始,之前在我调试的时候,直接写了个2 原本想读第二个sheet 结果就是数组超限了,呵呵 5、根据名称获取工作表对象:sheet = book.sheet_by_name(‘工作表名称’) 6、获取工作表行数:rows = sheet.nrows 7、获取工作表列数:cols = sheet.ncols 8、获取工作表某一行的内容:row = sheet.row_values(i) 结果为列表 [sheet.row(i) 列表] 9、获取工作表某一列的内容:col = sheet.col_values(i) 结果为列表 [sheet.col(i) 列表] 10、获取工作表某一单元格的内容:cell = sheet.cell_value(m,n) 、sheet.cell(m,n).value、sheet.row(m)[n].value,sheet.col(n)[m].value,结果为字符串或数值 第十条较为重要 一般会用于根据每个单元格的内容来判断它的类型
关于xlwt的使用:
1、使用xlwt模块之前需要先导入import xlwt,xlwt模块只能写xls文件,不能写xlsx文件(写xlsx程序不会报错,但最后文件无法直接打开,会报错)。 2、创建工作簿:book = xlwt.Workbook(),如果写入中文为乱码,可添加参数encoding = ‘utf-8’ 3、创建工作表:sheet = book.add_sheet(‘Sheet1’) 4、向单元格写入内容:sheet.write(m,n,‘内容1’)、sheet.write(x,y,‘内容2’) 5、保存工作簿:book.save(‘excel文件名称’),默认保存在py文件相同路径下,如果该路径下有相同文件,会被新创建的文件覆盖,即xlwt不能修改文件。
写脚本的一点心得
写一个脚本其实也还是需要花费一定的时间,因为如果你不熟悉这个工具的话,首先你得去查这个工具如何使用(也就是如何使用某个包的方法 ),学会使用后你要开始写你的脚本,然后去验证你的逻辑是否正确,2400行的数据 我不可能一开始上来就直接输出,一般都是先拿10行或20行来判断自己写的东西是否正确,发现问题就及时修改,然后修改完逻辑错误后,就执行,写脚本这东西就是这样 写个脚本并验证完其正确性后可能1个小时,但执行起来也就几秒钟,总之就是非常快速的得到你想要的结果,比起人工来判断并输出结果快很多
而对于处理这种excel文件时 ,一般分为三个步骤: 1、读取文件信息到内存 2、处理筛选信息为我想要的格式 3、输出文件信息
|