使用openpyxl模块写入电子表格创build一个损坏的电子表格,如何解决zipfile模块?
我有一个使用openpyxl
写入电子表格的openpyxl
。 执行程序后,单元格按预期填充,但电子表格已损坏。 Excel修复电子表格,然后我可以再次查看它。
import openpyxl from openpyxl import load_workbook amounts, row = [1, 2, 3, 4, 5], 2 book = load_workbook("output.xlsx") sheet = book.active for i, value in enumerate(amounts): sheet.cell(column=i+1, row=row, value=value) print ("Sheet updating complete.") book.save("output.xlsx")
我曾尝试使用Microsoft的Open XML SDK生产力工具来比较一个好的和不好的文件,并注意styles.xml
是缺less的。 我尝试使用从另一个问题获得的以下源代码复制这个,但它并没有解决我的问题。
import zipfile with zipfile.ZipFile('outputcopy.xlsx', 'r') as zgood: styles_xml = zgood.read('xl/styles.xml') with zipfile.ZipFile('output.xlsx', 'a') as zbad: zbad.writestr('xl/styles.xml', styles_xml)
我可以从Excel生成的修复日志中确认,问题在于xl/styles.xml
。 我需要将这个xml文件从好的副本复制到坏的副本。
我怎样才能得到复制的xl/styles.xml
文件,使程序可以运行而不损坏output.xlsx
?
我已经做了另一个尝试解决这个问题。 如果不能从另一个Excel文件复制styles.xml
, 在book.save("output.xlsx")
之前,我已经从output.xlsx
打开了styles.xml
。 保存之后,我再从save语句之前获取styles.xml
,并写入它。 不幸的是,这并没有改变任何东西,我仍然得到一个损坏的Excel文件。 有了这个尝试,我的testing代码如下所示:
import openpyxl import zipfile from openpyxl import load_workbook amounts, indexValue, row = [1, 2, 3, 4, 5], 0, 2 book = load_workbook("output.xlsx") sheet = book.active for i, value in enumerate(amounts): sheet.cell(column=i+1, row=row, value=value) print ("Sheet updating complete.") with zipfile.ZipFile('output.xlsx', 'r') as zgood: styles_xml = zgood.read('xl/styles.xml') book.save("output.xlsx") with zipfile.ZipFile('output.xlsx', 'a') as zbad: zbad.writestr('xl/styles.xml', styles_xml)
我已经尝试保存为一个全新的Excel文件,但仍然有相同的问题。 我尝试使用zip file
从output.xlsx
打开并写入新保存的文件,但仍然没有结果。
import openpyxl import zipfile from openpyxl import load_workbook amounts, indexValue, row, cell = [1, 2, 3, 4, 5], 0, 2, "A2" book = load_workbook("output.xlsx") sheet = book.active while indexValue != 5: sheet[cell] = amounts[indexValue] indexValue += 1 cell = chr(ord(cell[0]) + 1) + str(cell[1]) print ("Sheet updating complete.") book.save("test.xlsx") with zipfile.ZipFile('output.xlsx', 'r') as zgood: styles_xml = zgood.read('xl/styles.xml') with zipfile.ZipFile('test.xlsx', 'a') as zbad: zbad.writestr('xl/styles.xml', styles_xml)
虽然我已经解决了这个问题,但值得注意的是这个问题似乎只在加载工作簿时才会发生。 我用电子表格创build了另一个程序,创build一个工作簿,而不是加载它。 由此,电子表格不会保存损坏。
在确认问题出现在styles.xml
,我发现问题最可能是写入单元格的样式格式。 通过使用openpyxl
模块的styles
,我已经解决了这个问题。
在这种情况下,我声明了一个variablesfontStyle
,并设置了所有样式设置:
fontStyle = Font(name="Calibri", size=12, color=colors.BLACK)
当为每个单元格写入amounts
,我还使用fontStyle
设置了这些单元格的样式:
sheet[cell].font = fontStyle
完成的代码如下所示:
import openpyxl from openpyxl import load_workbook from openpyxl.styles import colors from openpyxl.styles import Font, Color fontStyle = Font(name="Calibri", size=12, color=colors.BLACK) amounts, indexValue, cell = [1, 2, 3, 4, 5], 0, "A2" book = load_workbook("output.xlsx") sheet = book.active while indexValue != 5: sheet[cell] = amounts[indexValue] sheet[cell].font = fontStyle indexValue += 1 cell = chr(ord(cell[0]) + 1) + str(cell[1]) print ("Sheet updating complete.") book.save("output.xlsx")
我相信这是有效的,因为写作方法没有默认的样式设置。 这将解释为什么styles.xml
在使用Open XML SDK生产力工具时缺失。 修复后再次检查此Excel文件后,我可以确认styles.xml
不再缺失。
文件保存后不再损坏,可以正常打开。 另外,我现在可以执行这个脚本再次写入Excel文件,而不必打开和closures来修复它。
请注意,我也改变了我的循环从原来的循环 – 作为我的一个尝试解决这个问题的一部分。 这对最后的结果没有影响 – 这完全取决于所写单元格的样式。
这并不能完全回答解决问题的具体问题,但它确实解决了问题。