如何用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




