跳到正文
MyDSH我的 DSH 实战笔记
English
独立维护,非DeepSeek官方;与mydsh.dev等其他MyDSH站点无关联。

首页/工作区与文件/文件读取与格式

合并单元格:xlsx 能看出合并,csv 只能给你空

同一份表,直接给 csv 和给 xlsx,模型理解出来的结构不一样,尤其是带合并表头的月报。

已核验版本与环境核验日期2026-11-14
工具
openpyxl + Python 3.13
样本
含两处合并区域(A1:D1、B5:C5)的工作簿
核验日期
2026-11-14

可复制指令

python -c "import openpyxl,sys;w=openpyxl.load_workbook(sys.argv[1]);print([str(r) for r in w.active.merged_cells.ranges])" book.xlsx

造一个最小的例子就能看清:表头合并A1:D1,中间再来一处B5:C5合并。

xlsx读回来是这样:

('2026 年 11 月流水', None, None, None)
('日期', '项目', '金额', '备注')
('2026-11-01', '茶饼', 1280, None)
(None, None, None, '小计在上')
(None, '合并说明', None, None)
('2026-11-02', '散茶', 960, None)

同样的内容存成csv再读回来:

row0: '2026 年 11 月流水,,,'
row1: '日期,项目,金额,备注'
row2: '2026-11-01,茶饼,1280,'
row3: ',,,小计在上'
row4: ',合并说明,,'
row5: '2026-11-02,散茶,960,'

差别在哪

xlsxcsv
合并信息可查merged_cells.ranges,能看出「这几个格是同一格」完全丢失,变成若干空字段
非左上角单元格读回None(值只在左上角那一格)空字符串,与「真的没填」不可区分
空字符串与空单元格都读回None都是连续逗号
能不能还原表头层级能,靠合并区域推断不能,只能看到一行文字加三个空

最要命的是第二行:csv里「合并说明」看起来就在B列,A列和C列是空的。你没法判断它是合并出来的居中标题,还是B列真的有个值而旁边没填。xlsx里查一下合并区域就知道了。

实用取舍

  • 要保留结构(表头层级、分组小计):给xlsx,并在指令里要求它先报合并区域。
  • 只要数据行(干净的二维表、一列一个字段):csv更省token,也不会有合并带来的歧义。
  • 不确定:先给xlsx让它描述结构,确认后再转成csv处理数据。两步比一步稳。
还有一个反直觉的点:写进单元格的空字符串,读回来是None,不是空字符串。所以「这一格是空的」和「这一格写了空」在读取层面分不出——需要区分就在表里加一列显式标记。

怎么算跑通

照着逐条对,全过才算完成。有一条没过,先解决它再往下。

  • 能说出工作簿里有几处合并区域
  • 知道非左上角单元格读回是None
  • 用csv时没有把合并标题当成某一列的值

会失败在哪

现象 / 原因 / 怎么办,按实际踩到的顺序写。

现象原因怎么办
xlsx读出来全是None读的不是活动表,或数据在别的sheet先打印sheet名列表,指定具体表再读
合并单元格里有值但只看到一个这是合并本身的语义:值只存在左上角要每格都有值,得先取消合并并填充(fill down)

来源

标「已核验」的,来自本站实跑;标「公开资料整理」的,逐条附出处。