poi - word合并单元格,拖动之后还原问题
word 文件合并单元格,在网络上,很容易找到下面这个函数,
但是,这个函数有一个 bug,如果拖动单元格,合并的单元格又会重新还原。
class Test {
/**
* word单元格列合并
*
* @param table 表格
* @param row 合并列所在行
* @param startCell 开始列
* @param endCell 结束列
*/
public static void mergeCellsHorizontal(XWPFTable table, int row, int startCell, int endCell) {
for (int i = startCell; i <= endCell; i++) {
XWPFTableCell cell = table.getRow(row).getCell(i);
if (i == startCell) {
// The first merged cell is set with RESTART merge value
cell.getCTTc().addNewTcPr().addNewHMerge().setVal(STMerge.RESTART);
} else {
// Cells which join (merge) the first one, are set with CONTINUE
cell.getCTTc().addNewTcPr().addNewHMerge().setVal(STMerge.CONTINUE);
}
}
}
}
其实 office 相关的文件,如果想知道文档结构,可以用一种很简单的方式:将文件另存为 xml 格式;
下面是 word 文档转换成 xml 之后,单元格相关的代码。
对于上面的代码 cell.getCTTc().addNewTcPr(),你可能一开始不能理解,但是看过 xml 格式,大致就能猜出来了。
<w:tc>
<w:tcPr>
<w:tcW w:w="0" w:type="auto"/>
</w:tcPr>
<w:p w14:paraId="3049E24E" w14:textId="77777777" w:rsidR="00B21DED" w:rsidRDefault="00ED7147">
<w:pPr>
<w:jc w:val="center"/>
</w:pPr>
<w:r>
<w:t>杭州市</w:t>
</w:r>
</w:p>
</w:tc>
回归到上面这个问题,为什么拖拽之后就还原了呢?
因为合并之后,并未删除单元格,w:r 标签仍然存在,代码再加一两行,清除多余的 w:r 标签即可。
class Test{
/**
* word单元格列合并
*
* @param table 表格
* @param row 合并列所在行
* @param startCell 开始列
* @param endCell 结束列
*/
public static void mergeCellsHorizontal(XWPFTable table, int row, int startCell, int endCell) {
for (int i = startCell; i <= endCell; i++) {
XWPFTableCell cell = table.getRow(row).getCell(i);
if (i == startCell) {
// The first merged cell is set with RESTART merge value
cell.getCTTc().addNewTcPr().addNewHMerge().setVal(STMerge.RESTART);
} else {
// Cells which join (merge) the first one, are set with CONTINUE
cell.getCTTc().addNewTcPr().addNewHMerge().setVal(STMerge.CONTINUE);
// 关键是这一行,要 removeR() 多少次,取决于你文档中实际数量
cell.getCTTc().getPArray(0).removeR(0);
}
}
}
}
疯狂的妞妞 :每一天,做什么都好,不要什么都不做!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY