首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用openpyxl模块写入电子表格会产生损坏的电子表格,如何修复zipfile模块?

使用openpyxl模块写入电子表格会产生损坏的电子表格,如何修复zipfile模块?
EN

Stack Overflow用户
提问于 2017-01-30 03:26:21
回答 1查看 4.7K关注 0票数 9

我有一个使用openpyxl写入电子表格的程序。在执行程序时,单元格会按预期填充,但电子表格会损坏。Excel修复了电子表格,然后我可以再次查看它。

代码语言:javascript
复制
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")

我尝试使用微软的Open XML SDK Productivity工具来比较好的和坏的文件,发现缺少styles.xml。我尝试使用我从另一个问题中获得的以下源代码来复制它,但它不能为我解决问题。

代码语言:javascript
复制
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文件从好的副本复制到坏的副本。

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

我已经做了另一次尝试来解决这个问题。在不能从不同的styles.xml文件中复制styles.xml的可能性很小;在book.save("output.xlsx")之前,我已经从output.xlsx打开了book.save("output.xlsx")。保存后,我从save语句之前获取styles.xml,并编写它。不幸的是,这并没有改变任何事情,我仍然得到一个损坏的Excel文件。通过这种尝试,我的测试代码如下所示:

代码语言:javascript
复制
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 fileoutput.xlsx打开并写入新保存的文件,但仍然没有结果。

代码语言:javascript
复制
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)

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-02-02 22:48:22

在确认问题与styles.xml有关后,我发现问题很可能与写入单元格的样式格式有关。通过从openpyxl模块使用styles,我已经修复了这个问题。

我声明了一个变量,在本例中为fontStyle,并设置了所有样式设置:

代码语言:javascript
复制
fontStyle = Font(name="Calibri", size=12, color=colors.BLACK)

在向每个单元格写入amounts时,我还使用fontStyle设置了这些单元格的样式

代码语言:javascript
复制
sheet[cell].font = fontStyle

完成的代码如下所示:

代码语言:javascript
复制
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生产力工具时缺少styles.xml。在修复后再次检查此Excel文件时,我可以确认styles.xml不再丢失。

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

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

这并不能确切地回答具体使用zipfile解决问题的问题,但它确实解决了问题。

票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41925006

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档