java 根据已有ppt模板修改其内容

该代码实现了一个自动化工具,用于根据数据库数据定期更新PowerPoint(PPT)报表中的图表内容。通过遍历PPT中的每一页幻灯片和每个图表,识别图表类型(如饼图、柱状图、线形图、面积图),然后更新对应的图表数据。更新过程涉及到读取模板PPT,解析图表类型,绑定新的数据源,并保存为新的PPT文件。此工具适用于需要定期生成报告且数据更新频繁的场景。
摘要由CSDN通过智能技术生成

现有需求, 根据数据库数据, 定期更新 ppt 报表内容
本文修改内容 主要是 ppt中的图表;

测试ppt:
在这里插入图片描述
代码:

package org.springblade.bigdata.ureport.service.impl;

import java.io.*;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.apache.poi.ooxml.POIXMLDocumentPart;
import org.apache.poi.xslf.usermodel.*;
import org.openxmlformats.schemas.drawingml.x2006.main.CTTable;
import org.openxmlformats.schemas.drawingml.x2006.main.CTTableProperties;
/**
 * PPT图表测试类
 *
 * @author cy
 */
public class PPTGraphDemo {

	public static void main(String[] args) {
//		String basePath = System.getProperty("user.dir") + File.separator + "testFile";
		String templateFile = "G:/sdl/test.pptx";
		String destFile = "G:/sdl/dest.pptx";
		System.out.println("templateFile" + templateFile + " destFile:" + destFile);
		String result = createNewPPT(templateFile, destFile);
		System.out.println(result);
	}

	public static String createNewPPT(String templateFile, String destFile) {
		String result = "success";
		XMLSlideShow pptx = null;
		try {
			InputStream is = new FileInputStream(new File(templateFile));
//			InputStream resourceAsStream = PPTGraphDemo.class.getResourceAsStream("/templates/demo.pptx");
			// 打开模板ppt
			pptx = new XMLSlideShow(is);

			// 打印ppt中的图表信息
			PPTGrapthUtils.judgeGraphSheetType(pptx);
			// 获取ppt中的每一页幻灯片并遍历
			for (XSLFSlide slide : pptx.getSlides()) {
/*				List<XSLFShape> shapes = slide.getShapes();
				for (XSLFShape shape : shapes) {
					if (shape instanceof XSLFTable) {
						System.out.println("我是表格哎");
						XSLFSheet sheet = ((XSLFTable) shape).getSheet();
						List<XSLFTableRow> rows = ((XSLFTable) shape).getRows();
						for (int x = 0; x < rows.size(); x++) {
							List<XSLFTableCell> cells = rows.get(x).getCells();
							for (int y = 0; y < cells.size(); y++) {
								String text = cells.get(y).getText();
								System.out.println(text);
								XSLFTableCell xslfTextParagraphs = cells.get(y);
								xslfTextParagraphs.setText("sss");
							}
						}
					}
				}*/
				// 维护图表数据
				chartData(slide);
			}
			// 保存文件
			OutputStream out = new FileOutputStream(destFile);
			pptx.write(out);
			out.close();

		} catch (Exception e) {
			result = e.toString();
		} finally {
			if (pptx != null) {
				try {
					pptx.close();
				} catch (IOException e) {
					result = e.toString();
				}
			}
		}

		return result;
	}

	/**
	 * 图表数据更新
	 * @param slide
	 */
	public static void chartData(XSLFSlide slide){
		// 获取当前幻灯片中的 Document
		for (POIXMLDocumentPart part : slide.getRelations()) {
			// 判断 Document 是否是图表类型
			if (part instanceof XSLFChart) {
				// 判断图表类型
				List<String> graphType = PPTGrapthUtils.getGraphType((XSLFChart) part);
				graphType.stream().forEach(type->{
					switch (type){
						case "pie" : {
							// 获取饼图数据
							GraphData graphData = getGraphData();
							// 更新数据
							PPTGrapthUtils.refreshPieGraph((XSLFChart) part, graphData);
							break;
						}
						case "bar" : {
							// 获取柱状图数据
//							GraphData graphData = getGraphData();
							Map<String, List<SeriesData>> graphDataMap = getGraphDataMap();
							// 更新数据
							PPTGrapthUtils.refreshBarGraph((XSLFChart) part, graphDataMap);
							break;
						}
						case "line" : {
							// 获取线形图数据
							Map<String, List<SeriesData>> graphDataMap = getGraphDataMap();
							// 更新数据
							PPTGrapthUtils.refreshLineGraph((XSLFChart) part, graphDataMap);
							break;
						}
						case "area" : {
							// 获取面积图数据
							GraphData graphData = getGraphData();
							// 更新数据
							PPTGrapthUtils.refreshAreaGraph((XSLFChart) part, graphData);
							break;
						}
						default: break;
					}
				});
			}
		}
	}


