Openpyxl Workbook.save函数创建损坏且无法打开的Excel(.xlsx)文件

时间:2019-12-12 15:35:29

标签: python openpyxl

我曾尝试使用August William's solution来解决此问题,但这也没有用。我没有将工作簿类型(即.xlsm切换为.xlsx),这似乎是一个单独的问题。我浏览了Openpyxl's Manual,试图查找错误报告或错误修复,但无济于事。下面是我非常简单的代码。接下来是python错误消息,该错误消息导致创建了工作簿,但该工作簿已损坏且无法加载。任何帮助表示赞赏。 -谢谢!

from openpyxl import Workbook


dashbrd = Workbook()
fp = dashbrd.active
fp.title = 'Sheet Name Goes Here'

fp['A1'] = 'Header'
fp['B1'] = '2nd Header'
fp['C1'] = '3rd Header'
fp['D1'] = '4th Header'
fp['E1'] = '5th Header'
fp['F1'] = 'You get the idea'
fp['G1'] = 'Another Header'
fp['H1'] = 'Blah blah blah'
fp['I1'] = 'Yadda yadda yadda'

dashbrd.save("S:\\folder1\\folder2\\folder3\\MyBook.xlsx")


**************************************************************************************
Traceback (most recent call last):

File "C:\Users\NotaDirtyUser\Documents\Scripts\HeaderTest.py", line 26, in <module>
dashbrd.save("S:\\folder1\\folder2\\folder3\\MyBook.xlsx")
File "C:\ProgramData\Anaconda3\lib\site-packages\openpyxl\workbook\workbook.py", line 408, in save
save_workbook(self, filename)
File "C:\ProgramData\Anaconda3\lib\site-packages\openpyxl\writer\excel.py", line 293, in save_workbook
writer.save()
File "C:\ProgramData\Anaconda3\lib\site-packages\openpyxl\writer\excel.py", line 275, in save
self.write_data()
File "C:\ProgramData\Anaconda3\lib\site-packages\openpyxl\writer\excel.py", line 75, in write_data
self._write_worksheets()
File "C:\ProgramData\Anaconda3\lib\site-packages\openpyxl\writer\excel.py", line 215, in _write_worksheets
self.write_worksheet(ws)
File "C:\ProgramData\Anaconda3\lib\site-packages\openpyxl\writer\excel.py", line 200, in write_worksheet
writer.write()
File "C:\ProgramData\Anaconda3\lib\site-packages\openpyxl\worksheet\_writer.py", line 354, in write
self.write_top()
File "C:\ProgramData\Anaconda3\lib\site-packages\openpyxl\worksheet\_writer.py", line 98, in write_top
self.write_properties()
File "C:\ProgramData\Anaconda3\lib\site-packages\openpyxl\worksheet\_writer.py", line 60, in write_properties
self.xf.send(props.to_tree())
File "C:\ProgramData\Anaconda3\lib\site-packages\openpyxl\worksheet\_writer.py", line 294, in get_stream
xf.write(el)
File "src/lxml/serializer.pxi", line 1652, in lxml.etree._IncrementalFileWriter.write
TypeError: got invalid input value of type <class 'xml.etree.ElementTree.Element'>, expected string or Element

4 个答案:

答案 0 :(得分:1)

就像我上面说的一样,昨天我遇到了同样的问题..我在此链接中找到了解决方案:

https://python-forum.io/Thread-Need-help-in-understanding-this-particular-Traceback-TypeError

关于此错误: TypeError:输入类型,预期字符串或元素的输入值无效

总而言之,解决方案是将openpyxl安装到另一个版本:

pip uninstall openpyxl
pip install openpyxl==3.0.1

答案 1 :(得分:0)

我找不到很好的参考,但我记得偶然发现了相同的参考,解决方案是改用较旧的格式(.xls,这是一种完全不同的格式)。似乎是openpyxl的一般问题,目前尚未解决。

附加到.xlsx的有效方法(对我有用):

{ path: '*', redirect: '/' }

答案 2 :(得分:0)

