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

用一天的时间实现了要求的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啦!

告辞!

  • 0
    点赞
  • 47
    收藏
    觉得还不错? 一键收藏
  • 15
    评论
要在POI导出柱状图,您需要使用Apache POI的XSSF图表类。以下是一个简单的示例代码,可以用于创建一个简单的柱状图并将其导出到Excel文件中: ```java import java.io.FileOutputStream; import org.apache.poi.ss.usermodel.*; import org.apache.poi.ss.util.*; import org.apache.poi.xssf.usermodel.*; public class BarChartExample { public static void main(String[] args) throws Exception { // Create a Workbook XSSFWorkbook workbook = new XSSFWorkbook(); // Create a Sheet XSSFSheet sheet = workbook.createSheet("Bar Chart"); // Create some data for the chart Object[][] data = { {"Category", "Value"}, {"A", 10}, {"B", 20}, {"C", 30}, {"D", 40}, {"E", 50} }; // Create a Chart XSSFDrawing drawing = sheet.createDrawingPatriarch(); XSSFClientAnchor anchor = drawing.createAnchor(0, 0, 0, 0, 0, 5, 10, 15); XSSFChart chart = drawing.createChart(anchor); // Define the chart data source XSSFDrawing drawing2 = chart.getSheet().createDrawingPatriarch(); XSSFChartLegend legend = chart.getOrCreateLegend(); XSSFChartAxis bottomAxis = chart.getChartAxisFactory().createCategoryAxis(AxisPosition.BOTTOM); XSSFValueAxis leftAxis = chart.getChartAxisFactory().createValueAxis(AxisPosition.LEFT); leftAxis.setCrosses(AxisCrosses.AUTO_ZERO); XSSFChartData dataChart = chart.getChartDataFactory().createBarChart( DataSources.fromArray(data), bottomAxis, leftAxis ); dataChart.setBarGrouping(BarGrouping.CLUSTERED); // Output the Workbook to a file FileOutputStream fileOut = new FileOutputStream("BarChartExample.xlsx"); workbook.write(fileOut); fileOut.close(); // Close the Workbook workbook.close(); } } ``` 这个示例代码创建了一个包含柱状图的Excel文件,该图表显示了一些简单的数据。您可以根据需要更改数据源和图表类型。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 15
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值