	private static GraphData getGraphData() {
		List<SeriesData> dataList = new ArrayList<SeriesData>();
		SeriesData seriesData = new SeriesData("优", 10);
		dataList.add(seriesData);
		seriesData = new SeriesData("中", 150);
		dataList.add(seriesData);
		seriesData = new SeriesData("及格", 80);
		dataList.add(seriesData);
		seriesData = new SeriesData("不及格", 20);
		dataList.add(seriesData);
		GraphData graphData = new GraphData("一班", dataList);
		return graphData;
	}

	/**
	 * sdl
	 * @return
	 */
	private static Map<String,List<SeriesData>> getGraphDataMap() {
		List<SeriesData> dataList = new ArrayList<SeriesData>();
		SeriesData seriesData = new SeriesData("优", 10);
		dataList.add(seriesData);
		seriesData = new SeriesData("中", 150);
		dataList.add(seriesData);
		seriesData = new SeriesData("及格", 80);
		dataList.add(seriesData);
		seriesData = new SeriesData("不及格", 20);
		dataList.add(seriesData);

		List<SeriesData> dataList1 = new ArrayList<SeriesData>();
		SeriesData seriesData1 = new SeriesData("优", 20);
		dataList1.add(seriesData1);
		seriesData1 = new SeriesData("中", 160);
		dataList1.add(seriesData1);
		seriesData1 = new SeriesData("及格", 70);
		dataList1.add(seriesData1);
		seriesData1 = new SeriesData("不及格", 40);
		dataList1.add(seriesData1);


		List<SeriesData> dataList2 = new ArrayList<SeriesData>();
		SeriesData seriesData2 = new SeriesData("优", 50);
		dataList2.add(seriesData2);
		seriesData2 = new SeriesData("中", 80);
		dataList2.add(seriesData2);
		seriesData2 = new SeriesData("及格", 30);
		dataList2.add(seriesData2);
		seriesData2 = new SeriesData("不及格", 90);
		dataList2.add(seriesData2);

		Map<String,List<SeriesData>> resMap = new HashMap<>();
		resMap.put("一班",dataList);
		resMap.put("二班",dataList1);
		resMap.put("三班",dataList2);
		return resMap;
	}
}


package org.springblade.bigdata.ureport.service.impl;

import java.io.IOException;
import java.io.OutputStream;
import java.util.*;

import org.apache.poi.ooxml.POIXMLDocumentPart;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.ss.util.CellRangeAddress;
import org.apache.poi.ss.util.CellReference;
import org.apache.poi.xslf.usermodel.XMLSlideShow;
import org.apache.poi.xslf.usermodel.XSLFChart;
import org.apache.poi.xslf.usermodel.XSLFSlide;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.openxmlformats.schemas.drawingml.x2006.chart.CTAreaChart;
import org.openxmlformats.schemas.drawingml.x2006.chart.CTAreaSer;
import org.openxmlformats.schemas.drawingml.x2006.chart.CTAxDataSource;
import org.openxmlformats.schemas.drawingml.x2006.chart.CTBarChart;
import org.openxmlformats.schemas.drawingml.x2006.chart.CTBarSer;
import org.openxmlformats.schemas.drawingml.x2006.chart.CTChart;
import org.openxmlformats.schemas.drawingml.x2006.chart.CTLineChart;
import org.openxmlformats.schemas.drawingml.x2006.chart.CTLineSer;
import org.openxmlformats.schemas.drawingml.x2006.chart.CTNumData;
import org.openxmlformats.schemas.drawingml.x2006.chart.CTNumDataSource;
import org.openxmlformats.schemas.drawingml.x2006.chart.CTNumVal;
import org.openxmlformats.schemas.drawingml.x2006.chart.CTPieChart;
import org.openxmlformats.schemas.drawingml.x2006.chart.CTPieSer;
import org.openxmlformats.schemas.drawingml.x2006.chart.CTPlotArea;
import org.openxmlformats.schemas.drawingml.x2006.chart.CTSerTx;
import org.openxmlformats.schemas.drawingml.x2006.chart.CTStrData;
import org.openxmlformats.schemas.drawingml.x2006.chart.CTStrVal;
import org.springblade.core.tool.utils.Func;

