POI给word中的表格table动态添加行,并保留上一行的样式

您所在的位置:网站首页 表格加一行怎么操作word POI给word中的表格table动态添加行,并保留上一行的样式

POI给word中的表格table动态添加行,并保留上一行的样式

2024-07-05 08:50| 来源: 网络整理| 查看: 265

最近在处理项目中,动态生成word格式的合同,再将word转为pdf,并为pdf添加文字、图片水印。

在生成word的时候模板中有动态添加表格行,模板如下图:

下面先上结果图:

模板上的标签变量解析是自己写的。开始想着用freemark做模板解析,但是freemark生成的word文档,无法用poi转化为pdf文档,最后放弃了,只能自己着手写。

在poi的官方代码中提供了四种添加行的方法:

table.addNewRowBetween 官方没实现 table.insertNewTableRow(pos) 在pos位置新增一行,样式为默认样式,但是这个具体是啥样式不确定。 table.addRow(XWPFTableRow newRow, int pos) 在table指定的行pos处添加一行newRow,本文将用此方法 table.addRow() 在表格最后加一行。 table.createRow() 在表格最后一加行

下面开始说具体代码

1.添加依赖,由于项目中用了poi将word转pdf的一个jar(org.apache.poi.xwpf.converter.pdf),最高只支持3.15.

org.apache.poi poi 3.15 org.apache.poi poi-ooxml 3.15

2.由于实际代码其他业务处理逻辑很多,下面贴出核心代码块

if (fields.size() > 0) { //row为模板中的行 //table.addRow(row, i+1);//此方法可以使新增的行和模板样式一样,但是新行赋值是会将上面行的row也修改了, //因为row是对象,新行只是得到一个引用,调试是可以发现后面新增的row的对象id都是一样的。 //开始有想过用既然是对象,那么克隆、序列化反序列化一个呗,进入XWPFTableRow一看没实现Cloneable、Serializable接口,走不通, //最后没招了去看row的构造函数XWPFTableRow(CTRow row, XWPFTable table),使用模板的行构造一个鑫航,那就可以保留模板行一样 //样式了,构造完发现newRow的对象id变了,其他的样式、单元格内容仍然保留着,接下来就是替换掉单元格的内容就好了。 CTRow ctrow = CTRow.Factory.parse(row.getCtRow().newInputStream());//重点行 XWPFTableRow newRow = new XWPFTableRow(ctrow, table); for (int k = 0; k < fields.size(); k++) { XWPFTableCell cell = newRow.getTableCells().get(k);// 在新增的行上面创建cell //cell.setText(fields.get(k));//不能使用该方法直接加内容,这样会在原内容后面追加,并且不能保证跟原字体样式一致 for (XWPFParagraph p : cell.getParagraphs()) { for (XWPFRun r : p.getRuns()) { r.setText(fields.get(k), 0);//要深入到原cell中的run替换内容才能保证样式一致 } } } table.addRow(newRow, i + 1); i++;// 新增一行,行索引加1,此处不+1会导致下一行,覆盖刚新增的一行 }

 



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3