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

浙公网安备 33010602011771号