【Java】poi-tl 使用Word模板渲染动态表格

这篇具有很好参考价值的文章主要介绍了【Java】poi-tl 使用Word模板渲染动态表格。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言

poi-tl 是一个基于 Apache POI 和 FreeMarker 的 Java 模板引擎,可以用于动态生成 Word、Excel、PowerPoint 等文档。使用 poi-tl 可以方便地将数据填充到模板中,生成符合要求的文档。
poi-tl官方文档地址:http://deepoove.com/poi-tl/#_%E7%89%88%E6%9C%AC

先附上导出效果图:
poi tl渲染复杂图表,java基础,java,开发语言

1.创建word模板,并将模板放在resource文件夹下

这步建议手动创建,之前客服提供了一个pdf文件,我把它转成了word,用这个word当模板.结果意外发生了,动态表格数据不会自动分页,所有数据都挤在第一页…改模板,加分页符…都不好用,最后手动新建一个模板就好了…

数据结构:
代码中可以用对象封装,也可以用map.

区块对是 {{?innerList}} {{/innerList}},我想要的样式就是循环这部分内容
{{contestExcelList}} 是动态列表集合

外层out(对象) :date (字符串) innerList(集合)
inner 对象:
title1(字符串)
title2(字符串)
@image(图片)
contestExcelList(集合)-
contestExcel(对象):num(字符串)
projectName(字符串)
score(字符串)

poi tl渲染复杂图表,java基础,java,开发语言

2.引入依赖

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

  <!--word 转pdf 注意依赖是否需要排除,以免冲突-->
<dependency>
            <groupId>org.docx4j</groupId>
            <artifactId>docx4j-JAXB-MOXy</artifactId>
            <version>8.2.9</version>
        </dependency>
 <dependency>
            <groupId>org.docx4j</groupId>
            <artifactId>docx4j-export-fo</artifactId>
            <version>8.2.9</version>
        </dependency>

3.代码实现

public void downLoad(HttpServletRequest request, HttpServletResponse response) throws Exception {
List<Map<String, Object>> innerMapList= new ArrayList<>();   //inner集合
 Map<String, Object> innerMap = new HashMap<>();             //inner对象
 
  List<ContestExcel> contestExcelList= new ArrayList<>();    //自己的动态表格数据
  for (int j = 0; j < 10; j++) {
        ContestExcel contestExcelEntity = new ContestExcel();
             contestExcelEntity.setNum(j+1);
             contestExcelEntity.setProjectName("项目名称");
             contestExcelEntity.setScore("99");
             contestExcelList.add(contestExcelEntity);
  }
  
  innerMap .put("title1", Texts.of("标题1").create());
  innerMap .put("title2", Texts.of("标题2").create());
  innerMap .put("image", Pictures.ofUrl("图片url链接");
  innerMap .put("contestExcelList", contestExcelList);   
  innerMapList.add(innerMap);
  
 Map<String, Object> outMap= new HashMap<>();  //外层out(对象)
 Date date = new Date();
 SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
   outMap.put("innerList", innerMapList);
   outMap.put("date", sdf.format(date));

 String name = "打分表";
 String destFilePath = TestFileUtil.getPath();

//动态表格变量可以用[] 对应
 LoopRowTableRenderPolicy policy = new LoopRowTableRenderPolicy();
        //这里可以指定一个config类,用来指定一些规则,也可以改变模板中{{}}的这种格式
        Configure config = Configure.builder()
                .bind("contestExcelEntityList", policy).build();


//获取模板
InputStream inputStream = ClassUtils
                .getDefaultClassLoader()
                .getResourceAsStream("wordTemplate.docx");  //将模板放在resource文件夹下
//生成docx文件
XWPFTemplate compile = XWPFTemplate.compile(inputStream, config);
        compile.render(map);
        compile.writeToFile(destFilePath + name + ".docx");
        inputStream.close();

//转成pdf文件并导出
        outputMethod(response, toPdf2(destFilePath, name));

转pdf 和导出方法:


//转pdf方法

    public static String toPdf2(String destFilePath, String zipName) throws Exception {
        String destFilePath2 = "";
        char firstChar = destFilePath.charAt(0);
        if (firstChar == '/') {
            destFilePath2 = destFilePath.substring(1);
        } else {
            destFilePath2 = destFilePath;
        }
//此处代码 参考  https://editor.csdn.net/md/?articleId=133790383
        WordToPdfTest_Docx4j.wordToPdf(destFilePath2 + zipName + ".docx", destFilePath2 + zipName + ".pdf");
        return destFilePath2 + zipName + ".pdf";
    }

}

//导出方法
  public void outputMethod(HttpServletResponse response, String filePath) {

        ServletOutputStream out = null;
//        File file = new File("d:\\test\\result.pdf");
        File file = new File(filePath);
        FileInputStream inputStream = null;
        try {
            out = response.getOutputStream();
            inputStream = new FileInputStream(file);
            if (filePath.contains(".xlsx")) {
                //
                /** 导出excel文件流 */
                response.setHeader("content-Type", "application/vnd.ms-excel");
                response.setHeader(HttpHeaders.CONTENT_DISPOSITION, "inline;filename=" + URLEncoder.encode(file.getName(), "UTF-8"));
                response.setCharacterEncoding("UTF-8");
            } else {

                /** 导出pdf文件流 */
                response.setCharacterEncoding("UTF-8");
                response.setContentType("application/pdf");
                response.setHeader(HttpHeaders.CONTENT_DISPOSITION, "inline; filename=" + URLEncoder.encode(file.getName(), "UTF-8"));
            }


            // 读取文件流
            int len = 0;
            byte[] buffer = new byte[1024 * 10];
            while ((len = inputStream.read(buffer)) != -1) {
                out.write(buffer, 0, len);
            }

        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                inputStream.close();
            } catch (IOException e) {
                logger.error("输入流关闭失败, {}", e);
            }
            try {
                out.close();
            } catch (IOException e) {
                logger.error("输出流关闭失败, {}", e);
            }
        }
        file.delete();//删除.xlsx  或    pdf文件
        if (filePath.contains(".pdf")) {  //如果是pdf ,还需要删除生成的docx
            File fileDocx = new File(filePath.substring(0, filePath.lastIndexOf(".")) + ".docx");
            fileDocx.delete();
        }

    }