/**
 * PPT公具类
 *
 * @author CAOYONG
 */
public class PPTGrapthUtils {
	public static void updateGraph(XSLFChart chart, GraphData graphData, String type) {

		if ("pie".equalsIgnoreCase(type)) {
			PPTGrapthUtils.refreshPieGraph(chart, graphData);
		} else if ("bar".equalsIgnoreCase(type)) {
			refreshBarGraph(chart, graphData);
		} else if ("line".equalsIgnoreCase(type)) {
			refreshLineGraph(chart, graphData);
		} else if ("area".equalsIgnoreCase(type)) {
			refreshAreaGraph(chart, graphData);
		}

		System.out.println("updateGraph type:" + type);
	}

	/**
	 * 判断PPT图表类型(注意需要依赖:ooxml-schemas-1.1.jar)
	 *
	 * @param pptx
	 */
	public static void judgeGraphSheetType(XMLSlideShow pptx) {
		int pageIdx = 1;
		for (XSLFSlide slide : pptx.getSlides()) {
			for (POIXMLDocumentPart part : slide.getRelations()) {
				if (part instanceof XSLFChart) {
					XSLFChart chart = (XSLFChart) part;
					CTPlotArea plot = chart.getCTChart().getPlotArea();
					judgeGraphSheetType(plot, pageIdx);
				}
			}

			pageIdx++;
		}
	}

	// 具体判断
	private static void judgeGraphSheetType(CTPlotArea plot, int pageIdx) {
		StringBuffer infos = new StringBuffer();
		if (null != plot && plot.getBarChartList().size() > 0) {
			infos.append("pageIdx:" + pageIdx + " has 柱状图");
			infos.append(" DetailInfo: \n ");
			for (CTBarSer ser : plot.getBarChartList().get(0).getSerList()) {
				infos.append(getGraphTitle(ser.getTx()));
				infos.append(" ");
				String info = getGraphDetailInfo(ser.getCat());
				ser.getTx();
				if (info.length() > 0) {
					infos.append(info + "\n");
				}
			}
		} else if (null != plot && plot.getPieChartList().size() > 0) {
			infos.append("pageIdx:" + pageIdx + " has 圆饼图");
			infos.append(" DetailInfo: \n ");
			for (CTPieSer ser : plot.getPieChartList().get(0).getSerList()) {
				infos.append(getGraphTitle(ser.getTx()));
				infos.append(" ");
				String info = getGraphDetailInfo(ser.getCat());
				if (info.length() > 0) {
					infos.append(info + "\n");
				}
			}
		} else if (null != plot && plot.getLineChartList().size() > 0) {
			infos.append("pageIdx:" + pageIdx + " has 线性图");
			infos.append(" DetailInfo: \n ");
			for (CTLineSer ser : plot.getLineChartList().get(0).getSerList()) {
				infos.append(getGraphTitle(ser.getTx()));
				infos.append(" ");
				String info = getGraphDetailInfo(ser.getCat());
				if (info.length() > 0) {
					infos.append(info + "\n");
				}
			}
		} else if (null != plot && plot.getAreaChartList().size() > 0) {
			infos.append("pageIdx:" + pageIdx + " has 面积图");
			infos.append(" DetailInfo: \n ");
			for (CTAreaSer ser : plot.getAreaChartList().get(0).getSerList()) {
				infos.append(getGraphTitle(ser.getTx()));
				infos.append(" ");
				String info = getGraphDetailInfo(ser.getCat());
				if (info.length() > 0) {
					infos.append(info + "\n");
				}
			}
		}
		// 还可以判断其它图

		System.out.println(infos.toString());
	}

	// 得到图表标题
	private static String getGraphTitle(CTSerTx tx) {
		StringBuilder infos = new StringBuilder();
		if (null != tx && null != tx.getStrRef()) {
			for (CTStrVal val : tx.getStrRef().getStrCache().getPtList()) {
				infos.append("Title ID:" + val.getIdx() + " V:" + val.getV());
			}

			infos.append("\n");
		}

		return infos.toString();
	}

