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