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

 
posted @ 2025-05-27 08:49  译林  阅读(57)  评论(0)    收藏  举报