在新装的ubuntu16.04系统使用默认的python3.5时,需要用到openpyxl,于是直接按照下述指令装载
sudo pip3 install openpyxl
使用时,会提示版本不匹配,百度搜索,说openpyxl的3.x.x版本已不再支持python3.5,起码要使用python3.6。
考虑到新装机的普适性,尝试寻找python3.5适配的解决办法,百度到一个说指定版本2.6.0就可以。
sudo pip3 install openpyxl==2.6.0
发现可以import使用了。
但是在调用程序时,在wb.save(full_path)时又报了错误:AttributeError: 'NoneType' object has no attribute 'read',如下图所示。
wb.save(full_path)
File "/usr/local/lib/python3.5/dist-packages/openpyxl/workbook/workbook.py", line 396, in save
save_workbook(self, filename)
File "/usr/local/lib/python3.5/dist-packages/openpyxl/writer/excel.py", line 295, in save_workbook
writer.save()
File "/usr/local/lib/python3.5/dist-packages/openpyxl/writer/excel.py", line 276, in save
self.write_data()
File "/usr/local/lib/python3.5/dist-packages/openpyxl/writer/excel.py", line 76, in write_data
self._write_worksheets()
File "/usr/local/lib/python3.5/dist-packages/openpyxl/writer/excel.py", line 226, in _write_worksheets
self._write_comment(ws)
File "/usr/local/lib/python3.5/dist-packages/openpyxl/writer/excel.py", line 180, in _write_comment
vml = fromstring(self.workbook.vba_archive.read(ws.legacy_drawing))
AttributeError: 'NoneType' object has no attribute 'read'
开始搜到的解决办法:在打开文件时,带上参数keep_vba=True
wb = load_workbook(full_path, keep_vba=True)
这样修改后执行确实没问题了,但是重复执行时,又报错了,且搜索的解答中有留言说多次执行后,文件就损坏打不开了。所以这个解决办法并不是最终的解决办法。
继续搜索找解决办法,外网有留言说这就是个bug,已在后续的版本中解决了。
回想自己为了适配ubuntu16.04默认的python3.5版本,装载openpyxl时,指定了版本2.6.0(也是百度搜到的解决办法),所以可能用新的版本就可以解决这个问题。
openpyxl - A Python library to read/write Excel 2010 xlsx/xlsm files — openpyxl 3.0.10 documentation
官网上找到各个版本的介绍:https://openpyxl.readthedocs.io
发现2.6.x系列最终的版本是2.6.4版本,确认一下是否支持python3.5,明确的说明了支持python2.7和python3.5,所以嘛,重新装载2.6.4版本:
sudo pip3 install openpyxl==2.6.4
问题彻底搞定。
’