You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何用Python将结构化嵌套数据转换为可在Excel中打开的多工作表XML文件

如何用Python将结构化嵌套数据转换为可在Excel中打开的多工作表XML文件

嘿,刚好我之前研究过这个!你要的是那种能直接在Excel里打开的多工作表XML文件,其实这是微软定义的SpreadsheetML格式,完全可以用Python手动构建出来,不用依赖复杂的第三方库(当然如果用pandas的话也能快速转换),下面我给你一步步讲清楚怎么做。

先搞懂目标XML的核心结构

Excel能识别的这种XML有固定规范,核心要点是:

  • 开头必须有XML声明和<?mso-application progid="Excel.Sheet"?>指令,告诉系统用Excel打开它
  • 根节点是<Workbook>,必须包含微软指定的几个命名空间
  • 每个工作表对应一个<Worksheet>节点,里面嵌套<Table>,然后是<Row>(行)和<Cell>(单元格),每个单元格的<Data>要明确指定数据类型(比如字符串、数字)

手动构建XML的Python实现

先把你的数据转换成纯Python的字典结构(不用pandas也能直接用),然后写一个函数来生成符合要求的XML:

# 模拟你的结构化数据,不用pandas的话直接用这个嵌套字典就行
data_dict = {
    "Sheet1": {
        "columns": ["Name", "Age"],
        "data": [["Alice", 30], ["Bob", 25]]
    },
    "Sheet2": {
        "columns": ["Product", "Price"],
        "data": [["Laptop", 1000], ["Phone", 500]]
    }
}

def generate_excel_xml(data_dict, output_file):
    # 开始拼接XML内容
    xml_content = '<?xml version="1.0"?>\n'
    xml_content += '<?mso-application progid="Excel.Sheet"?>\n'
    # 写入Workbook根节点和所有必要的命名空间
    xml_content += '<Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet"\n'
    xml_content += ' xmlns:o="urn:schemas-microsoft-com:office:office"\n'
    xml_content += ' xmlns:x="urn:schemas-microsoft-com:office:excel"\n'
    xml_content += ' xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet"\n'
    xml_content += ' xmlns:html="http://www.w3.org/TR/REC-html40">\n'
    
    # 遍历每个工作表,生成对应的XML节点
    for sheet_name, sheet_data in data_dict.items():
        xml_content += f'  <Worksheet ss:Name="{sheet_name}">\n'
        xml_content += '    <Table>\n'
        
        # 生成表头行
        xml_content += '      <Row>\n'
        for col in sheet_data["columns"]:
            xml_content += f'        <Cell><Data ss:Type="String">{col}</Data></Cell>\n'
        xml_content += '      </Row>\n'
        
        # 生成数据行
        for row in sheet_data["data"]:
            xml_content += '      <Row>\n'
            for cell_value in row:
                # 根据数据类型设置ss:Type,Excel才能正确识别
                cell_type = "Number" if isinstance(cell_value, (int, float)) else "String"
                xml_content += f'        <Cell><Data ss:Type="{cell_type}">{cell_value}</Data></Cell>\n'
            xml_content += '      </Row>\n'
        
        xml_content += '    </Table>\n'
        xml_content += '  </Worksheet>\n'
    
    # 关闭Workbook节点
    xml_content += '</Workbook>'
    
    # 将内容写入XML文件
    with open(output_file, 'w', encoding='utf-8') as f:
        f.write(xml_content)

# 调用函数生成XML文件
generate_excel_xml(data_dict, "multi_sheet_excel.xml")

代码关键点说明

  • 我们直接拼接XML字符串,这种方式对这种固定结构的格式来说比用XML库更直观
  • 每个<Cell><Data>必须指定ss:Type,否则Excel可能会把所有内容当成字符串处理
  • 生成的文件直接双击就能用Excel打开,会自动识别出多个工作表

如果用pandas数据的话怎么转换

如果你的原始数据是pandas DataFrame,只需要简单转成上面的data_dict格式就行,代码如下:

import pandas as pd

# 你的原始pandas数据
sheet1_df = pd.DataFrame({
    "Name": ["Alice", "Bob"],
    "Age": [30, 25]
})
sheet2_df = pd.DataFrame({
    "Product": ["Laptop", "Phone"],
    "Price": [1000, 500]
})

dataframes_dict = {
    "Sheet1": sheet1_df,
    "Sheet2": sheet2_df,
}

# 转换为我们需要的data_dict格式
converted_data = {}
for sheet_name, df in dataframes_dict.items():
    converted_data[sheet_name] = {
        "columns": df.columns.tolist(),
        "data": df.values.tolist()
    }

# 调用之前的函数生成XML
generate_excel_xml(converted_data, "from_pandas_xml.xml")

备注:内容来源于stack exchange,提问作者crustification

火山引擎 最新活动