首页 > 编程语言 >java根据模板生成表格和列表

java根据模板生成表格和列表

时间:2023-10-31 11:58:03浏览次数:40  
标签:java String 表格 MergeCellRule rowRenderData Grid new tableData 模板

1、模板

所有的标签都是以 {{开始,以}} 结束。

  • {{template}} 文本

  • {{@template}} 图片

  • {{#template}} 表格

  • {{*template}} 列表

  • {{+template}} Word 文档合并

  • {{?template}}{{/template}} if 和 foreach 功能

 2、引入包

<!--    POI 依赖 使用xlsx xml的格式(即XSSFWorkbook)   -->
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi</artifactId>
            <version>5.2.2</version>
        </dependency>
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi-ooxml</artifactId>
            <version>5.2.2</version>
        </dependency>
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi-scratchpad</artifactId>
            <version>3.17</version>
        </dependency>
        <!--     poi模板导入,主力包      -->
        <dependency>
            <groupId>com.deepoove</groupId>
            <artifactId>poi-tl</artifactId>
            <version>1.12.1</version>
        </dependency>

3、代码片段

package entity;

import com.deepoove.poi.data.TableRenderData;
import lombok.Data;

import java.util.ArrayList;
import java.util.Map;

/**
 * @program: ht
 * @ClassName TableData
 * @description:
 * @author: 黄涛
 * @create: 2023-10-31 11:00
 * @Version 1.0
 **/
@Data
public class TableData {

    /**
     * 标题
     */
    private String title;

    /**
     * 表格
     */
    private TableRenderData table;

    private String[][] tableList;

    /**
     * 总价
     */
    private String totalPrice;

    /**
     * 列表
     */
    private ArrayList<Object> itemList;

}
TableData tableData = new TableData();
        /* 假数据 */
        tableData.setTitle("附件1-报价明细表");
        String[][] strings = new String[20][5];
        for (int i = 0; i < 20; i++) {
            strings[i] = new String[]{String.valueOf(i+1), "EREWHON"+i, "鸡蛋"+i, "维生素"+i, "675"+i};
        }
        tableData.setTableList(strings);

        // 模版路径
        String systemDir = System.getProperty("user.dir");
        String wordPath = systemDir + "/staticFile/";
        String modelName = "表格.docx";

        // 手绘表格
        // 表头
        RowRenderData row0 = Rows.of("项号", "编号", "种类", "", "价格").center().create();
        RowRenderData row1 = Rows.of("项号", "编号", "蛋白质", "微量元素", "价格").center().create();

        int length = 0;
        if (tableData.getTableList() != null) {
            length = tableData.getTableList().length;
        }
        // 表格数据 加上2行表头 再加上最后一行总价
        RowRenderData[] rowRenderData = new RowRenderData[length + 3];
        rowRenderData[0] = row0;
        rowRenderData[1] = row1;
        // 计算价钱
        BigDecimal totalPrice = new BigDecimal("0");
        for (int i = 0; i < length; i++) {
            rowRenderData[i + 2] = Rows.of(tableData.getTableList()[i]).center().create();
            String s = tableData.getTableList()[i][4];
            BigDecimal bigDecimal = new BigDecimal(s);
            totalPrice = totalPrice.add(bigDecimal);
        }

        RowRenderData row4 = Rows.of("总价", "", "", "", totalPrice.toString()).center().create();
        rowRenderData[rowRenderData.length - 1] = row4;
        // 表格合并,根据坐标
        MergeCellRule rule = MergeCellRule.builder().map(MergeCellRule.Grid.of(0, 0), MergeCellRule.Grid.of(1, 0)).
                map(MergeCellRule.Grid.of(0, 1), MergeCellRule.Grid.of(1, 1)).
                map(MergeCellRule.Grid.of(0, 2), MergeCellRule.Grid.of(0, 3)).
                map(MergeCellRule.Grid.of(0, 4), MergeCellRule.Grid.of(1, 4)).
                map(MergeCellRule.Grid.of(rowRenderData.length - 1, 0), MergeCellRule.Grid.of(rowRenderData.length - 1, 3)).
                build();

        TableRenderData table = Tables.of(rowRenderData).mergeRule(rule).create();
        // 数据封装
        tableData.setTable(table);





        //插入列表
        // 注意:此处用的是 <区块对> key是字符串,value则放置一个集合,类似于模板引擎的foreach标签
        ArrayList<Object> stateList = CollUtil.newArrayList();
        // 模拟从mysql查询数据,改造为word模板所需的数据结构
        List<String> stateListFromMySQL = Arrays.asList("本人所递交的所有办理人才引进材料及填写的情况均属实;"
                , "我已认真阅读以上内容并确认;"
                , "若在申请期间信息变更不做变更。若违反,本人愿意承担由此产生的后果。");
        for (int i = 0; i < stateListFromMySQL.size(); i++) {
            HashMap<String, Object> stateItem = new HashMap<>();
            stateItem.put("item", stateListFromMySQL.get(i) + "");
            stateList.add(stateItem);
        }
        tableData.setItemList(stateList);





        // 传入模板模板地址+信息数据
        XWPFTemplate render = XWPFTemplate.compile(wordPath + modelName).render(tableData);

      // 此处是利用File,直接在本地创建文件,将参数替换后的文件流写入到该文件,word就是最终的结果
        File word = new File(systemDir + "/downFile/" + File.separator +
                IdUtil.getSnowflake(1,1).nextId() + ".docx");
        try {
            render.writeToFile(word.getAbsolutePath());
        } catch (IOException e) {
            throw new RuntimeException(e);
        }

4、效果图

 

标签:java,String,表格,MergeCellRule,rowRenderData,Grid,new,tableData,模板
From: https://www.cnblogs.com/privateLogs/p/17799922.html

相关文章

  • Java 使用`Collectors.groupingBy`计算百分比
    要使用Collectors.groupingBy计算百分比,你需要先对数据进行分组,然后计算每个组内元素的百分比。假设你有一个包含整数的列表,你想要按照它们的奇偶性进行分组,并计算每个组内元素的百分比。以下是一个使用Collectors.groupingBy和自定义收集器的示例代码:importjava.util.Arrays;......
  • java实现文件夹上传功能实例代码(SpringBoot框架)
    前言有时我们后台管理等服务可能会有这样一个简单需求,就是根据文件夹将整个文件夹下的所有资源都上传到我们的服务器上,本人也是搜索了大量资料,最终以最简单便捷的方式实现该功能,具体操作步骤如下一、前端如何设置上传组件并将资源上传到后台服务这里的项目框架为若依VUE版本......
  • java8 集合操作功能
    Java8引入了许多新的集合操作功能,包括但不限于以下几项:forEach:使用Lambda表达式遍历集合中的每个元素。stream:将集合转换为流,以便进行各种操作,如过滤、映射、排序等。filter:根据指定的条件过滤集合中的元素,并返回过滤后的结果。map:将集合中的每个元素映射为另一个元素,并返回......
  • 【面试题】详解JavaScript中的Map()
    JavaScript中的Map()JavaScript是一种动态、解释性的编程语言,用于开发web上的动态页面和交互式应用程序。与其他编程语言相比,JavaScript拥有更加灵活的内置数据类型,并且拥有更高级别的调试和错误处理工具。JavaScript的核心特征之一就是其内置的Map()数据结构,本文将详细介绍JavaScr......
  • 超市账单管理系统 JAVA开源项目 毕业设计
    一、摘要基于JAVA+Vue+SpringBoot+MySQL的超市账单管理系统,包含供应商模块、商品管理模块、超市账单模块,还包含系统自带的用户管理、部门管理、角色管理、菜单管理、日志管理、数据字典管理、文件管理、图表展示等基础模块,超市账单管理系统基于角色的访问控制,给超市管理员、店长使......
  • 医院门诊预约挂号系统 JAVA开源项目 毕业设计
    一、摘要基于JAVA+Vue+SpringBoot+MySQL的医院门诊预约挂号系统,包含了科室管理模块、医生管理模块、预约挂号模块、医院新闻模块和留言板模块,还包含系统自带的用户管理、部门管理、角色管理、菜单管理、日志管理、数据字典管理、文件管理、图表展示等基础模块,医院门诊预约挂号系......
  • 校园电商物流云平台 JAVA开源项目 毕业设计
    一、摘要基于JAVA+Vue+SpringBoot+MySQL的校园电商物流云平台,包含了商品管理模块、快递公司模块、物流订单模块,还包含系统自带的用户管理、部门管理、角色管理、菜单管理、日志管理、数据字典管理、文件管理、图表展示等基础模块,校园电商物流云平台基于角色的访问控制,给商家、物流......
  • 考研专业课程管理系统 JAVA开源项目 毕业设计
    一、摘要基于JAVA+Vue+SpringBoot+MySQL的考研专业课程管理系统,包含了考研课程、考研专业、考研注册、考研院校和高校教师模块,还包含系统自带的用户管理、部门管理、角色管理、菜单管理、日志管理、数据字典管理、文件管理、图表展示等基础模块,考研专业课程管理系统基于角色的访问......
  • java通过ssl连接mysql(linux)
    环境:Os:centos7mysql:5.7.29java运行客户端:windows10 1.查看服务器的证书文件mysql数据data目录下[root@localhostdata]#pwd/opt/mysql57/data[root@localhostdata]#ls-al*.pem-rw-------.1mysqlmysql1676Oct3005:22ca-key.pem-rw-r--r--.1mysqlmysq......
  • java怎么递归
    在Java中,递归(Recursion)是指一个方法在其内部调用自身的过程。递归通常用于解决可以被分解成相似子问题的问题。在编写递归函数时,需要定义递归的结束条件,以防止无限循环。下面是一个简单的递归示例,演示了如何使用递归计算一个数的阶乘:publicclassMain{publicstaticvoi......