用一天的时间实现了要求的word的导出,包含表格、饼图、文字、柱状图,男朋友直竖大拇指,非让我给他讲,学会以后直呼抱大腿,害,这无处安放的优秀。
想研究的可以自己看一下接口文档 Poi-tl Documentation
咳咳,装杯开始
首先,看一下我们想要导出的文件格式
可以看到商品详情中存在模板循环的格式,所以可以分析得到需要表格、文字、饼图、柱状图以及循环模板的要求。
那么,就可以制定文件需要的模板了,如下
{{?section}}{{/section}}是区块对,区块对中的模板为被循环模板。
文字部分可直接替换,表格使用对象集合即可,图表只要符合数据并写入,即可自动生成。
注意!饼图和柱状图直接在word中选择插入图表即可,然后选择编辑图表格式,给定标题就好了,wps操作如图左,word操作如图右。
好了,上代码!
这里我用的都是假数据,实际开发替换数据即可。
public void reportTwo(Integer evalBatchId, String startTime, String endTime, HttpServletResponse response) {
final String fileName = "report.docx"; // 结果文件名
final String resource = "这里是文件地址/word/test01.docx"; // 模板文件
List<Report> reportList = new ArrayList<>();
Report report1 = new Report();
report1.setCount(1);
report1.setName("家居");
report1.setNum(6724);
report1.setScore(62.86);
Report report2 = new Report();
report2.setCount(2);
report2.setName("文具");
report2.setNum(1024);
report2.setScore(31.89);
reportList.add(report1);
reportList.add(report2);
List<PointMessage> list = new ArrayList<>();
PointMessage p = new PointMessage();
p.setRank(1);
p.setName("测试");
p.setNum(66);
p.setScore(99.99);
list.add(p);
list.add(p);
ChartSingleSeriesRenderData pie = Charts
.ofSingleSeries("商品类型", new String[]{"家居","厨房用品","文具"})
.series("商品数量",new Integer[]{66,13,21})
.create();
ChartMultiSeriesRenderData chart = Charts
.ofMultiSeries(null, new String[]{"家居","厨房用品","文具"})
.addSeries("商品数量", new Integer[]{66,13,21})
.create();
List<Map<String,Object>> sectionsList=new ArrayList<Map<String,Object>>();
for (Report one:reportList) {
Map<String,Object> tMap = new HashMap<String, Object>();
tMap.put("counts", NumberUtil.int2chineseNum(one.getCount()));
tMap.put("name",one.getName());
tMap.put("num",one.getNum());
tMap.put("score",one.getScore());
tMap.put("pointMessage", list);
tMap.put("combChart", chart);
sectionsList.add(tMap);
}
Map<String, Object> datas = new HashMap<String, Object>() {
{
put("reports", reportList);
put("pieChart", pie);
put("sections", sectionsList);
}
};
try {
LoopRowTableRenderPolicy policy = new LoopRowTableRenderPolicy();
Configure config = Configure.builder()
.bind("reports", policy).bind("pointMessage", policy).build();
InputStream in = new FileInputStream(new File(resource));
XWPFTemplate template = XWPFTemplate.compile(in,config).render(datas);
OutputStream fos = response.getOutputStream();
response.addHeader("Content-Disposition", "attachment;filename=\"" + new String(fileName.getBytes("UTF-8"), "iso-8859-1") + "\"");
response.setCharacterEncoding("utf-8");
response.setContentType("application/octet-stream");
response.addHeader("Content-Type", "application/vnd.ms-word");
response.addHeader("Content-Type", "application/x-msword");
template.write(fos);
fos.flush();
fos.close();
} catch (Exception e) {
e.printStackTrace();
}
}
至此就OK啦!
告辞!