XML重命名为XLS可在Excel打开,Python无法读取怎么转换为有效XLS/XLSX?
解决SpreadsheetML转标准XLS/XLSX的问题
首先得明确:你改后缀成XLS的文件其实是Microsoft Office SpreadsheetML格式——这是一种基于XML的旧版Excel文件格式,Excel能识别它,但xlrd/openpyxl这类库只支持标准的二进制XLS(.xls)和OOXML格式的XLSX(.xlsx),所以直接读不了。下面给你几个可行的解决方案:
方法1:用Excel COM自动化转换(Windows环境)
这是最稳妥的方法,因为Excel本身能完美解析这种XML格式,我们可以用Python调用Excel的API来完成转换:
import os import win32com.client as win32 def convert_spreadsheetml_to_xlsx(xml_path, output_xlsx_path): # 启动Excel应用 excel = win32.gencache.EnsureDispatch('Excel.Application') excel.Visible = False # 后台运行,不显示界面 try: # 打开XML文件(Excel会自动识别SpreadsheetML格式) workbook = excel.Workbooks.Open(os.path.abspath(xml_path)) # 保存为标准XLSX格式 workbook.SaveAs(os.path.abspath(output_xlsx_path), FileFormat=51) # 51对应XLSX格式 workbook.Close() finally: # 退出Excel,释放资源 excel.Quit() # 使用示例 BASE_DIR = os.path.dirname(os.path.abspath(__file__)) convert_spreadsheetml_to_xlsx(os.path.join(BASE_DIR, "111.xml"), os.path.join(BASE_DIR, "converted.xlsx"))
注意:需要先安装pywin32库:pip install pywin32,这个方法只适用于Windows系统,因为依赖Excel的COM组件。
方法2:手动解析SpreadsheetML并生成XLSX
如果你不需要依赖Excel,可以直接解析XML的内容,然后用openpyxl生成标准XLSX文件。SpreadsheetML的核心结构大概是这样的:
<Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet"> <Worksheet> <Table> <Row> <Cell><Data ss:Type="String">单元格内容</Data></Cell> </Row> </Table> </Worksheet> </Workbook>
对应的解析代码示例:
import os import xml.etree.ElementTree as ET from openpyxl import Workbook def parse_spreadsheetml(xml_path): # 定义SpreadsheetML的命名空间 ns = { 'ss': 'urn:schemas-microsoft-com:office:spreadsheet', 'html': 'http://www.w3.org/TR/REC-html40' } tree = ET.parse(xml_path) root = tree.getroot() # 获取第一个工作表 worksheet = root.find('.//ss:Worksheet', ns) table = worksheet.find('.//ss:Table', ns) data = [] # 遍历每一行 for row in table.findall('.//ss:Row', ns): row_data = [] # 遍历每个单元格 for cell in row.findall('.//ss:Cell', ns): data_elem = cell.find('.//ss:Data', ns) if data_elem is not None: cell_type = data_elem.attrib.get(f'{{{ns["ss"]}}}Type', 'String') if cell_type == 'Number': row_data.append(float(data_elem.text) if data_elem.text else None) else: row_data.append(data_elem.text if data_elem.text else None) else: row_data.append(None) data.append(row_data) return data def convert_to_xlsx(data, output_path): wb = Workbook() ws = wb.active # 写入数据 for row in data: ws.append(row) wb.save(output_path) # 使用示例 BASE_DIR = os.path.dirname(os.path.abspath(__file__)) xml_data = parse_spreadsheetml(os.path.join(BASE_DIR, "111.xml")) convert_to_xlsx(xml_data, os.path.join(BASE_DIR, "parsed.xlsx"))
这个方法不需要依赖Excel,跨平台可用,但需要确保你的XML符合SpreadsheetML的标准结构;如果有复杂格式(比如合并单元格、样式),可能需要额外处理。
关于你用xml2xlsx的问题
xml2xlsx库要求输入的XML是它自己定义的模板格式(不是Excel原生的SpreadsheetML),所以直接传入你的XML文件会生成空文件。这个库适合从自定义XML生成表格,但不适合处理Excel导出的SpreadsheetML,所以不推荐用它来解决你的问题。
内容的提问来源于stack exchange,提问作者Theillko OSG
相关产品推荐
相关产品推荐

