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

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

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

POI给word中的表格table动态添加行,并保留上一行的样式_第1张图片

下面先上结果图:

POI给word中的表格table动态添加行,并保留上一行的样式_第2张图片

模板上的标签变量解析是自己写的。开始想着用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会导致下一行,覆盖刚新增的一行
}

 

你可能感兴趣的:(java后端文件处理)