	// 得到第系值
	private static String getGraphDetailInfo(CTAxDataSource cat) {
		StringBuilder infos = new StringBuilder();
		if (null != cat && null != cat.getStrRef()) {
			for (CTStrVal val : cat.getStrRef().getStrCache().getPtList()) {
				infos.append("ser ID:" + val.getIdx() + " V:" + val.getV());
			}
		}

		return infos.toString();
	}

	/**
	 * 通过图表类型
	 *
	 * @param chart
	 * @return
	 */
	public static List<String> getGraphType(XSLFChart chart) {
		List<String> resList = new ArrayList<>();

		CTPlotArea plot = chart.getCTChart().getPlotArea();
		if (null != plot && plot.getBarChartList().size() > 0) {
			resList.add("bar");
		}
		if (null != plot && plot.getPieChartList().size() > 0) {
			resList.add("pie");
		}
		if (null != plot && plot.getLineChartList().size() > 0) {
			resList.add("line");
		}
		if (null != plot && plot.getAreaChartList().size() > 0) {
			resList.add("area");
		}
		return resList;
	}

	// 刷新圆饼图
	public static boolean refreshPieGraph(XSLFChart chart, GraphData graphData) {
		boolean result = true;
		// 把图表绑定到Excel workbook中
		try {
			Workbook wb = new XSSFWorkbook();
			Sheet sheet = wb.createSheet();
			CTChart ctChart = chart.getCTChart();
			CTPlotArea plotArea = ctChart.getPlotArea();
			CTPieChart pieChart = plotArea.getPieChartArray(0);
			// 获取图表的系列
			CTPieSer ser = pieChart.getSerArray(0);
			// Series Text
			CTSerTx tx = ser.getTx();
			tx.getStrRef().getStrCache().getPtArray(0).setV(graphData.getTitle());
			sheet.createRow(0).createCell(1).setCellValue(graphData.getTitle());
			String titleRef = new CellReference(sheet.getSheetName(), 0, 1, true, true).formatAsString();
			tx.getStrRef().setF(titleRef);

			// Category Axis Data
			CTAxDataSource cat = ser.getCat();
			// 获取图表的值
			CTNumDataSource val = ser.getVal();
			refreshGraphContent(sheet, cat, val, graphData);

			// 更新嵌入的workbook
			POIXMLDocumentPart xlsPart = chart.getRelations().get(0);
			OutputStream xlsOut = xlsPart.getPackagePart().getOutputStream();
			try {
				wb.write(xlsOut);
				xlsOut.close();
			} catch (IOException e) {
				e.printStackTrace();
				result = false;
			} finally {
				if (wb != null) {
					try {
						wb.close();
					} catch (IOException e) {
						e.printStackTrace();
						result = false;
					}
				}
			}
		} catch (Exception e) {
			e.printStackTrace();
		}

		return result;
	}

	// 刷新柱状图
	public static boolean refreshBarGraph(XSLFChart chart, GraphData graphData) {
		boolean result = true;
		// 把图表绑定到Excel workbook中
		try {
			Workbook wb = new XSSFWorkbook();
			Sheet sheet = wb.createSheet();
			CTChart ctChart = chart.getCTChart();
			CTPlotArea plotArea = ctChart.getPlotArea();
			CTBarChart[] areaChartArray = plotArea.getBarChartArray();

			for (CTBarChart barChart : areaChartArray) {
				// 获取图表的系列
				CTBarSer ser = barChart.getSerArray(0);
				// Series Text
				CTSerTx tx = ser.getTx();
				tx.getStrRef().getStrCache().getPtArray(0).setV(graphData.getTitle());
				sheet.createRow(0).createCell(1).setCellValue(graphData.getTitle());
				String titleRef = new CellReference(sheet.getSheetName(), 0, 1, true, true).formatAsString();
				tx.getStrRef().setF(titleRef);

				// Category Axis Data
				CTAxDataSource cat = ser.getCat();
				// 获取图表的值
				CTNumDataSource val = ser.getVal();
				refreshGraphContent(sheet, cat, val, graphData);
			}

			// 更新嵌入的workbook
			POIXMLDocumentPart xlsPart = chart.getRelations().get(0);
			OutputStream xlsOut = xlsPart.getPackagePart().getOutputStream();
			try {
				wb.write(xlsOut);
				xlsOut.close();
			} catch (IOException e) {
				e.printStackTrace();
				result = false;
			} finally {
				if (wb != null) {
					try {
						wb.close();
					} catch (IOException e) {
						e.printStackTrace();
						result = false;
					}
				}
			}
		} catch (Exception e) {
			e.printStackTrace();
		}

		return result;
	}

