You need to enable JavaScript to run this app. 使用Python转换动态结构Excel格式XML为指定格式CSV
优惠活动
大模型
产品
解决方案
定价
更多

使用Python转换动态结构Excel格式XML为指定格式CSV

SpreadsheetML格式XML转CSV实现

适配特性

  • 支持行列数动态变化的Excel导出XML文件,自动处理空单元格、跳列场景
  • 自动识别单元格数据类型,按要求格式化DateTime值:
    • 日期类值输出为无前导零的月/日/年格式(如2/15/2021)
    • 时间类值输出为时:分格式(如22:46)
  • 输出标准CSV文件,Excel打开无中文乱码

依赖

全部使用Python标准库,无需额外安装第三方包:

  • xml.etree.ElementTree:解析XML节点结构
  • csv:生成规范CSV文件
  • datetime:处理日期时间格式化

实现代码

import xml.etree.ElementTree as ET
import csv
from datetime import datetime

# Excel SpreadsheetML对应的命名空间配置
XML_NS = {
    'ss': 'urn:schemas-microsoft-com:office:spreadsheet'
}

def convert_excel_xml_to_csv(xml_input_path: str, csv_output_path: str):
    # 解析XML文件
    xml_tree = ET.parse(xml_input_path)
    root_node = xml_tree.getroot()
    table_node = root_node.find('.//ss:Table', XML_NS)
    
    if not table_node:
        raise ValueError("目标XML中缺失有效Table节点")
    
    csv_rows = []
    # 遍历所有行节点
    for row_node in table_node.findall('ss:Row', XML_NS):
        current_row_cells = []
        # 遍历行内所有单元格
        for cell_node in row_node.findall('ss:Cell', XML_NS):
            # 处理Excel XML的跳列属性(带ss:Index时表示从指定列开始填充)
            column_idx_attr = cell_node.get(f'{{{XML_NS["ss"]}}}Index')
            if column_idx_attr:
                target_col = int(column_idx_attr) - 1
                # 补全跳列前的空单元格,避免行列错位
                while len(current_row_cells) < target_col:
                    current_row_cells.append('')
            
            data_node = cell_node.find('ss:Data', XML_NS)
            if not data_node:
                current_row_cells.append('')
                continue
            
            data_type = data_node.get(f'{{{XML_NS["ss"]}}}Type')
            raw_value = data_node.text.strip() if data_node.text else ''

            # 按类型格式化值
            if data_type == 'DateTime':
                try:
                    parsed_dt = datetime.strptime(raw_value, '%Y-%m-%dT%H:%M:%S.%f')
                    # 区分日期、时间类型:Excel时间值的基准日期为1899-12-31
                    if parsed_dt.date() == datetime(1899, 12, 31).date():
                        formatted_value = parsed_dt.strftime('%H:%M')
                    else:
                        # 跨平台生成无前导零的月/日/年格式
                        formatted_value = f"{parsed_dt.month}/{parsed_dt.day}/{parsed_dt.year}"
                except ValueError:
                    formatted_value = raw_value
            else:
                formatted_value = raw_value
            
            current_row_cells.append(formatted_value)
        
        csv_rows.append(current_row_cells)
    
    # 写入CSV,使用utf-8-sig编码保证Excel打开无中文乱码
    with open(csv_output_path, 'w', newline='', encoding='utf-8-sig') as output_f:
        csv_writer = csv.writer(output_f)
        csv_writer.writerows(csv_rows)

# 调用入口
if __name__ == "__main__":
    # 替换为实际文件路径即可运行
    convert_excel_xml_to_csv("source_file.xml", "result.csv")

输出效果验证

对应示例输入的XML结构,最终输出和要求完全一致:

Date,Time,Language
2/15/2021,22:46,Norwegian
2/15/2021,22:23,Norwegian

兼容场景说明

  • 适配文件行数、列数动态变化的需求,无需提前固定列数
  • 自动忽略XML中存在的单元格样式、命名单元格、过滤标记等冗余节点
  • 自动补全空单元格,避免因跳列导致的CSV列错位

内容的提问来源于stack exchange,提问作者Tessy

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.31 09:45:00