openpyxl 3.1.2 will not open workbook with PrintTitles set to "#N/A"
Version in use "version": "==3.1.2"
openpyxl 3.1.2
raises error when we try to load a workbook with PrintTitles
set as #N/A
. This workbook was created using openpyxl 3.0.9
. This seems like a backwards compatibility issue.
How to Reproduce
First create a workbook using openpyxl 3.0.9
with PrintTitles
set as #N/A
:
from openpyxl.workbook.defined_name import DefinedName
from openpyxl import Workbook
wb = Workbook()
print_titles = DefinedName(name='_xlnm.Print_Titles', attr_text='#N/A')
print_titles.localSheetId = 0
wb.defined_names.append(print_titles)
wb.save('file_path.xlsx')
Loading the above workbook using openpyxl 3.0.9
works fine:
# Works fine
wb = openpyxl.load_workbook('file_path.xlsx')
Loading the above workbook using openpyxl 3.1.2
raises following error:
wb = openpyxl.load_workbook('file_path.xlsx')
File .../python3.11/site-packages/openpyxl/reader/excel.py:303, in ExcelReader.read(self)
302 action = "assign names"
--> 303 self.parser.assign_names()
304 if not self.read_only:
File .../python-3.11/std/lib64/python3.11/site-packages/openpyxl/reader/workbook.py:111, in WorkbookParser.assign_names(self)
110 elif reserved == "Print_Titles":
--> 111 titles = PrintTitles.from_string(defn.value)
112 sheet._print_rows = titles.rows
File .../python3.11/site-packages/openpyxl/worksheet/print_settings.py:121, in PrintTitles.from_string(cls, value)
120 if not kw:
--> 121 raise ValueError(f"{value} is not a valid print titles definition")
123 cols = rows = None
ValueError: #N/A is not a valid print titles definition
The above exception was the direct cause of the following exception:
ValueError Traceback (most recent call last)
Cell In[1], line 1
----> 1 wb = openpyxl.load_workbook('file_path.xlsx')
File .../python3.11/site-packages/openpyxl/reader/excel.py:346, in load_workbook(filename, read_only, keep_vba, data_only, keep_links, rich_text)
316 """Open the given filename and return the workbook
317
318 :param filename: the path to open or a file-like object
(...)
342
343 """
344 reader = ExcelReader(filename, read_only, keep_vba,
345 data_only, keep_links, rich_text)
--> 346 reader.read()
347 return reader.wb
File .../python3.11/site-packages/openpyxl/reader/excel.py:307, in ExcelReader.read(self)
305 self.archive.close()
306 except ValueError as e:
--> 307 raise ValueError(
308 f"Unable to read workbook: could not {action} from {self.archive.filename}.\n"
309 "This is most probably because the workbook source files contain some invalid XML.\n"
310 "Please see the exception for more details."
311 ) from e
ValueError: Unable to read workbook: could not assign names from file_path.xlsx.
This is most probably because the workbook source files contain some invalid XML.
Please see the exception for more details.