【java】poi-tl向word模板插入文本、表格、柱状图

本文介绍了如何在Java项目中使用poi-tl库处理Word模板,包括插入文本、表格和柱状图。重点是理解poi与poi-tl的版本对应关系,并提供了模板创建的注意事项以及代码实现的概要。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  • poi-tl版本差异性较大,如果被版本束缚,较难找到对应版本的copy代码,这时候可以参考其他版本再对照自己版本的jar包文件来对应实现。
    poi 与 poi-tl 版本对应关系 http://deepoove.com/poi-tl
  •  poi-tl官网 Poi-tl Documentation

一、导包

		<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>

<!--2.poi官网指出需要poi4.x.x版本抛弃了jdk1.7之前的版本,所以适应此版本需要将jdk升级,如果不想升级还有另一种办法就是,
使用springBoot单独做一个服务为你的主项目提供一个接口,让主项目去调用生成word流让主项目去接收即可。-->

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

二、word模板

模板

图表需要在可选文字里面加上{{picture}}标签

输出结果

三、代码实现

package com.example.demo.util;

import lombok.Data;

@Data
public class DataQuality {

    //            "数据表名",
    private String dataName;

    //            "中文名称",
    private String ChineseName;

    //            "检测数据量(条)",
    private String detTotal;

    //            "引用规则(条)",
    private String ruleNum;

    //            "不符合规划(条)",
    private String noRuleNum;

    //            "符合规则(条)",
    private String rulePassRate;

    //            "合格率"
    private String PassRate;

    public DataQuality(String dataName, String chineseName, String detTotal, String ruleNum, String noRuleNum, String rulePassRate, String passRate) {
        this.dataName = dataName;
        ChineseName = chineseName;
        this.detTotal = detTotal;
        this.ruleNum = ruleNum;
        this.noRuleNum = noRuleNum;
        this.rulePassRate = rulePassRate;
        PassRate = passRate;
    }
}
package com.example.demo.example.text;

import com.deepoove.poi.XWPFTemplate;
import com.deepoove.poi.data.*;

import com.example.demo.util.DataQuality;

import java.io.File;
import java.io.FileOutputStream;
import java.text.SimpleDateFormat;
import java.util.*;

