Openpyxl Workbook.save 函数创建损坏且无法打开的 Excel (.xlsx) 文件
Openpyxl Workbook.save function creates a corrupt and un-openable Excel (.xlsx) file
我曾尝试使用 to this issue, but that also didn't work. I am not switching workbook types, i.e. .xlsm to .xlsx, which appears to be a separate issue. I have looked through 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
我找不到很好的参考,但我记得曾经偶然发现过同样的东西,解决方案是改用旧格式(.xls,这是一种完全不同的格式)。似乎是目前尚未解决的 openpyxl 的一般问题。
一种附加到 .xlsx 的工作方式(对我有用):
from openpyxl import load_workbook
writer = pd.ExcelWriter(filename, engine='openpyxl')
try:
# try to open an existing workbook
writer.book = load_workbook(filename)
# get the last row in the existing Excel sheet
# if it was not specified explicitly
if startrow is None and sheet_name in writer.book.sheetnames:
startrow = writer.book[sheet_name].max_row
# truncate sheet
if truncate_sheet and sheet_name in writer.book.sheetnames:
# index of [sheet_name] sheet
idx = writer.book.sheetnames.index(sheet_name)
# remove [sheet_name]
writer.book.remove(writer.book.worksheets[idx])
# create an empty sheet [sheet_name] using old index
writer.book.create_sheet(sheet_name, idx)
# copy existing sheets
writer.sheets = {ws.title: ws for ws in writer.book.worksheets}
except FileNotFoundError:
# file does not exist yet, we will create it
pass
if startrow is None:
startrow = 0
# write out the new sheet
df.to_excel(writer, sheet_name, startrow=startrow, **to_excel_kwargs)
# save the workbook
writer.save()
就像我上面说的,昨天我遇到了同样的问题..我在这个 link:
中找到了解决方案
https://python-forum.io/Thread-Need-help-in-understanding-this-particular-Traceback-TypeError
关于此错误:
TypeError: 得到无效的类型输入值,预期的字符串或元素
总之,解决方案是将 openpyxl 安装到另一个版本:
pip uninstall openpyxl
pip install openpyxl==3.0.1
同样的问题,我无法重新打开由 openpyxl 版本 > 3 创建的文件:
在 3.0.3 中:
文件 "D:\MyProg.py",第 251 行,在 chargerSynthese 中
self.wbs = load_workbook(文件名=self.nomfichierXLSX)
文件 "D:\MyPython\python3.8.2-x64\lib\site-packages\openpyxl\reader\excel.py",第 314 行,在 load_workbook 中
reader.read()
文件 "D:\MyPython\python3.8.2-x64\lib\site-packages\openpyxl\reader\excel.py",第 279 行,已读
self.read_worksheets()
文件 "D:\MyPython\python3.8.2-x64\lib\site-packages\openpyxl\reader\excel.py",第 227 行,在 read_worksheets 中
ws_parser.bind_all()
文件 "D:\MyPython\python3.8.2-x64\lib\site-packages\openpyxl\worksheet_reader.py",第 426 行,在 bind_all 中
self.bind_cells()
文件 "D:\MyPython\python3.8.2-x64\lib\site-packages\openpyxl\worksheet_reader.py",第 337 行,在 bind_cells 中
对于 idx,self.parser.parse() 中的行:
文件 "D:\MyPython\python3.8.2-x64\lib\site-packages\openpyxl\worksheet_reader.py",第 153 行,正在解析中
行 = self.parse_row(元素)
文件 "D:\MyPython\python3.8.2-x64\lib\site-packages\openpyxl\worksheet_reader.py",第 264 行,在 parse_row 中
self.row_counter = int(属性['r'])
ValueError:以 10 为底的 int() 的无效文字:'2.0'
attrs={'r':'2.0'} 不知道它来自哪里(但起源于 openpyxl 3.0.3 的保存工作表)然后当你这样做时 int(attrs['r']) 在 _reader.py 中:崩溃!
解回2.6.4版本!
回复我自己!
openpyxl 3.0.3 运行良好但不如 2.6 版本宽松,这是我的测试代码,您必须将 int 放在行中= ,而不是 浮动
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'
我曾尝试使用
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
我找不到很好的参考,但我记得曾经偶然发现过同样的东西,解决方案是改用旧格式(.xls,这是一种完全不同的格式)。似乎是目前尚未解决的 openpyxl 的一般问题。
一种附加到 .xlsx 的工作方式(对我有用):
from openpyxl import load_workbook
writer = pd.ExcelWriter(filename, engine='openpyxl')
try:
# try to open an existing workbook
writer.book = load_workbook(filename)
# get the last row in the existing Excel sheet
# if it was not specified explicitly
if startrow is None and sheet_name in writer.book.sheetnames:
startrow = writer.book[sheet_name].max_row
# truncate sheet
if truncate_sheet and sheet_name in writer.book.sheetnames:
# index of [sheet_name] sheet
idx = writer.book.sheetnames.index(sheet_name)
# remove [sheet_name]
writer.book.remove(writer.book.worksheets[idx])
# create an empty sheet [sheet_name] using old index
writer.book.create_sheet(sheet_name, idx)
# copy existing sheets
writer.sheets = {ws.title: ws for ws in writer.book.worksheets}
except FileNotFoundError:
# file does not exist yet, we will create it
pass
if startrow is None:
startrow = 0
# write out the new sheet
df.to_excel(writer, sheet_name, startrow=startrow, **to_excel_kwargs)
# save the workbook
writer.save()
就像我上面说的,昨天我遇到了同样的问题..我在这个 link:
中找到了解决方案https://python-forum.io/Thread-Need-help-in-understanding-this-particular-Traceback-TypeError
关于此错误: TypeError: 得到无效的类型输入值,预期的字符串或元素
总之,解决方案是将 openpyxl 安装到另一个版本:
pip uninstall openpyxl
pip install openpyxl==3.0.1
同样的问题,我无法重新打开由 openpyxl 版本 > 3 创建的文件: 在 3.0.3 中: 文件 "D:\MyProg.py",第 251 行,在 chargerSynthese 中 self.wbs = load_workbook(文件名=self.nomfichierXLSX) 文件 "D:\MyPython\python3.8.2-x64\lib\site-packages\openpyxl\reader\excel.py",第 314 行,在 load_workbook 中 reader.read() 文件 "D:\MyPython\python3.8.2-x64\lib\site-packages\openpyxl\reader\excel.py",第 279 行,已读 self.read_worksheets() 文件 "D:\MyPython\python3.8.2-x64\lib\site-packages\openpyxl\reader\excel.py",第 227 行,在 read_worksheets 中 ws_parser.bind_all() 文件 "D:\MyPython\python3.8.2-x64\lib\site-packages\openpyxl\worksheet_reader.py",第 426 行,在 bind_all 中 self.bind_cells() 文件 "D:\MyPython\python3.8.2-x64\lib\site-packages\openpyxl\worksheet_reader.py",第 337 行,在 bind_cells 中 对于 idx,self.parser.parse() 中的行: 文件 "D:\MyPython\python3.8.2-x64\lib\site-packages\openpyxl\worksheet_reader.py",第 153 行,正在解析中 行 = self.parse_row(元素) 文件 "D:\MyPython\python3.8.2-x64\lib\site-packages\openpyxl\worksheet_reader.py",第 264 行,在 parse_row 中 self.row_counter = int(属性['r']) ValueError:以 10 为底的 int() 的无效文字:'2.0'
attrs={'r':'2.0'} 不知道它来自哪里(但起源于 openpyxl 3.0.3 的保存工作表)然后当你这样做时 int(attrs['r']) 在 _reader.py 中:崩溃!
解回2.6.4版本!
回复我自己!
openpyxl 3.0.3 运行良好但不如 2.6 版本宽松,这是我的测试代码,您必须将 int 放在行中= ,而不是 浮动
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'