java使用poi修改word文档中图表数据,并更新,返回流

java使用poi修改word文档中图表数据,并更新,返回流

public void forecastLonganalyseReport(HttpServletResponse response, String month) throws IOException {
    SimpleDateFormat sdf0 = new SimpleDateFormat("yyyy");
    SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM");
    SimpleDateFormat sdf2 = new SimpleDateFormat("yyyy-MM-dd");
        InputStream in = null;
        XSSFWorkbook workbook = null;
        BufferedOutputStream bos = null;
        try {
            Date startDate = sdf1.parse(month);
            Calendar calendar = Calendar.getInstance();
            calendar.setTime(startDate);
            calendar.add(Calendar.MONTH, 1);
            calendar.add(Calendar.DAY_OF_MONTH, -1);
            Date endDate = calendar.getTime();
            String endFormat = sdf2.format(endDate);
            JSONArray array = forecastLongAnalyse(sdf2.format(startDate), endFormat, 3, 3); //需要修改的数据
            in = IesEpadSjxhForecastLongServiceImpl.class.getResourceAsStream("/template/longReportTemplate.docx");  //读取word文档
            XWPFDocument doc = new XWPFDocument(in);
            List<XWPFChart> charts = doc.getCharts();
            XWPFChart xwpfChart = charts.get(0);

            workbook = xwpfChart.getWorkbook();
            XSSFSheet sheetAt = workbook.getSheetAt(0);
            String sheetName = sheetAt.getSheetName();
            if ("中长期".equals(sheetName)) {
                for (int i = 0; i < 31; i++) {
                    XSSFRow row = sheetAt.getRow(i + 1);
                    if (row == null) {
                        sheetAt.createRow(i + 1);
                        row = sheetAt.getRow(i + 1);
                    }
                    if (row.getCell(0) == null) row.createCell(0);
                    if (row.getCell(1) == null) row.createCell(1);
                    if (row.getCell(2) == null) row.createCell(2);
                    if (row.getCell(3) == null) row.createCell(3);
                    if (row.getCell(4) == null) row.createCell(4);
                    if (row.getCell(5) == null) row.createCell(5);

                    JSONObject init = array.getJSONObject(i);
                    if (init != null) {
                        row.getCell(0).setCellValue(sdf2.parse(init.get("date") + ""));
                        row.getCell(1).setCellValue(Double.valueOf(init.get("Check_pe") + ""));
                        row.getCell(2).setCellValue(Double.valueOf(init.get("Check_pr") + ""));
                        row.getCell(3).setCellValue(Double.valueOf(init.get("Deal_pe") + ""));
                        row.getCell(4).setCellValue(Double.valueOf(init.get("Deal_pr") + ""));
                        row.getCell(5).setCellValue(Double.valueOf(init.get("longPr") + ""));
                    }
                }

            }
            //刷新图表
            refreshChartData(xwpfChart, sheetAt);

            response.setHeader("Content-Disposition", "attachment; filename=" + (new Date()).getTime() + ".docx");
            bos = new BufferedOutputStream(response.getOutputStream());
            doc.write(bos);
            bos.flush();
            bos.close();
            workbook.close();
            in.close();

        } catch (Exception e) {
            log.error("生成报告失败", e);
        }finally {
            if (bos != null){
                bos.close();
            }
            if (workbook != null){
                workbook.close();
            }
            if (in != null){
                in.close();
            }
        }
    }

    // 刷新word图表的方法

    /**
     * 注意:每一列series,都需要各自刷新一下
     *
     * @param chart
     * @param wordSheet
     */
    private static void refreshChartData(XWPFChart chart, XSSFSheet wordSheet) {
        // 获取所有图表数据
        List<XDDFChartData> chartDataList = chart.getChartSeries();

        for (XDDFChartData chartData : chartDataList) {
            //chartData.getSeriesCount() == 2 表示图标的2两个柱形图,3表示3个折线图
            if (chartData.getSeriesCount() == 2) {
                XDDFChartData.Series series1 = chartData.getSeries(0);
                XDDFChartData.Series series3 = chartData.getSeries(1);
                CellRangeAddress nameAddresses = new CellRangeAddress(1, 31, 0, 0);
                CellRangeAddress valueAddresses1 = new CellRangeAddress(1, 31, 1, 1);
                CellRangeAddress valueAddresses3 = new CellRangeAddress(1, 31, 3, 3);
                XDDFCategoryDataSource lineName = XDDFDataSourcesFactory.fromStringCellRange(wordSheet, nameAddresses);
                XDDFNumericalDataSource<Double> lineVale1 = XDDFDataSourcesFactory.fromNumericCellRange(wordSheet, valueAddresses1);
                XDDFNumericalDataSource<Double> lineVale3 = XDDFDataSourcesFactory.fromNumericCellRange(wordSheet, valueAddresses3);
                series1.replaceData(lineName, lineVale1);
                series3.replaceData(lineName, lineVale3);
            } else if (chartData.getSeriesCount() == 3) {
                XDDFChartData.Series series2 = chartData.getSeries(0);
                XDDFChartData.Series series4 = chartData.getSeries(1);
                XDDFChartData.Series series5 = chartData.getSeries(2);
                CellRangeAddress nameAddresses = new CellRangeAddress(1, 31, 0, 0);
                CellRangeAddress valueAddresses2 = new CellRangeAddress(1, 31, 2, 2);
                CellRangeAddress valueAddresses4 = new CellRangeAddress(1, 31, 4, 4);
                CellRangeAddress valueAddresses5 = new CellRangeAddress(1, 31, 5, 5);
                XDDFCategoryDataSource lineName = XDDFDataSourcesFactory.fromStringCellRange(wordSheet, nameAddresses);
                XDDFNumericalDataSource<Double> lineVale2 = XDDFDataSourcesFactory.fromNumericCellRange(wordSheet, valueAddresses2);
                XDDFNumericalDataSource<Double> lineVale4 = XDDFDataSourcesFactory.fromNumericCellRange(wordSheet, valueAddresses4);
                XDDFNumericalDataSource<Double> lineVale5 = XDDFDataSourcesFactory.fromNumericCellRange(wordSheet, valueAddresses5);
                series2.replaceData(lineName, lineVale2);
                series4.replaceData(lineName, lineVale4);
                series5.replaceData(lineName, lineVale5);
            } else {
                log.error("模板不对!");
                return;
            }
            // 刷新图表
            chart.plot(chartData);
        }
    }

  

 

posted @ 2025-06-05 15:32  张安东  阅读(98)  评论(0)    收藏  举报