Java word模板打印
使用word模板引擎poi-tl动态数据填充以及模板打印
参考官网地址:
http://deepoove.com/poi-tl/#_why_poi_tl
http://deepoove.com/poi-tl/apache-poi-guide.html#_%E6%96%87%E6%A1%A3xwpfdocument
案例word(docx)模板:
图片2221:{{@vo.image}}
文本:{{txt}}
表格1:
{{#table}}
表格2222:
{{vo.products}}数量 名称 价格
[number] [pdCnName] [unitPrice]
列表:
{{*list}}

数据处理代码:
package com.huake.erp.system;
import cn.hutool.core.collection.CollUtil;
import com.alibaba.fastjson2.JSON;
import com.alibaba.fastjson2.JSONArray;
import com.alibaba.fastjson2.JSONObject;
import com.baomidou.mybatisplus.core.toolkit.StringPool;
import com.deepoove.poi.XWPFTemplate;
import com.deepoove.poi.config.Configure;
import com.deepoove.poi.config.ConfigureBuilder;
import com.deepoove.poi.plugin.table.LoopRowTableRenderPolicy;
import com.huake.erp.business.entity.BizExportOrderProduct;
import com.huake.erp.business.vo.resp.BizExportOrderDetailPrintVo;
import com.huake.erp.business.vo.resp.BizExportOrderDetailVo;
import com.huake.erp.model.base.constants.NumberConstants;
import com.huake.erp.model.base.model.PrintModel;
import org.apache.commons.compress.utils.Lists;
import org.junit.Test;
import java.io.FileOutputStream;
import java.io.IOException;
import java.math.BigDecimal;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* word模板打印测试
*
* @author heyangyang
* @since 2024-03-04
*/
public class WordPrintTest {
@Test
public void test() throws IOException {
BizExportOrderDetailVo vo = new BizExportOrderDetailPrintVo();
List<BizExportOrderProduct> products = Lists.newArrayList();
BizExportOrderProduct product = new BizExportOrderProduct();
product.setNumber(1);
product.setPdCnName("张三aa1");
product.setUnitPrice(new BigDecimal(11));
products.add(product);
BizExportOrderProduct product1 = new BizExportOrderProduct();
product1.setNumber(2);
product1.setPdCnName("李四bb1");
product1.setUnitPrice(new BigDecimal(22));
products.add(product1);
vo.setProducts(products);
List<String> listProperties = Lists.newArrayList();
getProperties(vo, "vo", listProperties);
// Map<String, Object> aa = formatData(vo, "aa", com.google.common.collect.Lists.newArrayList("111", "222"));
// System.out.println(aa);
ConfigureBuilder config = Configure.builder();
if (CollUtil.isNotEmpty(listProperties)) {
LoopRowTableRenderPolicy policy = new LoopRowTableRenderPolicy();
for (String property : listProperties) {
config.bind(property, policy);
}
}
Configure configure = config.build();
// configure.customPolicy("vo.image", new PictureRenderPolicy());
// configure.customPolicy("image", new PictureRenderPolicy());
PrintModel printModel = vo;
printModel.setImage("http://192.168.0.210:9000/huake-erp/1760164244302020608/1760164245476425728/PUBLIC_DOCUMENTS/1760198258902351874_apple.jpeg");
// java.net.URL url = new java.net.URL("http://192.168.0.210:9000/huake-erp/1760164244302020608/1760164245476425728/PUBLIC_DOCUMENTS/1764564272176885762_word1.docx");
// 打开连接
// URLConnection con = url.openConnection();
// 输入流
// XWPFTemplate template = XWPFTemplate.compile(con.getInputStream(), configure).render(
String filepath = this.getClass().getClassLoader().getResource("wordtemplates/word1.docx").getPath();
XWPFTemplate template = XWPFTemplate.compile(filepath, configure).render(
new HashMap<String, Object>() {{
// put("txt", "Hello, poi-tl Word模板引擎");
// put("image", "http://192.168.0.210:9000/huake-erp/1760164244302020608/1760164245476425728/PUBLIC_DOCUMENTS/1760198258902351874_apple.jpeg");
// put("image", Pictures.ofUrl("http://deepoove.com/images/icecream.png", PictureType.PNG)
// .size(100, 100).create());
// put("image", "http://deepoove.com/images/icecream.png");
// put("table", Tables.of(new String[][]{
// {"姓名", "性别", "年龄"},
// {"张三", "男2", "20"},
// {"李四", "女3", "22"},
// {"王五", "男4", "25"}
// }).border(TableStyle.BorderStyle.DEFAULT).create());
// put("list", Numberings.create("zhangsan", "lisi", "wangwu"));
put("vo", printModel);
}});
// 将完成数据渲染的文档写出
template.writeAndClose(new FileOutputStream("output.docx"));
}
/**
* 获取有效字段
*
* @param vo 对象
* @param prefix 前缀
* @param listProperties
* @return
*/
private List<String> getProperties(Object vo, String prefix, List<String> listProperties) {
String jsonString = JSONObject.toJSONString(vo);
if (JSON.isValidArray(jsonString)) {
JSONArray array = JSONArray.parseArray(jsonString);
listProperties.add(prefix);
getProperties(array.get(NumberConstants.ZERO), prefix, listProperties);
}
if (JSON.isValidObject(jsonString)) {
JSONObject parse = JSONObject.parse(jsonString);
for (Map.Entry<String, Object> entry : parse.entrySet()) {
String newPrefix = getPrefix(prefix, entry.getKey());
getProperties(entry.getValue(), newPrefix, listProperties);
}
}
return null;
}
/**
* 设置新的前缀
*
* @param prefix 前缀
* @param key 新的key
* @return 新的前缀
*/
private String getPrefix(String prefix, String key) {
return String.join(StringPool.DOT, prefix, key);
}
}
效果:

问题:
1、获取图片的大小是原图,如需更改图片大小需要单独设置
2、可能会遇到java包冲突问题解决办法:
https://blog.csdn.net/gaojiahao_/article/details/126285226

浙公网安备 33010602011771号