1、背景
同事交接的Python代码,该代码运行在windows服务器上。功能是读取腾讯文档的excel数据后,拉取到本地,然后再读取本地文件上传至mysql,已经正常运行了很长时间了,突然报错
raceback (most recent call last):
File "xxx/tengxunApi_wb.py", line 149, in get_values
wb = load_workbook('temp_wb.xlsx')
File "/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/site-packages/openpyxl/reader/excel.py", line 346, in load_workbook
reader.read()
File "/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/site-packages/openpyxl/reader/excel.py", line 301, in read
self.read_worksheets()
File "/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/site-packages/openpyxl/reader/excel.py", line 237, in read_worksheets
ws_parser.bind_all()
File "/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/site-packages/openpyxl/worksheet/_reader.py", line 465, in bind_all
self.bind_cells()
File "/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/site-packages/openpyxl/worksheet/_reader.py", line 368, in bind_cells
for idx, row in self.parser.parse():
File "/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/site-packages/openpyxl/worksheet/_reader.py", line 163, in parse
obj = prop[1].from_tree(element)
File "/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/site-packages/openpyxl/descriptors/serialisable.py", line 103, in from_tree
return cls(**attrib)
TypeError: WorksheetProperties.__init__() got an unexpected keyword argument 'state'
2、分析原因
1、方法传了state参数
2、数据中可能有换行符导致串行
3、表格中有公式
经过测试发现并不是前两种情况,第三种方案也没办法测试每一个单元格就放弃了。从网上找到一些升级或者降级openpyxl的方案测试后均失败,最后在知乎找到了以下答案,经测试可正常运行
3、解决方案
1、下载到本地的excel打开后重新保存即可
2、添加代码(参考:Python中,openpyxl读取excel公式值,结果为None的解决办法_M-Power的博客-优快云博客)
from win32com.client import Dispatch
def just_open(filename):
xlApp = Dispatch("Excel.Application")
xlApp.Visible = False
xlBook = xlApp.Workbooks.Open(filename)
xlBook.Save()
xlBook.Close()
原代码变为:
just_open(file_path)
workbook = openpyxl.load_workbook(file_path, data_only=True)
如果安装win32com的时候没有此组件,可安装pypiwin32
pip install pypiwin32