使用openpyxl/Pandas读取Excel文件报错无效XML,求解决方案
使用openpyxl读取Excel 2016文件时遇到XML无效错误
我用Python的openpyxl库读取Excel 2016文件,代码如下:
import openpyxl input_file = openpyxl.load_workboork(r"C:\Something...\input.xlsx", data_only=True) input_sheet = input_file["Sheet01"]
设置data_only=True是为了读取Excel中的日期时间格式及标准格式,但运行代码后出现如下错误:
Traceback (most recent call last): File "C:\Something...\main.py", line 2, in <module> input_file = openpyxl.load_workboork(r"C:\Something...\input.xlsx", data_only=True) File "C:\Something...\venv\lib\site-packages\openpyxl\reader\excel.py", line 346, in load_workbook reader.read() File "C:\Something...\venv\lib\site-packages\openpyxl\reader\excel.py", line 307, in read raise ValueError(ValueError: Unable to read workbook: could not read worksheets from C:\Something...\input.xlsx This is most probably because the workbook source files contain some invalid XML.
已尝试以下操作:
- 确认openpyxl库为最新版本;
- 移除文件中所有过滤器及多余格式;
- 打开并修复文件后重新保存;
- 文件规模约2800行、52列,仅使用文本、数字、日期时间等标准格式;
- 使用Pandas读取该文件时也出现类似错误。
推测问题出在文件或库,但Pandas也无法读取,目前毫无头绪,因隐私无法提供文件,恳请帮助。
解决建议
修正代码拼写错误
你的代码中load_workboork是拼写错误,正确应为load_workbook,先修正这个低级错误后重试。转换文件格式
.xlsx是基于XML的压缩格式,可能存在隐藏损坏。尝试:- 将文件另存为Excel二进制工作簿(.xlsb),再用对应方式读取:
# openpyxl读取xlsb from openpyxl import load_workbook wb = load_workbook("input.xlsb", data_only=True, read_only=True) # pandas读取xlsb(需先安装pyxlsb:pip install pyxlsb) import pandas as pd df = pd.read_excel("input.xlsb", engine="pyxlsb") - 直接将工作表导出为CSV格式,用pandas读取:
df = pd.read_csv("input.csv", parse_dates=True)
- 将文件另存为Excel二进制工作簿(.xlsb),再用对应方式读取:
清理文件内容
即使是标准格式,也可能存在特殊字符导致XML解析失败:- 全选工作表内容,右键选择选择性粘贴->值,复制到新的空白Excel文件中保存后重试;
- 使用Excel的"查找和替换"功能,清除非打印字符(查找内容输入
^,替换为空)。
换用其他读取库
- 用
xlrd(仅支持.xls,需安装旧版本:pip install xlrd==1.2.0):import xlrd wb = xlrd.open_workbook(r"C:\Something...\input.xlsx") sheet = wb.sheet_by_name("Sheet01") - 用
win32com.client(Windows环境可用,直接调用Excel应用):import win32com.client excel = win32com.client.Dispatch("Excel.Application") wb = excel.Workbooks.Open(r"C:\Something...\input.xlsx") ws = wb.Worksheets("Sheet01") # 示例:获取A1单元格值 print(ws.Cells(1,1).Value) wb.Close() excel.Quit()
- 用
内容的提问来源于stack exchange,提问作者Firat
相关产品推荐
相关产品推荐

