poi-tl导出word复杂表格(单元格合并,生成复杂表格)

这篇具有很好参考价值的文章主要介绍了poi-tl导出word复杂表格(单元格合并,生成复杂表格)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


poi-tl介绍

官方文档地址:http://deepoove.com/poi-tl/
源码地址:https://github.com/Sayi/poi-tl

poi-tl(poi template language)是Word模板引擎,使用Word模板和数据创建很棒的Word文档。

最近在做项目时候有一个关于导出Word的文件的需求,需要导出的word文件较大,并且格式比较复杂,使用poi-tl可以很好的解决。在这里记录一下关于复杂表格的合并与生成。

poi-tl的优势
java poi 动态导出word表格带合并效果,word,spring boot
poi-tl 是基于 Apache POI ,使用时请注意poi的版本依赖冲突问题
java poi 动态导出word表格带合并效果,word,spring boot


一、快速开始

1. 添加依赖

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

2.快速入门
新建Word文档template.docx,这里模板文件存放resources/word目录下,模板包含标签 {{title}}
java poi 动态导出word表格带合并效果,word,spring boot

代码示例

    @GetMapping("/export")
    public void export(HttpServletResponse response) throws IOException {
        // 获取模板文件流
        InputStream resourceAsStream =
                this.getClass().getResourceAsStream("/word/template.docx");
        //poi-tl 配置
        ConfigureBuilder builder = Configure.builder();
        builder.useSpringEL(false);

        Map<String,Object> map = new HashMap<>();
        map.put("title","hello,poi-tl!");
        XWPFTemplate template = XWPFTemplate.compile(Objects.requireNonNull(resourceAsStream), builder.build()).render(map);
        //输出文件流
        template.writeAndClose(new FileOutputStream("D:\\output.docx"));
    }     

3.输出
可以写到任意输出流中,比如文件流:

template.write(new FileOutputStream("output.docx"));

比如网络流:

         //输出网络流
        response.setContentType("application/octet-stream");
        response.setHeader("Content-disposition","attachment;filename=\""+"out_template.docx"+"\"");
        // HttpServletResponse response
        OutputStream out = response.getOutputStream();
        BufferedOutputStream bos = new BufferedOutputStream(out);
        template.write(bos);
        bos.flush();
        out.flush();
        PoitlIOUtils.closeQuietlyMulti(template, bos, out);

二、表格合并

功能需求

导出的word中存在单个表格, 或动态的多个表格

word模板

java poi 动态导出word表格带合并效果,word,spring boot

poi-tl提供了抽象表格策略类 DynamicTableRenderPolicy
我们可以自定义模板渲染策略类,继承即可,从而动态渲染的部分单元格,实现我们需求

代码实现

1.新建数据存储实体类-ServerTableData

@Data
public class ServerTableData {

    /**
     *  携带表格中真实数据
     */
    private List<RowRenderData> serverDataList;

    /**
     * 携带要分组的信息
     */
    private List<Map<String, Object>> groupDataList;

    /**
     * 需要合并的列,从0开始
     */
    private Integer mergeColumn;
}

2.新建自定义表格渲染策略类-ServerTablePolicy-

public class ServerTablePolicy extends DynamicTableRenderPolicy {
    @Override
    public void render(XWPFTable xwpfTable, Object tableData) throws Exception {
        if (null == tableData) {
            return;
        }

        // 参数数据声明
        ServerTableData serverTableData = (ServerTableData) tableData;
        List<RowRenderData> serverDataList = serverTableData.getServerDataList();
        List<Map<String, Object>> groupDataList = serverTableData.getGroupDataList();
        Integer mergeColumn = serverTableData.getMergeColumn();

        if (CollectionUtils.isNotEmpty(serverDataList)) {
            // 先删除一行, demo中第一行是为了调整 三线表 样式
            xwpfTable.removeRow(1);

            // 行从中间插入, 因此采用倒序渲染数据
            for (int i = serverDataList.size() - 1; i >= 0; i--) {
                XWPFTableRow newRow = xwpfTable.insertNewTableRow(1);
                newRow.setHeight(400);
                for (int j = 0; j < 4; j++) {
                    newRow.createCell();
                }
                // 渲染一行数据
                TableRenderPolicy.Helper.renderRow(newRow, serverDataList.get(i));
            }

            // 处理合并
            for (int i = 0; i < serverDataList.size(); i++) {
                // 获取要合并的名称那一列数据 mergeColumn代表要合并的列,从0开始
                String typeNameData = serverDataList.get(i).getCells().get(mergeColumn).getParagraphs().get(0).getContents().get(0).toString();
                for (int j = 0; j < groupDataList.size(); j++) {
                    String typeNameTemplate = String.valueOf(groupDataList.get(j).get("typeName"));
                    int listSize = Integer.parseInt(String.valueOf(groupDataList.get(j).get("listSize")));

                    // 若匹配上 就直接合并
                    if (typeNameTemplate.equals(typeNameData)) {
                        TableTools.mergeCellsVertically(xwpfTable, 0, i + 1, i + listSize);
                        groupDataList.remove(j);
                        break;
                    }
                }
            }
        }
    }
}