4.前端blob导出参考:

https://editor.csdn.net/md/?articleId=133790129文章来源地址https://www.toymoban.com/news/detail-810512.html

到了这里,关于【Java】poi-tl 使用Word模板渲染动态表格的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 使用poi-tl向word插入图片、文本、表格行循环

    工作中难免会向word中操作数据,本文主要介绍poi-tl的使用,先来看效果图 核心介绍: 标签 1、插入文本标签 : {{var}} 2、插入图片标签: {{@var}} 操作步骤: 1、引入依赖 2、Java核心代码 官方网址:http://deepoove.com/poi-tl/ 1、准备模版,定义好需要的标签 2、查询模版 3、获取需要填

    2024年02月05日
    浏览(57)
  • poi-tl的使用(动态表格的生成)

    注意apache.poi版本要对应 创建两个文件夹,一个是用来存储模板文件,另一个是用来存储生成的文件 准备一个word模板,命名为test.docx, 注意,{{}}是官方指定的格式,也可以自定义。 [ ] 是可替换的属性 可以是多个 代码 生成文件 参考: 使用最全 讲解最全

    2024年02月13日
    浏览(21)
  • Spring Boot 中使用 Poi-tl 渲染数据并生成 Word 文档

    本文 Demo 已收录到 demo-for-all-in-java 项目中,欢迎大家 star 支持!后续将持续更新! 产品经理急冲冲地走了过来。「现在需要将按这些数据生成一个 Word 报告文档,你来安排下」 项目中有这么一个需求,需要将用户填写的数据填充到一个 Word 文档中,而这个 Word 文档是人家给

    2024年02月09日
    浏览(26)
  • poi-tl导出word复杂表格(单元格合并,生成复杂表格)

    官方文档地址:http://deepoove.com/poi-tl/ 源码地址:https://github.com/Sayi/poi-tl poi-tl(poi template language)是Word模板引擎,使用Word模板和数据创建很棒的Word文档。 最近在做项目时候有一个关于导出Word的文件的需求,需要导出的word文件较大,并且格式比较复杂,使用poi-tl可以很好的

    2024年02月16日
    浏览(16)
  • POI-tl 知识整理:整理3 -> 动态生成表格

    (1)需要渲染的表格的模板 说明 : {{goods}}  是个标准的标签,将  {{goods}}  置于循环行的上一行,循环行设置要循环的标签和内容,注意此时的标签应该使用  []  ,以此来区别poi-tl的默认标签语法。同理, {{labors}}  也置于循环行的上一行。    (2)定义两个实体类  (

    2024年01月18日
    浏览(16)
  • java 使用POI-TL根据word模版,生成word文件,含图片,富文本。

    1.引入mavna坐标` 2 .poi-tl-ext插件主要用于富文本内容格式在word展现 3.word模版创建 3.具体代码实现 4.本文的miniourl路径实质为网络路径的文件。

    2024年02月16日
    浏览(21)
  • Java使用poi-tl1.9.1生成Word文档的几个小技巧

    目录 前言 一、poi-tl简介 1、什么是poi-tl 2、常见的word生成对比 3、poi-tl功能点 二、poi-tl文档生成 1、模板准备 2、目标参数填充 3、生成效果  三、可能会遇到的问题 1、混合图表生成报错 2、图表参数设置技巧  总结         也许在您的工作当中会碰到如下的一些场景,比

    2024年02月16日
    浏览(22)
  • java使用poi-tl导出word及转换PDF后的合并导出pdf

    为某单位开发的一款项目申报审批系统,用户需求在申报阶段填写的信息资料能够导出PDF。且项目申报的报告正文为用户上传,所以需要合并导出。 在项目初期阶段使用的是PDF的预设模板导出,因为以前使用过,比较熟悉。所以优先选择此方法,但项目测试阶段发现问题,因

    2024年02月06日
    浏览(50)
  • poi-tl设置图片(通过word模板替换关键字,然后转pdf文件并下载)

    选中图片右击  选择设置图片格式   例如word模板   maven依赖   读取  代码

    2024年02月11日
    浏览(27)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包