Openpyxl Workbook.save function creates a corrupt and un-openable Excel (.xlsx) file

Question:

I have tried using August William’s solution 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 trying to find maybe a bug report or bug fix, but to no avail. The below is my very simple code. Following that is the python error message which results in a workbook being created, but it is corrupted and fails to load. Any help is appreciated.
-Thanks!!

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:UsersNotaDirtyUserDocumentsScriptsHeaderTest.py", line 26, in <module>
dashbrd.save("S:\folder1\folder2\folder3\MyBook.xlsx")
File "C:ProgramDataAnaconda3libsite-packagesopenpyxlworkbookworkbook.py", line 408, in save
save_workbook(self, filename)
File "C:ProgramDataAnaconda3libsite-packagesopenpyxlwriterexcel.py", line 293, in save_workbook
writer.save()
File "C:ProgramDataAnaconda3libsite-packagesopenpyxlwriterexcel.py", line 275, in save
self.write_data()
File "C:ProgramDataAnaconda3libsite-packagesopenpyxlwriterexcel.py", line 75, in write_data
self._write_worksheets()
File "C:ProgramDataAnaconda3libsite-packagesopenpyxlwriterexcel.py", line 215, in _write_worksheets
self.write_worksheet(ws)
File "C:ProgramDataAnaconda3libsite-packagesopenpyxlwriterexcel.py", line 200, in write_worksheet
writer.write()
File "C:ProgramDataAnaconda3libsite-packagesopenpyxlworksheet_writer.py", line 354, in write
self.write_top()
File "C:ProgramDataAnaconda3libsite-packagesopenpyxlworksheet_writer.py", line 98, in write_top
self.write_properties()
File "C:ProgramDataAnaconda3libsite-packagesopenpyxlworksheet_writer.py", line 60, in write_properties
self.xf.send(props.to_tree())
File "C:ProgramDataAnaconda3libsite-packagesopenpyxlworksheet_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
Asked By: AJames

||

Answers:

I can’t find a good reference, but I recall having stumbled upon the same, and the solution was to use the older format (.xls, which is a completely different format) instead. Seems like a generic problem of openpyxl that wasn’t resolved at the moment.

A working way to append to .xlsx (works for me):

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()
Answered By: Oleg O

Like I said above , yesterday I had the same problem ..I found the solution in this link:

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

In reference to this error :
TypeError: got invalid input value of type , expected string or Element

In summary the solution was to install openpyxl to another version :

pip uninstall openpyxl
pip install openpyxl==3.0.1
Answered By: GiovaniSalazar

same problem for me not able to reopen a file created by openpyxl version > 3:
in 3.0.3:
File “D:MyProg.py”, line 251, in chargerSynthese
self.wbs = load_workbook(filename=self.nomfichierXLSX)
File “D:MyPythonpython3.8.2-x64libsite-packagesopenpyxlreaderexcel.py”, line 314, in load_workbook
reader.read()
File “D:MyPythonpython3.8.2-x64libsite-packagesopenpyxlreaderexcel.py”, line 279, in read
self.read_worksheets()
File “D:MyPythonpython3.8.2-x64libsite-packagesopenpyxlreaderexcel.py”, line 227, in read_worksheets
ws_parser.bind_all()
File “D:MyPythonpython3.8.2-x64libsite-packagesopenpyxlworksheet_reader.py”, line 426, in bind_all
self.bind_cells()
File “D:MyPythonpython3.8.2-x64libsite-packagesopenpyxlworksheet_reader.py”, line 337, in bind_cells
for idx, row in self.parser.parse():
File “D:MyPythonpython3.8.2-x64libsite-packagesopenpyxlworksheet_reader.py”, line 153, in parse
row = self.parse_row(element)
File “D:MyPythonpython3.8.2-x64libsite-packagesopenpyxlworksheet_reader.py”, line 264, in parse_row
self.row_counter = int(attrs[‘r’])
ValueError: invalid literal for int() with base 10: ‘2.0’

attrs={‘r’:’2.0′} don’t know where it come from (but origin in a save worksheet by openpyxl 3.0.3) then when you do this int(attrs[‘r’]) in _reader.py: crash!

solution back to 2.6.4 version!

Answered By: user2232784

reply to myself!

openpyxl 3.0.3 works well but is less permissive than 2.6 versions, here is my test code you must put int in row= , not float

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:UsersT0015039DocumentsMes Outils Personnelspyessaiscrashxlsx.py", line 13, in <module>
#     wbi = load_workbook(filename='toto.xlsx')
#   File "D:UsersT0015039DocumentsMes Outils Personnelspython3.8.2_pyscripter3.6.3-x64python3.8.2-x64libsite-packagesopenpyxlreaderexcel.py", line 314, in load_workbook
#     reader.read()
#   File "D:UsersT0015039DocumentsMes Outils Personnelspython3.8.2_pyscripter3.6.3-x64python3.8.2-x64libsite-packagesopenpyxlreaderexcel.py", line 279, in read
#     self.read_worksheets()
#   File "D:UsersT0015039DocumentsMes Outils Personnelspython3.8.2_pyscripter3.6.3-x64python3.8.2-x64libsite-packagesopenpyxlreaderexcel.py", line 227, in read_worksheets
#     ws_parser.bind_all()
#   File "D:UsersT0015039DocumentsMes Outils Personnelspython3.8.2_pyscripter3.6.3-x64python3.8.2-x64libsite-packagesopenpyxlworksheet_reader.py", line 426, in bind_all
#     self.bind_cells()
#   File "D:UsersT0015039DocumentsMes Outils Personnelspython3.8.2_pyscripter3.6.3-x64python3.8.2-x64libsite-packagesopenpyxlworksheet_reader.py", line 337, in bind_cells
#     for idx, row in self.parser.parse():
#   File "D:UsersT0015039DocumentsMes Outils Personnelspython3.8.2_pyscripter3.6.3-x64python3.8.2-x64libsite-packagesopenpyxlworksheet_reader.py", line 153, in parse
#     row = self.parse_row(element)
#   File "D:UsersT0015039DocumentsMes Outils Personnelspython3.8.2_pyscripter3.6.3-x64python3.8.2-x64libsite-packagesopenpyxlworksheet_reader.py", line 264, in parse_row
#     self.row_counter = int(attrs['r'])
# ValueError: invalid literal for int() with base 10: '1.0'
Answered By: user2232784

same problem with me with openpyxl 2.0.2 version. I uninstalled and reinstalled 2.0.10 and add it into my projec

Answered By: Sanjit Routray
Categories: questions Tags: ,
Answers are sorted by their score. The answer accepted by the question owner as the best is marked with
at the top-right corner.