AI 整理的 CSV 转 XLSX:编号和公式样式文字都按原文保留

小周debug Lv.2 2026/10/23 09:56:58 浏览 0

拿到 AI 整理的 CSV 后,如果直接打开时 001 变成了 1、长编号被改写,先看原文件里的字符还在不在。字符仍然完整,就可以把它们明确写成 XLSX 文本单元格。

这里的脚本适合客户编号、工单号、标签、原始摘录这类需要保留原文的交换底稿。所有列都按文本写,不猜哪列是数字或日期;已经被 AI 改错、或在前一步丢掉的数字,靠换格式恢复不了。

下载脚本、现成XLSX、CSV样例和测试材料包

包里有现成的 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 核对。

评论 0

发表评论

登录后参与讨论

登录

暂无评论