我们曾探索用openpyxl来查询xlsx文件中的所有工作表中是否存在某个关键词,如果有的话,就打印出这个文件名的名字。
一、问题的缘起
之前用openpyxl只能打开xlsx文件,对于xls文件却束手无策,于时我就想如何解决Excel文件格式限制的问题,最终我选定了xlrd这个读取Excel文件比较快速的模块,并根据Claude提供的代码,给出了初步的解决文案。
二、初步解决
借助于Claude,我很快修改出了代码,可以批量读取当前目录下的xls文件,遍历所有的工作表,同时遍历每一个单元格。我们用os这个模块来遍历所有xls文件,用xlrd来读取Excel,通过先读取行,再读取列的方式查找所有单元格中是否包含关键词。
import os
import xlrd
keyword = '李XX'
files = [i for i in os.listdir('.') if i.endswith(".xls")]
for file in files:
workbook = xlrd.open_workbook(file)
sheets = workbook.sheets()
for sheet in sheets:
for row_idx in range(sheet.nrows):
row = sheet.row(row_idx)
for col_idx in range(sheet.ncols):
cell = row[col_idx]
if str(cell.value).find(keyword) != -1:
print('找到关键词!文件名为:', file)
三、二次优化
针对以上代码,我又进一步思考,考虑用sheet.cell_value(row, col)来查找单元格的内容,这样可以进一步优化循环,减少代码量,加快代码执行的速度。而且,这次代码中省去了str()和find()两个函数,执行效率大幅提升。
import os
import xlrd
keyword = '李XX'
files = [i for i in os.listdir('.') if i.endswith(".xls")]
for file in files:
workbook = xlrd.open_workbook(file)
sheets = workbook.sheets()
for sheet in sheets:
for row in range(sheet.nrows):
for col in range(sheet.ncols):
cell_value = sheet.cell_value(row,col)
if cell_value == keyword:
print('找到关键词!文件名为:', file)
四、三次优化
可以利用sheet.row_values(row)获取每一行的所有值,再判断keyword是不是在这个值列表中。这样做可以节约大约二行代码,减少了一个for循环。
import os
import xlrd
keyword = '李金斗'
files = [i for i in os.listdir('.') if i.endswith(".xls")]
for file in files:
workbook = xlrd.open_workbook(file)
sheets = workbook.sheets()
for sheet in sheets:
for row in range(sheet.nrows):
if keyword in sheet.row_values(row):
print('找到关键词!文件名为:', file)
print('未找到关键词')
五、学后反思
- Python在办公自动化方面优势明显,在上面代码中,Python可以遍历文件、工作表、行、列、单元格,人工可能要十分钟完成的任务,它用一秒钟就完成了。
- 在读取xlsx文件时,可以考虑用openpyxl,或者是pandas。如果是xls文件则用xlrd这个包,而且我发现xlrd的执行速度比openpyxl要快的多,当然pandas运行速度较慢,但是实现的功能更多。
- Claude, ChatGPT在辅助编程方面真的很强大,可以辅助项目开发,节约时间和成本。尤其是在自己没有任何思路的情况下,可以利用它来打开思路,简化工作步骤,提升工作效率。