同样的问题,我无法重新打开由openpyxl版本> 3创建的文件: 在3.0.3中: 充电器中的文件“ D:\ MyProg.py”,第251行, self.wbs = load_workbook(文件名= self.nomfichierXLSX) 在load_workbook的第314行,文件“ D:\ MyPython \ python3.8.2-x64 \ lib \ site-packages \ openpyxl \ reader \ excel.py” reader.read() 文件“ D:\ MyPython \ python3.8.2-x64 \ lib \ site-packages \ openpyxl \ reader \ excel.py”,第279行,处于读取状态 self.read_worksheets() read_worksheets中的文件“ D:\ MyPython \ python3.8.2-x64 \ lib \ site-packages \ openpyxl \ reader \ excel.py”,第227行 ws_parser.bind_all() 在bind_all中的文件“ D:\ MyPython \ python3.8.2-x64 \ lib \ site-packages \ openpyxl \ worksheet_reader.py”,行426 self.bind_cells() 在bind_cells中,行“ File:D:\ MyPython \ python3.8.2-x64 \ lib \ site-packages \ openpyxl \ worksheet_reader.py” 对于idx,self.parser.parse()中的行: 解析中的文件“ D:\ MyPython \ python3.8.2-x64 \ lib \ site-packages \ openpyxl \ worksheet_reader.py”,第153行 行= self.parse_row(element) 在parse_row中的第264行,文件“ D:\ MyPython \ python3.8.2-x64 \ lib \ site-packages \ openpyxl \ worksheet_reader.py” self.row_counter = int(attrs ['r']) ValueError:以10为底的int()的无效文字:'2.0'

attrs = {'r':'2.0'}不知道它来自哪里(但是openpyxl 3.0.3是保存工作表中的源),那么当您在int(attrs ['r']) _reader.py:崩溃!

解决方案回到2.6.4版本!

答案 3 :(得分:0)

回复自己!

openpyxl 3.0.3可以很好地工作,但是比2.6版本允许的少,这是我的测试代码,您必须将 int 放入row =,而不是 浮动

from openpyxl import __version__
from openpyxl import load_workbook
from openpyxl import Workbook


wbs = Workbook()
wbs.active.title = 'titi'
mycell=wbs['titi'].cell(row = 1.0, column = 1)
mycell.value=22
wbs.save('toto.xlsx')
print('openpyxl  __version__:',__version__)

wbi = load_workbook(filename='toto.xlsx')
for i in range(0,30):
    wbi['titi'].append([i,'tata'])
wbi.save('toto.xlsx')


# result1:
# openpyxl  __version__: 2.6.3


# result2:
# openpyxl  __version__: 3.0.3
# Traceback (most recent call last):
#   File "D:\Users\T0015039\Documents\Mes Outils Personnels\py\essais\crashxlsx.py", line 13, in <module>
#     wbi = load_workbook(filename='toto.xlsx')
#   File "D:\Users\T0015039\Documents\Mes Outils Personnels\python3.8.2_pyscripter3.6.3-x64\python3.8.2-x64\lib\site-packages\openpyxl\reader\excel.py", line 314, in load_workbook
#     reader.read()
#   File "D:\Users\T0015039\Documents\Mes Outils Personnels\python3.8.2_pyscripter3.6.3-x64\python3.8.2-x64\lib\site-packages\openpyxl\reader\excel.py", line 279, in read
#     self.read_worksheets()
#   File "D:\Users\T0015039\Documents\Mes Outils Personnels\python3.8.2_pyscripter3.6.3-x64\python3.8.2-x64\lib\site-packages\openpyxl\reader\excel.py", line 227, in read_worksheets
#     ws_parser.bind_all()
#   File "D:\Users\T0015039\Documents\Mes Outils Personnels\python3.8.2_pyscripter3.6.3-x64\python3.8.2-x64\lib\site-packages\openpyxl\worksheet\_reader.py", line 426, in bind_all
#     self.bind_cells()
#   File "D:\Users\T0015039\Documents\Mes Outils Personnels\python3.8.2_pyscripter3.6.3-x64\python3.8.2-x64\lib\site-packages\openpyxl\worksheet\_reader.py", line 337, in bind_cells
#     for idx, row in self.parser.parse():
#   File "D:\Users\T0015039\Documents\Mes Outils Personnels\python3.8.2_pyscripter3.6.3-x64\python3.8.2-x64\lib\site-packages\openpyxl\worksheet\_reader.py", line 153, in parse
#     row = self.parse_row(element)
#   File "D:\Users\T0015039\Documents\Mes Outils Personnels\python3.8.2_pyscripter3.6.3-x64\python3.8.2-x64\lib\site-packages\openpyxl\worksheet\_reader.py", line 264, in parse_row
#     self.row_counter = int(attrs['r'])
# ValueError: invalid literal for int() with base 10: '1.0'
相关问题