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

时间:2017-01-29 19:26:21

标签: python excel python-3.x openpyxl zipfile

我有一个使用 DELIMITER // CREATE PROCEDURE Adda( Name varCHAR(45),Surrname varCHAR(45),City varCHAR(45),PhoneNumber varCHAR(45),photo varCHAR(45)) BEGIN START TRANSACTION; INSERT INTO Personal(Name,Surrname) VALUES(Name,Surrname); INSERT INTO Addres(Id_Personal_Address,Country, City) VALUES(LAST_INSERT_ID(),Country,City); --i think here i should assign LAST_INSER_ID to variable INSERT INTO Images(Id_Personal_Address,photo) VALUES(Photo); -- and here use it COMMIT; END// DELIMITER ; 写入电子表格的程序。执行程序后,单元格按预期填充,但电子表格会损坏。 Excel修复电子表格,然后我可以再次查看它。

openpyxl

我尝试使用Microsoft的Open XML SDK Productivity Tool将好的和坏的文件相互比较,并注意到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") 丢失了。我尝试使用我从另一个问题中获得的以下源代码复制它,但它并没有为我解决问题。

styles.xml

我可以从Excel生成的修复日志中确认问题出在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) 。我需要将这个xml文件从好副本复制到坏副本。

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

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

styles.xml

我尝试将其另存为全新的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) zip file打开并写入新保存的文件,但仍然没有结果。

output.xlsx

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

1 个答案:

答案 0 :(得分:4)

在确认问题出现在styles.xml后,我发现问题很可能与写入单元格的样式格式有关。通过使用styles模块中的openpyxl,我已解决了此问题。

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

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")

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

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

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

这并没有完全回答用zipfile专门解决问题的问题,但确实解决了这个问题。