如何用Python将CSV转为带Excel表格格式的XLSX并迁移?
实现CSV转Excel格式化表格并迁移文件
当然可以实现!你当前的脚本已经完成了CSV转Excel和文件迁移的基础功能,只需要补充代码来创建Excel原生的结构化表格(也就是「插入>表格」生成的那种带筛选、条纹样式的格式化表格)。Pandas的to_excel方法只是写入原始数据,不会生成Excel的Table对象,我们可以借助openpyxl库来完成这个需求。
修改后的完整代码
import os import shutil import pandas as pd from openpyxl import load_workbook from openpyxl.worksheet.table import Table, TableStyleInfo from openpyxl.utils import get_column_letter # 配置路径 src_csv = r"C:\Users\xxxx\Python\filename.csv" temp_xlsx = r"C:\Users\xxxx\Python\filename.xlsx" dest_dir = r"C:\Users\xxxx\Python\repository" # 1. CSV转Excel(指定openpyxl为引擎,方便后续操作表格结构) df = pd.read_csv(src_csv) df.to_excel(temp_xlsx, index=None, header=True, engine='openpyxl') # 2. 加载Excel文件并创建原生格式化表格 wb = load_workbook(temp_xlsx) ws = wb.active # 获取当前活跃的工作表 # 计算表格的数据范围(从A1到最后一行最后一列) max_col_letter = get_column_letter(ws.max_column) max_row_num = ws.max_row table_range = f"A1:{max_col_letter}{max_row_num}" # 创建Table对象,设置显示名称 table = Table(displayName="CSV_Data_Table", ref=table_range) # 配置表格样式(模拟Excel默认的「插入>表格」样式) table_style = TableStyleInfo( name="TableStyleMedium9", # 可选样式:TableStyleLightXX/MediumXX/DarkXX showFirstColumn=False, showLastColumn=False, showRowStripes=True, showColumnStripes=False ) table.tableStyleInfo = table_style # 将表格添加到工作表 ws.add_table(table) # 保存修改后的Excel文件 wb.save(temp_xlsx) # 3. 迁移文件到指定目录 dest_file_path = os.path.join(dest_dir, os.path.basename(temp_xlsx)) shutil.copy2(temp_xlsx, dest_file_path) print(f"格式化表格文件已成功迁移至:{dest_file_path}")
关键步骤说明
- 指定openpyxl引擎:Pandas默认用xlwt处理xls格式,要操作xlsx的表格结构,必须指定
engine='openpyxl',确保后续能读取并修改Excel的底层结构。 - 计算表格范围:通过
ws.max_column和ws.max_row自动获取数据边界,用get_column_letter把数字列号转为Excel的字母列名(比如1→A),避免手动写死范围。 - 自定义表格样式:
TableStyleInfo可以调整表格的条纹、边框、首列高亮等样式,TableStyleMedium9是Excel默认的浅蓝条纹样式,你可以根据需求替换成其他内置样式(比如TableStyleLight1)。 - 添加原生表格:
ws.add_table(table)会把数据区域转换为Excel原生表格,生成后支持排序、筛选、自动扩展等表格专属功能,和手动点击「插入>表格」效果完全一致。
注意事项
- 确保已安装
openpyxl库:如果没安装,执行pip install openpyxl即可。 - 如果CSV包含特殊格式(比如日期、货币),建议在Pandas读取时先做格式处理(比如
pd.read_csv(..., parse_dates=['日期列'])),避免表格生成后格式异常。
内容的提问来源于stack exchange,提问作者RCarmody




