使用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
相关产品推荐
相关产品推荐

