Java-使用poi-tl根据word模板动态生成word

作者wangsz,想写一些关于word的工具,所以就写了这篇文章

1.首先,先导入所需要的依赖(poi相关依赖即可)

复制代码
        <!-- POI -->
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi</artifactId>
            <version>4.1.2</version>
        </dependency>
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi-ooxml</artifactId>
            <version>4.1.2</version>
        </dependency>
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi-ooxml-schemas</artifactId>
            <version>4.1.2</version>
        </dependency>

        <!-- poi-tl -->
        <dependency>
            <groupId>com.deepoove</groupId>
            <artifactId>poi-tl</artifactId>
            <version>1.9.1</version>
        </dependency>




        <!-- https://mvnrepository.com/artifact/org.apache.pdfbox/pdfbox -->
        <dependency>
            <groupId>org.apache.pdfbox</groupId>
            <artifactId>pdfbox</artifactId>
            <version>2.0.24</version>
        </dependency>

        <dependency>
            <groupId>com.itextpdf</groupId>
            <artifactId>itextpdf</artifactId>
            <version>5.5.13</version>
        </dependency>
        <dependency>
            <groupId>com.itextpdf</groupId>
            <artifactId>itext-asian</artifactId>
            <version>5.2.0</version>
        </dependency>



        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>

2.依赖导入完成后,先了解一些poi基础知识,制作word模板

{{template}}

普通文本,渲染数据为:String或者TextRenderData

{{@template}}

图片,渲染数据为:PictureRenderData

{{#template}}

表格,渲染数据为:TableRenderData

{{*template}}

列表,渲染数据为:NumbericRenderData

3.编写生成word文档代码

java 复制代码
 //将图片转换成字节数组
    public static byte[] getUrlByteArray(String imageUrl) throws IOException {
        URL url = new URL(imageUrl);
        try (InputStream inputStream = url.openStream();
             ByteArrayOutputStream outputStream = new ByteArrayOutputStream()) {
            byte[] buffer = new byte[4096];
            int bytesRead;
            while ((bytesRead = inputStream.read(buffer)) != -1) {
                outputStream.write(buffer, 0, bytesRead);
            }
            return outputStream.toByteArray();
        }
    }
// 主要工具
public void testPicture(){

      
        Map<String, Object> datas = new HashMap() {
            {
                //本地图片
         //     put("photo", new PictureRenderData(100, 116, "C:\\Users\\53129\\Pictures\\Saved Pictures\\111.png") );
                put("name","王首zhen");
              //  put("oname","");
                put("sex","男");
                put("nation","汉族");
                put("address","天津市");
//				//本地图片byte数据
//				put("localBytePicture", new PictureRenderData(100, 120, ".png", BytePictureUtils.getLocalByteArray(new File("src/test/resources/logo.png"))));
//				//网路图片
                try {
                    put("photo", new PictureRenderData(100, 100, ".png", testPotPi.getUrlByteArray("https://avatars3.githubusercontent.com/u/1394854?v=3&s=40")));
                } catch (IOException e) {
                    e.printStackTrace();
                }
//				// java 图片
//				put("bufferImagePicture", new PictureRenderData(100, 120, ".png", BytePictureUtils.getBufferByteArray(bufferImage)));
            }
        };

        XWPFTemplate template = XWPFTemplate.compile("C:\\Users\\53129\\Desktop\\模板文件.docx")
                .render(datas);
        FileOutputStream out;
        try {
            out = new FileOutputStream("C:\\Users\\53129\\Desktop\\生成文件.docx");
            template.write(out);
            out.flush();
            out.close();
            template.close();
        } catch (FileNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

    }

4.测试代码

java 复制代码
  public static void main(String[] args) {
        long l = System.currentTimeMillis();
        new testPotPi().testPicture();
        long l1 = System.currentTimeMillis();
        System.err.println("运行时长"+(l1-l));
    }

5.封装工具类

java 复制代码
   /*
   tempath :模板文件地址
   decPath : 生成文件地址
    */
    public static void testPicture(Map<String, Object> datas , String temPath , String decPath){
        
        XWPFTemplate template = XWPFTemplate.compile(temPath)
                .render(datas);
        FileOutputStream out;
        try {
            out = new FileOutputStream(decPath);
            template.write(out);
            out.flush();
            out.close();
            template.close();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }

    }
相关推荐
我不是疯子是傻子2 小时前
串口通信数据帧粘包拆包再进化:基于 Qt 的滑动窗口与 CRC 校验实战
开发语言·qt
程序员老陆2 小时前
Qt中实现窗口真全屏(覆盖Windows任务栏)
开发语言·windows·qt
xiaohaiAIgeo2 小时前
【2026年】HG/T 20656-2024化工暖通空调设计规范:新版标准的变化与影响
java·前端·javascript·科普知识
小强库计算机毕业设计3 小时前
基于 Spring Boot + Vue3 的校园管理系统
java·spring boot·后端·项目实战·管理系统·技术分享·校园管理系统实战
霸道流氓气质3 小时前
Java中信号量(Semaphore):从本地到分布式
java·开发语言·分布式
怪奇云呼军3 小时前
G.711、Opus 和重采样会拖慢识别吗?闪电智能VoiceAgent 的音频入口怎么选
java·人工智能·python·算法·云计算·音视频
编程令我快乐3 小时前
maven部分构建参数讲解
java·maven
ZC跨境爬虫3 小时前
LeetCode 27. 移除元素(双指针详解 + Java Python 多解法对比)
java·python·leetcode
路溪非溪3 小时前
Python语言的执行流程总结
开发语言·python
民乐团扒谱机4 小时前
【超详解】量子克拉美罗下界QCRB:时延估计精度极限推导+MATLAB多场景绘图实战
开发语言·机器学习·matlab·量子力学·qcrb