AI 整理的 CSV 转 XLSX:编号和公式样式文字都按原文保留
拿到 AI 整理的 CSV 后,如果直接打开时 001 变成了 1、长编号被改写,先看原文件里的字符还在不在。字符仍然完整,就可以把它们明确写成 XLSX 文本单元格。
这里的脚本适合客户编号、工单号、标签、原始摘录这类需要保留原文的交换底稿。所有列都按文本写,不猜哪列是数字或日期;已经被 AI 改错、或在前一步丢掉的数字,靠换格式恢复不了。
包里有现成的 demo-text.xlsx、源 CSV、转换脚本、测试和 README。样例全是虚构数据,不需要 API key。
用自己的 CSV
前提:Python 3.9+,UTF-8 或带 BOM 的 UTF-8 CSV,逗号分隔。先解压材料包,再在该目录运行:
python -m pip install -r requirements.txt
python csv_to_text_xlsx.py demo.csv rebuilt-text.xlsx
python -m unittest -v test_csv_to_text_xlsx.py 换自己的文件时,把 demo.csv 换成源文件路径,第二个参数换成一个尚不存在的 .xlsx 文件。脚本拒绝覆盖,保留原 CSV。
转换命令应输出:
wrote rebuilt-text.xlsx: 3 data rows, 5 columns; all cells are text rebuilt-text.xlsx 就是转换结果;随包已有的 demo-text.xlsx 可以直接打开对照。
下面是随包 XLSX 经 LibreOffice 导出 PDF 的实际预览,不是 Excel 界面,也不是模型输出:
为什么只设“文本格式”还不够
用 openpyxl 写字符串时,=1+1 会被自动识别成公式,#N/A 也可能被识别成错误值。只给单元格设 number_format = "@",没有把它的值类型一起改掉。
脚本写入每个字段时明确指定字符串类型:
cell.value = value # value 直接来自 csv.reader,未先转数字
cell.data_type = "s" # 把 =1+1、#N/A 也保留为文本
cell.number_format = "@" 在样例里,001 仍是三个字符,18 位编号不经过浮点数,=1+1 显示原文而不计算成 2。测试还覆盖了带逗号、换行和前后空格的字段;空字段保留为空白。
这份包在 Python 3.12.14、openpyxl 3.1.5 下解压运行,14 项离线测试通过;逐字段读回对照 CSV,并检查了工作表 XML 中没有公式元素。预览使用 LibreOfficeDev 26.8.0.0.alpha0,本场没有调用模型,也没有运行 Microsoft Excel。
长文本写入后仍可能超出当前行高、列宽,换自己的文件时要按需调整;上面的单页排版只核对了随包样例。
另有几个地方会直接报错:坏 UTF-8、列数不齐、缺失或重复表头、未闭合的引号、XML 不允许的字符,以及超过 32,767 字符的单格内容。openpyxl 对超长字符串会截断,这里选择在写文件前拒绝,免得悄悄少一截。
全部文本也有代价:金额列不会变成可以直接求和的数值列。 真要做计算,应另定哪些列是金额、数量、日期,再按业务规则转换;不要对整张表统一“转为数字”。这份脚本不验证 AI 提取的内容是否属实,也不保护后续另存 CSV、手工重录或重新转换后的文件。
资料:Microsoft Excel 保留前导零与长数字说明、Python csv 官方文档、openpyxl 单元格类型与字符串处理源码,2026-10-23 核对。