使用python workbook处理excel文件、保存后,再次打开提示:
#发现“新建 Microsoft Excel 工作表.xlsx”中的部分内容有问题。是否让我们尽量尝试恢复?如果您信任此工作簿的源,请单击“是”。
#Excel 已完成文件级验证和修复。此工作簿的某些部分可能已被修复或丢弃。
#单击查看修复记录:file:///C:/Users/Administrator/AppData/Local/Temp/error003840_01.xml
经测试隔离原因为:python 库处理excel中文字符内容并保存后,写入的格式化字符操作系统不兼容问题。
1)手动改写保存过的excel,且内容含中文时,用workbook处理保存后,再打开会报错
2)而当excel文件内容仅有英文字符时,则不会报错。
3)因此怀疑和python库对中文字符的处理相关,手动保存、系统自动保存写入的格式,与python库写入的格式,有差异,操作系统不兼容。
解决方案:
用workbook或pandas再打开、保存一次,再次打开不再报错。
代码样例:
test_file = "D:/Test/试试.xlsx" #单元格内容存在中文字符
wb_tar = openpyxl.load_workbook(test_file)
#xxxx处理(可选),之后保存
wb_tar.save(test_file)
#workbook再打开、保存一次(可保留源文件单元格颜色、字体、合并单元格等格式)
wb_tar = openpyxl.load_workbook(test_file)
wb_tar.save(test_file)
#或pandas再打开、保存一次(会丢失原文件单元格颜色、字体、合并单元格等格式)
df = pd.DataFrame(pd.read_excel(test_file))
df.to_excel(test_file,index=False)
参考:
https://ask.csdn.net/questions/7892152/54089130
故障原因详细剖析:
修改.xlsx为.rar或.zip,打开压缩包,从excel文件对应的压缩包内容来看,xl/sharedStrings.xml文件丢失了,不知道python库为什么会导致这个结果。
用VB再打开这个python库处理过的问题excel文件,报如下错误:不能取得类Workbooks的Open属性。
总之,怪哉怪哉。好在经测试,再次用workbook打开、保存一次问题excel文件,再次打开就正常了,算是临时规避吧。
详细比较python保存的excel文件,和windows系统保存的excel文件,格式差异较大:
python保存的文件缺少了xl/shareStrings.xml文件(存放单元格列名的),其他xml头部格式少了很多内容,具体如下:
1、外层目录结构相同
2、_rels/.rels,python保存的文件无xml行
4、docProps/app.xml,python保存的文件内容少太多,无excel页签信息
5、docProps/custom.xml,python保存的文件内容同样少太多,属性也要少几个
python处理系统保存的excel文件,程序编译时也会warning提示不识别_readonly、_change、_full-control几个属性
import warnings
warnings.filterwarnings("ignore")
#C:\Users\Administrator\AppData\Local\Programs\Python\Python39\lib\site-packages\openpyxl\packaging\custom.py:203: UserWarning: Unknown type for _readonly
# warn(f"Unknown type for {prop.name}")
#C:\Users\Administrator\AppData\Local\Programs\Python\Python39\lib\site-packages\openpyxl\packaging\custom.py:203: UserWarning: Unknown type for _change
# warn(f"Unknown type for {prop.name}")
#C:\Users\Administrator\AppData\Local\Programs\Python\Python39\lib\site-packages\openpyxl\packaging\custom.py:203: UserWarning: Unknown type for _full-control
# warn(f"Unknown type for {prop.name}")
6、xl目录下,python生成文件缺少了shareStrings.xml,该文件存放了列名信息
7、xl/worksheets下工作表xml文件,python保存的文件头部格式内容少,且整个xml文件组织结构差异较大
因此python保存的excel文件会有系统兼容性问题。
期待python社区能解决这个差异兼容性问题。