1. 程式人生 > >Java設置PPT的扇形圖,與內嵌Excel聯動

Java設置PPT的扇形圖,與內嵌Excel聯動

public tchar .info range close ide creates enc return

/**
* 設置餅圖的主方法
* @param slide 圖表
* @param index 圖標位置
* @param data 需要設置的數據
* @param titles 關聯Excel的標題
* @return
*/
public static XSLFSlide setPieChart(XSLFSlide slide, int index, List<String> data, List<String> titles) {
// 獲取指定位置的圖形
XSLFChart chart = setChartData(slide, index);
List<POIXMLDocumentPart> partList = chart.getRelations();
POIXMLDocumentPart xlsPart = null;
// 獲取到內嵌的Excel
for (int i = 0; i < partList.size(); i++) {
xlsPart = partList.get(i);
if (xlsPart.getPackagePart().getPartName().getName().endsWith("xlsx")) {
break;
}
}
CTChart ctChart = chart.getCTChart();
CTPlotArea plotArea = ctChart.getPlotArea();
CTPieChart pieChart = null;
try {
pieChart = plotArea.getPieChartArray(0);
} catch (Exception e) {
log.error("wtx-log:" + e);
}
if (pieChart == null) {
log.info("wtx-log:獲取到的扇形圖為空。");
return slide;
}
// 獲取圖表的系列
CTPieSer ser = pieChart.getSerArray(0);
// 把圖表綁定到Excel workbook中
XSSFWorkbook wb = new XSSFWorkbook();
XSSFSheet sheet = wb.createSheet();
// 設置列標題,列標題關聯
CTSerTx tx = ser.getTx();
sheet.createRow(0).createCell(1).setCellValue(tx.getStrRef().getStrCache().getPtArray(0).getV());
String titleRef = new CellReference(sheet.getSheetName(), 0, 1, true, true).formatAsString();
tx.getStrRef().setF(titleRef);
// 獲取行標題
CTAxDataSource cat = ser.getCat();
// 獲取原行標題,
CTStrData strData = cat.getStrRef().getStrCache();
strData.setPtArray(null);
for (int i = 0; i < titles.size(); i++) {
CTStrVal sVal = strData.addNewPt();
sVal.setIdx(i);
sVal.setV(titles.get(i));
}
// 獲取圖表的值
CTNumDataSource val = ser.getVal();
CTNumData numData = val.getNumRef().getNumCache();
// 清除舊的數據值
numData.setPtArray(null);
// 輸入新數據
int rownum = 1;
for (int i = 0; i < titles.size(); i++) {
// 設置內存的值
CTNumVal numVal = numData.addNewPt();
numVal.setIdx(i);
numVal.setV(data.get(i));

// 設置workbook的值
XSSFRow row = sheet.createRow(rownum++);
row.createCell(0).setCellValue(titles.get(i));
row.createCell(1).setCellValue(Double.parseDouble(data.get(i)));
}
numData.getPtCount().setVal(titles.size());
strData.getPtCount().setVal(titles.size());
// 設置行標題和數據關聯
String numDataRange = new CellRangeAddress(1, titles.size(), 1, 1).formatAsString(sheet.getSheetName(), true);
val.getNumRef().setF(numDataRange);
String axisDataRange = new CellRangeAddress(1, titles.size(), 0, 0).formatAsString(sheet.getSheetName(), true);
cat.getStrRef().setF(axisDataRange);
// 更新嵌入的workbook
updateWorkbook(xlsPart, wb);
return slide;
}

/**
* 更新嵌入的workbook
*
* @param ppt
* @param xlsPart
* @param wb
* @return
*/
private static void updateWorkbook(POIXMLDocumentPart xlsPart, XSSFWorkbook wb) {
// 更新嵌入的workbook
OutputStream xlsOut = xlsPart.getPackagePart().getOutputStream();
try {
wb.write(xlsOut);
} catch (IOException e) {
log.error("PPTUtil.updateWorkbook() :" + e);
} finally {
try {
xlsOut.close();
} catch (IOException e) {
log.error("PPTUtil.updateWorkbook() :" + e);
}
}
}

Java設置PPT的扇形圖,與內嵌Excel聯動