	// 刷新线性图
	public static boolean refreshLineGraph(XSLFChart chart, GraphData graphData) {
		boolean result = true;
		// 把图表绑定到Excel workbook中
		try {
			Workbook wb = new XSSFWorkbook();
			Sheet sheet = wb.createSheet();
			CTChart ctChart = chart.getCTChart();
			CTPlotArea plotArea = ctChart.getPlotArea();
			CTLineChart pieChart = plotArea.getLineChartArray(0);
			// 获取图表的系列
			CTLineSer ser = pieChart.getSerArray(0);
			// Series Text
			CTSerTx tx = ser.getTx();
			tx.getStrRef().getStrCache().getPtArray(0).setV(graphData.getTitle());
			sheet.createRow(0).createCell(1).setCellValue(graphData.getTitle());
			String titleRef = new CellReference(sheet.getSheetName(), 0, 1, true, true).formatAsString();
			tx.getStrRef().setF(titleRef);
			// Category Axis Data
			CTAxDataSource cat = ser.getCat();
			// 获取图表的值
			CTNumDataSource val = ser.getVal();
			refreshGraphContent(sheet, cat, val, graphData);

			// 更新嵌入的workbook
			POIXMLDocumentPart xlsPart = chart.getRelations().get(0);
			OutputStream xlsOut = xlsPart.getPackagePart().getOutputStream();
			try {
				wb.write(xlsOut);
				xlsOut.close();
			} catch (IOException e) {
				e.printStackTrace();
				result = false;
			} finally {
				if (wb != null) {
					try {
						wb.close();
					} catch (IOException e) {
						e.printStackTrace();
						result = false;
					}
				}
			}
		} catch (Exception e) {
			e.printStackTrace();
		}

		return result;
	}



	/**
	 * sdl 刷新线性图
	 * @param chart
	 * @param graphData
	 * @return
	 */
	public static boolean refreshLineGraph(XSLFChart chart, Map<String, List<SeriesData>> graphData) {
		boolean result = true;
		// 把图表绑定到Excel workbook中
		try {
			Set<String> keySet = graphData.keySet();
			ArrayList<String> keyList = new ArrayList<>(keySet);
			Workbook wb = new XSSFWorkbook();
			Sheet sheet = wb.createSheet();
			CTChart ctChart = chart.getCTChart();
			CTPlotArea plotArea = ctChart.getPlotArea();
			List<CTLineChart> lineChartList = plotArea.getLineChartList();
			for (int j = 0; j < lineChartList.size(); j++) {
				CTLineChart pieChart = plotArea.getLineChartArray(j);

				for (int x = 0; x < 10; x++) {
					sheet.createRow(x);
				}
				List<CTLineSer> serList = pieChart.getSerList();
				for (int i = 0; i < serList.size(); i++) {
					// 获取图表的系列
					// Series Text
					CTLineSer ser = serList.get(i);
					CTSerTx tx = ser.getTx();
//					CTStrVal ptArray = tx.getStrRef().getStrCache().getPtArray(0);
//					String v = ptArray.getV();
					String v = keyList.get(i);
					List<SeriesData> seriesData = graphData.get(keyList.get(i));
//					List<SeriesData> seriesData = graphData.get(v);
					if (Func.isEmpty(seriesData)) {
						continue;
					}
					sheet.getRow(0).createCell(i+1).setCellValue(v);

					String titleRef = new CellReference(sheet.getSheetName(), 0, i+1, true, true).formatAsString();
					tx.getStrRef().setF(titleRef);
					// Category Axis Data
					CTAxDataSource cat = ser.getCat();
					// 获取图表的值
					CTNumDataSource val = ser.getVal();
					refreshGraphContent(sheet, cat,val,i+1, seriesData);
				}
			}

			// 更新嵌入的workbook
			POIXMLDocumentPart xlsPart = chart.getRelations().get(0);
			OutputStream xlsOut = xlsPart.getPackagePart().getOutputStream();

			try {
				wb.write(xlsOut);
				xlsOut.close();
			} catch (IOException e) {
				e.printStackTrace();
				result = false;
			} finally {
				if (wb != null) {
					try {
						wb.close();
					} catch (IOException e) {
						e.printStackTrace();
						result = false;
					}
				}
			}
		} catch (Exception e) {
			e.printStackTrace();
		}

		return result;
	}

