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

2023-11-16

现有需求, 根据数据库数据, 定期更新 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

在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

java 根据已有ppt模板修改其内容 的相关文章

随机推荐

  • go cli脚手架开发利器——cobra库的初体验

    文章目录 关于 说明 cobra 简介 cobra 概念 Commands Flags Args 教程正文 demo1 快速了解 demo 知识点 Command创建命令 demo2 使用参数验证器 钩子函数 demo 知识点 参数验证方法
  • 最新xmind2022版思维导图如何使用详解教程

    前段时间和大家盘点了五种高效的学习方法 没有看过的小伙伴戳这里 最科学的学习方法盘点 讲到思维导图笔记法的时候 本狗子给大家推荐了一款免费的思维导图软件 xmind软件 然后好多小伙伴都加我问关于思维导图的使用方法 于是今天我就做了一份关于
  • 微信小程序编译bug---Hbuilderx编译时一直卡在编译界面

    项目场景 微信小程序新增某功能模块 问题描述 使用Hbuilderx开发微信小程序 正常开发中 在某次重新保存代码并编译后一直卡在编译界面 如图 图为Hbuilderx界面 因为此时没有编译完成 所以微信开发者工具界面一片空白 报错为 ap
  • Python,OpenCV使用KNN来构建手写数字及字母识别OCR

    Python OpenCV使用KNN来构建手写数字及字母识别OCR 1 原理 1 1 手写数字识别 1 2 字母识别 2 源码 2 1 手写数字OCR 2 2 字母OCR 参考 这篇博客将介绍如何借助OpenCV提供的手写数字及字母数据集
  • Linux用户空间与内核空间

    Linux用户空间与内核空间 2012 08 30 15 39 1969人阅读 评论 1 收藏 举报 linux linux内核 struct user system allocation Linux 操作系统和驱动程序运行在内核空间 应用
  • 2.Xaml 停靠框架

    1 运行效果图片 2 Xaml程序
  • ChatGPT实现知识图谱生成

    知识图谱生成 在之前章节中 我们尝试过让 ChatGPT 对一段文本做实体识别和词性分析 结果很不错 但如果是需要长期留存下来 后续在不同场景下快速查询分析 最好还是要把数据存入到专门的图数据库中 才能方便随时读取 本节 我们试试让 Cha
  • 《计算机网络原理》(谢希仁)笔记——第二章

    此为本人观看韩立刚老师视频所做笔记与总结 下面为视频连接 https www bilibili com video av10921041 from search seid 733222547867341420 第二章 物理层 主要知识点为数
  • Verilog对数据进行四舍五入(round)与饱和(saturation)截位

    重点 1 正数截位 直接看截掉的最高位是不是一 是的话进一 负数截位 截的最高位为1且其它位不全是0进一 2 饱和 也就是大于求的结果 整数变为符号位为0 其它位为1 负数变成第一位为1 其它位为0 一 引言 在利用Verilog写数字信号
  • Python入门到放弃(一)

    介绍python和库文件管理 python是解释型语言 Python的特点 简单 易学 速度快 免费开源 高层语言 可移植性 解释性 面向对象 也支持面向过程 可扩展性 可嵌入性 丰富的库 规范的代码 在cmd中退出python 输入exi
  • Tomcat优化相关问题

    1 你怎样给 tomcat 去调优 JVM 参数调优 Xms 表示 JVM 初始化堆的大小 Xmx表示 JVM 堆的最大值 这两个值的大小一般根据需要进行设置 当应用程序需要的内存超出堆的最大值时虚拟机就会提示内存溢出 并且导致应用服务崩溃
  • Spark(七)——累加器和广播变量

    5 累加器 通过在驱动器中调用SparkContext accumulator initialValue 方法 创建出存有初始值的累加器 返回值为org apache spark Accumulator T 对象 其中 T 是初始值 ini
  • ObjectARX编程(八) --------有名对象字典、用户字典和字典中的对象

    在AutoCAD数据库中 对象字典是字典类型数据库对象的总称 按其层次关系可分为两类 一是有AutoCAD数据库直接管理的第一层对象字典 二是有第一层对象字典管理的第二层对象字典 为了便于区别 我们把第一层对象字典称为有名对象字典 用于在应
  • 浅谈std::move和std::forward原理

    前言 本文主要整理了C 11中std move和std forward的原理 这对理解C 的移动拷贝有很重的意义 一 左值和右值 左值 一般来说 能在内存中取得其地址 即是左值 右值 在内存在无取得其地址的 即是右值 note 左值持久 右
  • Python中MNE库模拟原始脑电数据

    研究脑电算法的时候发现了一个问题 如何评价模型的准确性 之前的工作流程都是先用公开数据集的数据训练好模型 然后放到实测数据上进行参数微调 在公开数据集上进行模型的选择主要是因为公开数据集的数据质量较好 可以排除硬件的影响 从而专心于算法的研
  • RTL仿真验证

    注意 个人学习笔记 后续会进行修改完善 目前还在初步学习阶段 参考gitee上 从零开始写RISC V处理器 在写testbench文件时 有两点需要注意的 第一点就是在testbench文件里加上读指令文件的操作 initial begi
  • Pandas中插入新的行或列

    python中插入新行或列 前言 一 新增列 二 新增行 前言 在特定位置插入行或者列是比较常用的操作 具体的插入操作主要是在哪插入和插入什么 提示 以下是本篇文章正文内容 下面案例可供参考 一 新增列 在pandas中新增列用到的是ins
  • 编写C++中的两个类 一个只能在栈中分配空间 一个只能在堆中分配(腾讯2012面试题)

    编写C 中的两个类 一个只能在栈中分配空间 一个只能在堆中分配 腾讯2012面试题 这道题挺好的 HeapOnly cpp include
  • windows修改远程端口号

    windows远程桌面默认使用的是3389 为了提高服务器安全性 可以修改默认端口3389为其它端口号 端口使用原则 TCP与UDP段结构中端口地址都是16比特 所以端口范围在0 65535 对于这65536个端口号有以下的使用规定 1 端
  • java 根据已有ppt模板修改其内容

    现有需求 根据数据库数据 定期更新 ppt 报表内容 本文修改内容 主要是 ppt中的图表 测试ppt 代码 package org springblade bigdata ureport service impl import java