public class qualityWordTools {
    public static void main(String[] args) throws Exception {
        final String returnurl = "D:\\result6.docx";  // 结果文件
        final String templateurl = "D:\\code\\poi-demo-master\\poi-demo\\src\\main\\resources\\质量检查报告-模板.docx";  // 模板文件
        //处理数据
        Map<String, Object> textMap = doParagraphs();

        try {
            File file = new File(templateurl);
//            模板标签渲染
            XWPFTemplate template = XWPFTemplate.compile(file).render(textMap);
            FileOutputStream out = new FileOutputStream(new File(returnurl));
            template.write(out);
            out.flush();
            out.close();
            template.close();
            System.out.println("完成");
        } catch (Exception e) {
            e.printStackTrace();
        }

    }
    public static Map<String, Object>  doParagraphs() throws Exception {
        // 文本数据
        Map<String, Object> textMap = new HashMap<String, Object>();
        // 文本数据  模板标签-替换文字
        textMap.put("unitName", "规划局");
        textMap.put("dataSource", "萍乡市规划局");//数据源
        textMap.put("unit", "萍乡市规划局");//所属单位
        textMap.put("detNum", "20");//已检测数据集(个)
        textMap.put("detTotal", "30");//检测数据总量
        textMap.put("ruleNum", "31");//引用规则(条)
        textMap.put("passRate", "36");//数据集合格率(%)
        textMap.put("healthNum", "70");//健康数据集(个)
        textMap.put("rulePassRate", "30");//规则合格率(%)
        textMap.put("score", "80");//质量得分
        textMap.put("grade", "87");//质量等级
        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
        textMap.put("time", dateFormat.format(new Date()));//时间

//       质量问题类型分布: 柱状图
//        模板中图表设置 可选文字-{{picture}}
        List<SeriesRenderData> seriesRenderData = new ArrayList<SeriesRenderData>(4);
        SeriesRenderData series1 = new SeriesRenderData("性质", new Integer[] {70,40,22,85});
        series1.setComboType(SeriesRenderData.ComboType.BAR);
        seriesRenderData.add(series1);
        //标题及x轴名称
        ChartMultiSeriesRenderData picture = Charts
                .ofMultiSeries("质量问题分布", new String[] { "完整性","有效性","唯一性","合规性"})
                .create();
        picture.setSeriesDatas(seriesRenderData);
        textMap.put("picture", picture);

//        数据集质量情况分析:{{#table1}}标签
//      创建表格
        TableRenderData tableRenderData = Tables.ofWidth(16f).center().create();
        // 第0行居中且加粗的表格
        RowRenderData row0 = Rows.of("数据表名", "中文名称","检测数据量(条)","引用规则(条)","不符合规划(条)","符合规则(条)","合格率")
                .textBold().center().create();

        tableRenderData.addRow(row0);
        // 表格测试数据
        ArrayList<DataQuality> list = new ArrayList<>();
        DataQuality data1 = new DataQuality("BDC_REQ", "不动产过户信息", "154", "2", "1", "153", "99.289%");
        DataQuality data2 = new DataQuality("BDC_ZDJBXX", "萍乡市公积金办件受理信息","158750","2","4781","3568","99.83%");
        DataQuality data3 = new DataQuality("BDC_ZRZ", "不动产不动产登记证明","100263","2","367","2579","99.39%");
        list.add(data1);
        list.add(data2);
        list.add(data3);

        for (DataQuality dataQuality : list) {
//            表格行数据
            RowRenderData row1 = Rows.create(dataQuality.getDataName(),dataQuality.getChineseName(),dataQuality.getDetTotal(),
                    dataQuality.getRuleNum(),dataQuality.getNoRuleNum(),dataQuality.getRulePassRate(),dataQuality.getPassRate());
            tableRenderData.addRow(row1);
        }
        //最后一行
        RowRenderData row2 = Rows.create("总计", "3","259167","6","7361","6300","89.543%");
        tableRenderData.addRow(row2);
        textMap.put("table1", tableRenderData);

//       质量问题明细情况:{{#table2}}标签
        ArrayList<TableRenderData> tableLists = new ArrayList<>();
        List<Map<String, Object>> tableList = new ArrayList<>();
        for (DataQuality dataQuality : list) {
            Map<String, Object> tableMap=new HashMap<>();
            TableRenderData table = Tables.ofWidth(16f).center().create();
//            合并单元格规则
            MergeCellRule.MergeCellRuleBuilder mergeCellRuleBuilder = MergeCellRule.builder();
            mergeCellRuleBuilder.map(MergeCellRule.Grid.of(0, 0), MergeCellRule.Grid.of(0, 1));
            mergeCellRuleBuilder.map(MergeCellRule.Grid.of(0, 2), MergeCellRule.Grid.of(0, 4));

            RowRenderData row00 = Rows.of("表名:"+dataQuality.getDataName(), null,"中文名:"+dataQuality.getChineseName(),
                    null,null,null).textBold().create();
            table.addRow(row00).setMergeRule(mergeCellRuleBuilder.build());
            // 第1行居中且加粗的表格
            RowRenderData row1 = Rows.of("规划名称", "规划类型","字段名","字段中文名","检测数据量(条)","问题数据量(条)")
                    .center().create();
            table.addRow(row1);
            // 表格行数据
            RowRenderData row3 = Rows.create("字段必填校验","字段级规则",dataQuality.getDataName(),
                    dataQuality.getChineseName(),dataQuality.getNoRuleNum(),dataQuality.getNoRuleNum());
            table.addRow(row3);
            tableLists.add(table);
            tableMap.put("table3",table);
            tableList.add(tableMap);
        }
        textMap.put("table2", tableList);

        return textMap;
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值