Excel XML中合并单元格只能通过ss:MergeAcross和ss:MergeDown属性在左上角单元格声明,值表示跳过列/行数,且必须配合ss:ColSpan/ss:RowSpan确保兼容性。

Excel XML 格式里没有“合并单元格”的独立标签
直接说结论:ss:MergeAcross 和 ss:MergeDown 是唯一合法方式,但它们不是写在单元格内容里,而是作为 <Cell> 的属性存在,且必须配合 ss:RowSpan/ss:ColSpan 的语义理解——Excel 2003 XML Schema(SSML)根本不支持 CSS 式的“跨列跨行合并”,只支持“主单元格声明合并范围”。
常见错误是把合并逻辑写在被合并的每个 <Cell> 上,或者试图用 <MergeCells> 这类 Excel Open XML(.xlsx)的标签——那根本不会被 Excel 2003 XML 解析器识别。
怎么写一个跨 2 列、1 行的合并单元格
假设你要让 A1 和 B1 合并,内容为 “标题”,关键点在于:只有左上角那个单元格(A1)带合并属性,B1 必须省略或留空,否则 Excel 会报错或渲染错乱。
-
<Row>下第一个<Cell>加上ss:MergeAcross="1"(值是“额外跨几列”,不是总列数) - 该
<Cell>内必须有<Data>,内容只写一次 - 同一行后续本该存在的
<Cell>(如原 B1)要完全删掉,不能留空标签或写<Cell/> - 不要加
ss:MergeDown,除非你真要跨行(比如合并 A1:A2)
<Row>
<Cell ss:MergeAcross="1">
<Data ss:Type="String">标题</Data>
</Cell>
</Row>
ss:MergeAcross 和 ss:MergeDown 的值为什么容易填错
这两个属性的值不是“合并到第几列”,而是“从当前单元格起,向右/向下跳过几个单元格”。比如:
- A1 合并 A1+B1 →
ss:MergeAcross="1"(跳过 1 列,占 2 列) - A1 合并 A1+B1+C1 →
ss:MergeAcross="2"(跳过 2 列,占 3 列) - A1 合并 A1+A2 →
ss:MergeDown="1"(跳过 1 行,占 2 行) - 如果同时跨行跨列,两个属性都要写,但仅限左上角单元格
填成 "2" 却只想合并两列,结果就是三列被占——这是最常被忽略的计数逻辑。
生成时漏掉 ss:RowSpan/ss:ColSpan 会怎样
严格来说,SSML 规范并不要求写 ss:RowSpan 或 ss:ColSpan,Excel 也能渲染。但某些老版本(如 Excel 2002 SP2)或非微软解析器可能无法正确推断合并区域,导致:
- 只显示左上角内容,其余区域空白但可编辑
- 导出回 XML 时丢失合并信息
- 打印预览错位
所以稳妥做法是:只要写了 ss:MergeAcross,就同步加 ss:ColSpan="X"(X = MergeAcross + 1);同理 MergeDown 对应 RowSpan。这不是冗余,是兼容性补丁。
<Cell>,或者属性值算错跨度,Excel 就会静默忽略或错位渲染——这种问题往往要打开文件后才暴露,调试成本比代码逻辑错误还高。