	/**
	 * sdl 刷新柱状图
	 * @param chart
	 * @param graphData
	 * @return
	 */
	public static boolean refreshBarGraph(XSLFChart chart, Map<String, List<SeriesData>> graphData) {
		boolean result = true;
		// 把图表绑定到Excel workbook中
		try {
			Set<String> keySet = graphData.keySet();
			ArrayList<String> keyList = new ArrayList<>(keySet);
			Workbook wb = new XSSFWorkbook();
			Sheet sheet = wb.createSheet();
			CTChart ctChart = chart.getCTChart();
			CTPlotArea plotArea = ctChart.getPlotArea();
			List<CTBarChart> barChartList = plotArea.getBarChartList();

			for (int j = 0; j < barChartList.size(); j++) {
				CTBarChart barChartArray = plotArea.getBarChartArray(j);
				List<CTBarSer> serList = barChartArray.getSerList();
				for (int x = 0; x < 10; x++) {
					sheet.createRow(x);
				}
				for (int i = 0; i < serList.size(); i++) {
					// 获取图表的系列
					CTBarSer ser = serList.get(i);
					// Series Text
					CTSerTx tx = ser.getTx();
//					CTStrVal ptArray = tx.getStrRef().getStrCache().getPtArray(0);
//					String v = ptArray.getV();
					String v = keyList.get(i);
					List<SeriesData> seriesData = graphData.get(v);
					if (Func.isEmpty(seriesData)) {
						continue;
					}
					sheet.getRow(0).createCell(i+1).setCellValue(v);
					String titleRef = new CellReference(sheet.getSheetName(), 0, i+1, true, true).formatAsString();
					tx.getStrRef().setF(titleRef);
					// Category Axis Data
					CTAxDataSource cat = ser.getCat();
					// 获取图表的值
					CTNumDataSource val = ser.getVal();
					refreshGraphContent(sheet, cat, val,i+1, seriesData);
				}
			}



			// 更新嵌入的workbook
			POIXMLDocumentPart xlsPart = chart.getRelations().get(0);
			OutputStream xlsOut = xlsPart.getPackagePart().getOutputStream();
			try {
				wb.write(xlsOut);
				xlsOut.close();
			} catch (IOException e) {
				e.printStackTrace();
				result = false;
			} finally {
				if (wb != null) {
					try {
						wb.close();
					} catch (IOException e) {
						e.printStackTrace();
						result = false;
					}
				}
			}
		} catch (Exception e) {
			e.printStackTrace();
		}

		return result;
	}




	// 刷新面积图
	public static boolean refreshAreaGraph(XSLFChart chart, GraphData graphData) {
		boolean result = true;
		// 把图表绑定到Excel workbook中
		try {
			Workbook wb = new XSSFWorkbook();
			Sheet sheet = wb.createSheet();
			CTChart ctChart = chart.getCTChart();
			CTPlotArea plotArea = ctChart.getPlotArea();
			CTAreaChart pieChart = plotArea.getAreaChartArray(0);
			// 获取图表的系列
			CTAreaSer ser = pieChart.getSerArray(0);
			// Series Text
			CTSerTx tx = ser.getTx();
			tx.getStrRef().getStrCache().getPtArray(0).setV(graphData.getTitle());
			sheet.createRow(0).createCell(1).setCellValue(graphData.getTitle());
			String titleRef = new CellReference(sheet.getSheetName(), 0, 1, true, true).formatAsString();
			tx.getStrRef().setF(titleRef);

			// Category Axis Data
			CTAxDataSource cat = ser.getCat();
			// 获取图表的值
			CTNumDataSource val = ser.getVal();
			refreshGraphContent(sheet, cat, val, graphData);

			// 更新嵌入的workbook
			POIXMLDocumentPart xlsPart = chart.getRelations().get(0);
			OutputStream xlsOut = xlsPart.getPackagePart().getOutputStream();
			try {
				wb.write(xlsOut);
				xlsOut.close();
			} catch (IOException e) {
				e.printStackTrace();
				result = false;
			} finally {
				if (wb != null) {
					try {
						wb.close();
					} catch (IOException e) {
						e.printStackTrace();
						result = false;
					}
				}
			}
		} catch (Exception e) {
			e.printStackTrace();
		}

		return result;
	}

