使用openpyxl模块写入电子表格会创建一个损坏的电子表格,如何修复zipfile模块?

Aug*_*ams 7 python excel zipfile python-3.x 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")
Run Code Online (Sandbox Code Playgroud)

我尝试使用Microsoft的Open XML SDK Productivity Tool来比较好的和坏的文件,并注意到它styles.xml丢失了.我尝试使用我从另一个问题中获得的以下源代码复制它,但它并没有为我解决问题.

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)
Run Code Online (Sandbox Code Playgroud)

我可以从Excel生成的修复日志中确认,问题出在哪里xl/styles.xml.我需要将这个xml文件从好副本复制到坏副本.

如何xl/styles.xml复制文件以便程序可以在不损坏的情况下运行output.xlsx

我已经再次尝试解决这个问题.在styles.xml无法从不同的Excel文件中复制的概率; 我styles.xml从前开output.xlsxbook.save("output.xlsx").保存之后,我会styles.xml在save语句之前获取from,然后编写它.不幸的是,这没有改变任何东西,我仍然得到一个损坏的Excel文件.通过此尝试,我的测试代码如下所示:

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)
Run Code Online (Sandbox Code Playgroud)

我试过保存为一个全新的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)
Run Code Online (Sandbox Code Playgroud)

虽然我已经解决了这个问题,但值得注意的是,只有在加载工作簿时才会出现此问题.我用电子表格创建了另一个程序来创建工作簿,而不是加载它.因此,电子表格不会保存损坏.

Aug*_*ams 8

在确认问题出现之后styles.xml,我发现问题最有可能是写入单元格的样式格式.通过使用stylesopenpyxl模块,我已经解决了这个问题.

fontStyle在这种情况下,我声明一个变量,并设置所有样式设置:

fontStyle = Font(name="Calibri", size=12, color=colors.BLACK)
Run Code Online (Sandbox Code Playgroud)

写入amounts每个单元格时,我还使用以下方法设置这些单元格的样式fontStyle:

sheet[cell].font = fontStyle
Run Code Online (Sandbox Code Playgroud)

完成的代码如下所示:

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")
Run Code Online (Sandbox Code Playgroud)

我相信这是有效的,因为写入方法没有默认样式设置.这可以解释styles.xml使用Open XML SDK Productivity Tool时缺少的原因.在修复后再次检查此Excel文件时,我可以确认styles.xml不再缺失.

保存后文件不再损坏,可以再次正常打开.此外,我现在能够执行此脚本再次写入Excel文件,而无需打开和关闭以修复它.

请注意,我还从原始循环中更改了循环 - 这是我尝试解决问题的一部分.这对最终结果没有影响 - 这完全取决于所写单元格的样式.

这并没有完全回答具体解决问题的问题,zipfile但确实解决了问题.