简单的模板处理可以参考以下链接:
https://blog.csdn.net/liushimiao0104/article/details/78520120
我用的是一下版本
<dependency>
<groupId>com.deepoove</groupId>
<artifactId>poi-tl</artifactId>
<version>1.4.2</version>
</dependency>
关于poi-tl
poi-tl:poi template language 一个基于poi的word模板生成文档的开源组件。
文档介绍:http://deepoove.com/poi-tl/
GitHub地址:https://github.com/Sayi/poi-tl
1、关于动态表格的处理,文档已经写的比较详情了,我只做简单的实际运用的介绍
detail_table:问表格定义的参数名,可以写在模板表格的任意位置。
DetailTablePolicy:自己建的class,用于处理这个表格,
这行代码相当于这个获取了这个表格交给这个类处理。
关于此处的文件路径,只做参考,项目框架不一样,以及系统不一样可能获取文件的路径有点差异。如果文件找不到需要自己去处理。
Configure config = Configure.newBuilder().customPolicy("detail_table", new DetailTablePolicy()).build();
XWPFTemplate template = XWPFTemplate.compile("src/test/resources/付款通知书.docx", config).render(datas);
如果world有多个数据需要自定义表格的话,换成以下写法
Configure configs=Configure.createDefault();
configs.customPolicy("Table1", new DetailTablePolicy());
configs.customPolicy("Table2", new DetailTablePolicy());
XWPFTemplate template = XWPFTemplate.compile(worldTemplate,configs);
template.render(dataMap);
datas,数据,一般是map
ldatas.put("detail_table",null);
Style headTextStyle = new Style();
TableStyle headStyle = new TableStyle();
TableStyle rowStyle = new TableStyle();
headTextStyle.setFontFamily("Hei");
headTextStyle.setFontSize(9);
headTextStyle.setColor("000000");
List headArr=new ArrayList();
for (int i = 0; i < 3; i++) {
RowRenderData header = RowRenderData.build(new TextRenderData("姓名",headTextStyle), new TextRenderData("电话",headTextStyle));
headArr.add(header);
}
datas.put("detail_table", headArr);
2、编写DetailTablePolicy类
table就是这个获取的表格,可以操作此表格的位置信息,
data就是detail_table的数据,数据自己定义,因为我自己的数据需要控制字体大小,所有用的List<RowRenderData> 的格式。
import com.deepoove.poi.NiceXWPFDocument;
import com.deepoove.poi.data.RowRenderData;
import com.deepoove.poi.policy.DynamicTableRenderPolicy;
import com.deepoove.poi.policy.MiniTableRenderPolicy;
import java.util.List;
import org.apache.poi.xwpf.usermodel.XWPFTable;
import org.apache.poi.xwpf.usermodel.XWPFTableRow;
/**
* Created by on 2019/5/28.
*/
public class DetailTablePolicy extends DynamicTableRenderPolicy {
// 货品填充数据所在行数
//int goodsStartRow = 2;
// 人工费填充数据所在行数
int laborsStartRow = 1;
@Override
public void render(XWPFTable table, Object data) {
if (null == data) return;
// DetailData detailData = (DetailData) data;
List<RowRenderData> labors =(List<RowRenderData>)data;
if (null != labors) {
table.removeRow(laborsStartRow);
// 循环插入行
for (int i = 0; i < labors.size(); i++) {
XWPFTableRow insertNewTableRow = table.insertNewTableRow(laborsStartRow);
//处理一行有几列
for (int j = 0; j < 2; j++) insertNewTableRow.createCell();
// 合并单元格
// NiceXWPFDocument.mergeCellsHorizonal(table, laborsStartRow, 0, 3);
MiniTableRenderPolicy.renderRow(table, laborsStartRow, labors.get(i));
}
}
}
}
表格样式控制可参考
提示:如果是world转PDF,下载的功能,用springboot框架打包,发布到windows上,需要在c盘的windows->system32,文件下放入jacob-1.19-x64.dll文件,项目也需要使用jacob-1.19.jar包。