	// 刷新图表内容
	public static void refreshGraphContent(Sheet sheet, CTAxDataSource cat, CTNumDataSource val, GraphData graphData) {
		CTStrData strData = cat.getStrRef().getStrCache();
		CTNumData numData = val.getNumRef().getNumCache();
		// strData.set
		strData.setPtArray((CTStrVal[]) null); // unset old axis text
		numData.setPtArray((CTNumVal[]) null); // unset old values

		// set model
		long idx = 0;
		int rownum = 1;
		for (SeriesData seriesData : graphData.getSerList()) {
			CTNumVal numVal = numData.addNewPt();
			numVal.setIdx(idx);
			numVal.setV(seriesData.getSerVal() + "");

			CTStrVal sVal = strData.addNewPt();
			sVal.setIdx(idx);
			sVal.setV(seriesData.getSerName());

			idx++;
			Row row = sheet.createRow(rownum++);
			row.createCell(0).setCellValue(seriesData.getSerName());
			row.createCell(1).setCellValue(seriesData.getSerVal());
		}
		numData.getPtCount().setVal(idx);
		strData.getPtCount().setVal(idx);

		String numDataRange = new CellRangeAddress(1, rownum - 1, 1, 1).formatAsString(sheet.getSheetName(), true);
		val.getNumRef().setF(numDataRange);
		String axisDataRange = new CellRangeAddress(1, rownum - 1, 0, 0).formatAsString(sheet.getSheetName(), true);
		cat.getStrRef().setF(axisDataRange);
	}


	// 刷新图表内容
	public static void refreshGraphContent(Sheet sheet, CTAxDataSource cat, CTNumDataSource val,Integer column, List<SeriesData> serList) {
		// Category Axis Data
		// 获取图表的值
		CTStrData strData = cat.getStrRef().getStrCache();
		CTNumData numData = val.getNumRef().getNumCache();
		// strData.set
//		strData.setPtArray((CTStrVal[]) null); // unset old axis text
//		numData.setPtArray((CTNumVal[]) null); // unset old values

		// set model
		long idx = 0;
		int rownum = 1;
		for (SeriesData seriesData : serList) {
			CTNumVal numVal = numData.addNewPt();
			numVal.setIdx(idx);
			numVal.setV(seriesData.getSerVal() + "");

			CTStrVal sVal = strData.addNewPt();
			sVal.setIdx(idx);
			sVal.setV(seriesData.getSerName());

			idx++;
			Row row = sheet.getRow(rownum++);

			row.createCell(0).setCellValue(seriesData.getSerName());
			row.createCell(column).setCellValue(seriesData.getSerVal());
		}
		numData.getPtCount().setVal(idx);
		strData.getPtCount().setVal(idx);

		String numDataRange = new CellRangeAddress(1, rownum - 1, column, column).formatAsString(sheet.getSheetName(), true);
		val.getNumRef().setF(numDataRange);
		String axisDataRange = new CellRangeAddress(1, rownum - 1, 0, 0).formatAsString(sheet.getSheetName(), true);
		cat.getStrRef().setF(axisDataRange);
	}

}

package org.springblade.bigdata.ureport.service.impl;

import java.util.List;

/**
 * 图表系列数据
 *
 * @author caoyong
 *
 */
public class GraphData {
	// 图形标题
	private String title;

	// 系列值
	private List<SeriesData> serList;

	public GraphData(String title, List<SeriesData> serList)
	{
		this.title = title;
		this.serList = serList;
	}

	public String getTitle()
	{
		return title;
	}

	public List<SeriesData> getSerList()
	{
		return serList;
	}
}

class SeriesData {
	// 系列名称
	private String serName;

	// 系列值
	private double serVal;

	public SeriesData(String serName, double serVal)
	{
		this.serName = serName;
		this.serVal = serVal;
	}

	public String getSerName()
	{
		return serName;
	}

	public double getSerVal()
	{
		return serVal;
	}

}

修改后的 ppt

在这里插入图片描述

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值