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

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、效果图

 

posted on   五官一体即忢  阅读(420)  评论(0编辑  收藏  举报

相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· DeepSeek 开源周回顾「GitHub 热点速览」
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

导航

统计

点击右上角即可分享
微信分享提示