3.接口类

    @GetMapping("/export")
    public void export(HttpServletResponse response) throws IOException {
        // 获取模板文件流
        InputStream resourceAsStream =
                this.getClass().getResourceAsStream("/word/template.docx");
        //poi-tl 配置
        ConfigureBuilder builder = Configure.builder();
        builder.useSpringEL(false);

        Map<String,Object> map = new HashMap<>();

        // 伪造一个表格数据
        //单个表格
        ServerTableData oneTable = getServerTableData();
        map.put("oneTable",oneTable);
        builder.bind("oneTable",new ServerTablePolicy());

        //多个表格
        List<Map<String, Object>> dynamicFlag = new ArrayList<>();
        // 伪造3个表格数据
        for (int i = 0; i < 3; i++) {
            ServerTableData tableData = getServerTableData();
            Map<String, Object> dynamicTableMap = new HashMap<>();
            dynamicTableMap.put("serverListTable", tableData);
            dynamicTableMap.put("tableName", "表名");
            dynamicFlag.add(dynamicTableMap);
        }
        map.put("listTable",dynamicFlag);
        builder.bind("serverListTable",new ServerTablePolicy());

        XWPFTemplate template = XWPFTemplate.compile(Objects.requireNonNull(resourceAsStream), builder.build()).render(map);
        //输出网络流
        response.setContentType("application/octet-stream");
        response.setHeader("Content-disposition","attachment;filename=\""+"out_template.docx"+"\"");
        // HttpServletResponse response
        OutputStream out = response.getOutputStream();
        BufferedOutputStream bos = new BufferedOutputStream(out);
        template.write(bos);
        bos.flush();
        out.flush();
        PoitlIOUtils.closeQuietlyMulti(template, bos, out);
    }

    private ServerTableData getServerTableData() {
        ServerTableData serverTableData = new ServerTableData();
        List<RowRenderData> serverDataList = new ArrayList<>();
        for (int j = 0; j < 4; j++) {
            String typeName;
            RowRenderData serverData;
            if (j > 1) {
                typeName = "索隆";
                serverData = Rows.of(typeName, "喝酒", "三千世界", "无").center().create();
            }else {
                typeName = "路飞";
                serverData = Rows.of(typeName, "大鸡腿", "巨人手枪", "橡胶果实").center().create();
            }
            serverDataList.add(serverData);
        }

        List<Map<String, Object>> groupDataList = new ArrayList<>();
        Map<String, Object> groupData1 = new HashMap<>();
        groupData1.put("typeName", "索隆");
        groupData1.put("listSize", "2");
        Map<String, Object> groupData2 = new HashMap<>();
        groupData2.put("typeName", "路飞");
        groupData2.put("listSize", "2");
        groupDataList.add(groupData1);
        groupDataList.add(groupData2);

        serverTableData.setServerDataList(serverDataList);
        serverTableData.setGroupDataList(groupDataList);
        serverTableData.setMergeColumn(0);
        return serverTableData;
    }

4.效果图

java poi 动态导出word表格带合并效果,word,spring boot文章来源地址https://www.toymoban.com/news/detail-593033.html

到了这里,关于poi-tl导出word复杂表格(单元格合并,生成复杂表格)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • poi-tl的使用(动态表格的生成)

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

    2024年02月13日
    浏览(50)
  • 根据模板动态生成word(三)使用poi-tl生成word

    @ 目录 一、前言 1、什么是poi-tl 2、官方信息 2.1 源码仓库 2.2 中文文档 2.3 开源协议 3、poi-tl的优势 3.1 poi-tl和其他模板引擎的对比 3.2 poi-tl Word模板引擎支持的功能 二、基本的使用配置 1、引入依赖 1.1 Maven 1.2 Gradle 2、配置 2.1 新建配置 2.2 标签前后缀替换 2.3 加载模板 2.4 填充数

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

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

    2024年01月18日
    浏览(43)
  • JAVA poi-tl 制作word模板 表格数据行循环 带有复选框勾选的表格

            java项目实际开发中经常会遇到制作word表单且表格数据行循环功能,甚至带有复选框勾选功能,本文简单介绍如何制作模板以及使用poi-tl生成word。 提示:以下是本篇文章正文内容,下面案例可供参考 如果只用到word那么需要导入的依赖如下(本案例只需要如下2个依

    2024年04月12日
    浏览(40)
  • Java使用poi-tl生成word模板-动态数据列表

    Java使用poi-tl生成word模板-动态数据列表 第一步,添加poi-tl的依赖 第二步,准备word模板文件             模板中文本信息可以用    {{  }}   标签指定             例如在word文档中写入:{{var}} //会将word文档中的对位置的标签替换为map中的数据             模板

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

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

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

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

    2024年02月09日
    浏览(50)
  • 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日
    浏览(51)
  • POI-TL制作word

    本文相当于笔记,主要根据官方文档Poi-tl Documentation和poi-tl的使用(最全详解)_JavaSupeMan的博客-CSDN博客文章进行学习(上班够用) 两个实体类 下边测试类 word模板  生成结果:   如果想生成柱状图等,按照官网进行学习即可,以上两篇(官网,和博客学习够用)

    2024年02月10日
    浏览(52)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包