You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 06:53:53