definedName with no value causes unhandled TypeError
In some cases there can be invalid definedName elements in an xlsx file. In this particular case I converted an xlsb using libreoffice, and it produced the following tag in the workbook.xml. Which is missing the actual range for the element. I'm not sure how forgiving openpyxl should be in this case, but it seems like the easiest fix would be to just ignore definedName tags that have no inner text.
Broken example of definedNames
<definedNames>
<definedName function="false" hidden="false" localSheetId="0" name="ID" vbProcedure="false"/>
<definedName function="false" hidden="false" localSheetId="0" name="_xlnm.Print_Area" vbProcedure="false"/>
<definedName function="false" hidden="false" localSheetId="0" name="_xlnm.Print_Titles" vbProcedure="false"/>
<definedName function="false" hidden="false" localSheetId="2" name="ID" vbProcedure="false"/>
<definedName function="false" hidden="false" localSheetId="2" name="_xlnm.Print_Area" vbProcedure="false"/>
<definedName function="false" hidden="false" localSheetId="2" name="_xlnm.Print_Titles" vbProcedure="false"/>
<definedName function="false" hidden="false" localSheetId="3" name="ID" vbProcedure="false"/>
<definedName function="false" hidden="false" localSheetId="3" name="_xlnm.Print_Area" vbProcedure="false"/>
<definedName function="false" hidden="false" localSheetId="3" name="_xlnm.Print_Titles" vbProcedure="false"/>
<definedName function="false" hidden="false" localSheetId="4" name="ID" vbProcedure="false"/>
<definedName function="false" hidden="false" localSheetId="4" name="_xlnm.Print_Area" vbProcedure="false"/>
<definedName function="false" hidden="false" localSheetId="4" name="_xlnm.Print_Titles" vbProcedure="false"/>
</definedNames>
Working definedNames
<definedNames>
<definedName function="false" hidden="false" localSheetId="0" name="_xlnm.Print_Area" vbProcedure="false">Sheet1!$D$8:$F$13</definedName>
</definedNames>
Stack trace
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
/tmp/ipykernel_1324209/96275939.py in <module>
----> 1 wb = openpyxl.load_workbook("xlsb_conversion.xlsx", data_only=True, keep_links=False)
~/.local/lib/python3.9/site-packages/openpyxl/reader/excel.py in load_workbook(filename, read_only, keep_vba, data_only, keep_links)
315 reader = ExcelReader(filename, read_only, keep_vba,
316 data_only, keep_links)
--> 317 reader.read()
318 return reader.wb
~/.local/lib/python3.9/site-packages/openpyxl/reader/excel.py in read(self)
281 apply_stylesheet(self.archive, self.wb)
282 self.read_worksheets()
--> 283 self.parser.assign_names()
284 if not self.read_only:
285 self.archive.close()
~/.local/lib/python3.9/site-packages/openpyxl/reader/workbook.py in assign_names(self)
106 sheet.print_title_cols = cols
107 elif reserved == "Print_Area":
--> 108 sheet.print_area = _unpack_print_area(defn)
109 else:
110 defns.append(defn)
~/.local/lib/python3.9/site-packages/openpyxl/workbook/defined_name.py in _unpack_print_area(defn)
56 """
57 new = []
---> 58 for m in SHEETRANGE_RE.finditer(defn.value): # can be multiple
59 coord = m.group("cells")
60 if coord:
TypeError: expected string or bytes-like object