一天实现用poi-tl导出word(饼图/柱状图、文字、表格、循环word),男朋友看完直呼好家伙

用一天的时间实现了要求的word的导出,包含表格、饼图、文字、柱状图,男朋友直竖大拇指,非让我给他讲,学会以后直呼抱大腿,害,这无处安放的优秀。

一天实现用poi-tl导出word(饼图/柱状图、文字、表格、循环word),男朋友看完直呼好家伙_第1张图片

想研究的可以自己看一下接口文档 Poi-tl Documentation

咳咳,装杯开始

首先,看一下我们想要导出的文件格式

一天实现用poi-tl导出word(饼图/柱状图、文字、表格、循环word),男朋友看完直呼好家伙_第2张图片一天实现用poi-tl导出word(饼图/柱状图、文字、表格、循环word),男朋友看完直呼好家伙_第3张图片

可以看到商品详情中存在模板循环的格式,所以可以分析得到需要表格、文字、饼图、柱状图以及循环模板的要求。

那么,就可以制定文件需要的模板了,如下

一天实现用poi-tl导出word(饼图/柱状图、文字、表格、循环word),男朋友看完直呼好家伙_第4张图片

 {{?section}}{{/section}}是区块对,区块对中的模板为被循环模板。

文字部分可直接替换,表格使用对象集合即可,图表只要符合数据并写入,即可自动生成。

注意!饼图和柱状图直接在word中选择插入图表即可,然后选择编辑图表格式,给定标题就好了,wps操作如图左,word操作如图右。

一天实现用poi-tl导出word(饼图/柱状图、文字、表格、循环word),男朋友看完直呼好家伙_第5张图片

一天实现用poi-tl导出word(饼图/柱状图、文字、表格、循环word),男朋友看完直呼好家伙_第6张图片

好了,上代码!

这里我用的都是假数据,实际开发替换数据即可。

public void reportTwo(Integer evalBatchId, String startTime, String endTime, HttpServletResponse response) {
        final String fileName = "report.docx";  // 结果文件名
        final String resource = "这里是文件地址/word/test01.docx";  // 模板文件

        List 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 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> sectionsList=new ArrayList>();
        for (Report one:reportList) {
            Map tMap = new HashMap();
            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 datas = new HashMap() {
            {
                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啦!

告辞!

你可能感兴趣的:(poi,SpringBoot,java)