Java 未经编辑,无法在pptx中的条形图中查看Apache POI更新的数据值
我有一个pptx模板,它只有一张幻灯片用于测试。幻灯片有一个简单的条形图。我可以通过双击pptx文件来编辑条形图,我可以更改Sheet1(条形图数据表)中的值,并且可以立即在条形图中看到更改 现在,我正尝试使用POIAPI实现同样的功能。我在这里执行以下步骤Java 未经编辑,无法在pptx中的条形图中查看Apache POI更新的数据值,java,apache,apache-poi,powerpoint,Java,Apache,Apache Poi,Powerpoint,我有一个pptx模板,它只有一张幻灯片用于测试。幻灯片有一个简单的条形图。我可以通过双击pptx文件来编辑条形图,我可以更改Sheet1(条形图数据表)中的值,并且可以立即在条形图中看到更改 现在,我正尝试使用POIAPI实现同样的功能。我在这里执行以下步骤 阅读模板文件=“MyTemplate.pptx”—— 在地图上有各种形状 阅读条形图形状,请参考其名称-“MyBarChart” 读取条形图的excel文件 更新表1中的单元格值 保存所有内容并写入另一个文件-“MyPresentation
package com.ppt;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.util.HashMap;
import java.util.Map;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
import org.apache.poi.openxml4j.opc.PackagePart;
import org.apache.poi.xslf.usermodel.XMLSlideShow;
import org.apache.poi.xslf.usermodel.XSLFGraphicFrame;
import org.apache.poi.xslf.usermodel.XSLFShape;
import org.apache.poi.xslf.usermodel.XSLFSheet;
import org.apache.poi.xslf.usermodel.XSLFSlide;
public class PPTChart {
public static void main(String args[]) throws InvalidFormatException, IOException{
XMLSlideShow ppt;
// Read pptx template
ppt = new XMLSlideShow(new FileInputStream("MyTemplate.pptx"));
// Get all slides
XSLFSlide[] slide = ppt.getSlides();
// Get working slide that is slide=0
XSLFSlide slide0 = slide[0];
XSLFShape[] shapes = slide0.getShapes();
// Add all shapes into a Map
Map <String, XSLFShape> shapesMap = new HashMap<String, XSLFShape>();
for(XSLFShape shape : shapes)
{
shapesMap.put(shape.getShapeName(), shape);
System.out.println(shape.getShapeName() + " " + shape.getShapeId() + " " + shape);
}
// Read the bar chart
XSLFGraphicFrame chart = (XSLFGraphicFrame) shapesMap.get("MyBarChart");
// Get the chart sheet
XSLFSheet sheet = chart.getSheet();
for(int i=0; i<sheet.getRelations().size(); i++)
{
System.out.println("Partname =" + sheet.getRelations().get(i).getPackagePart().getPartName());
if(sheet.getRelations().get(i).getPackagePart().getPartName().toString().contains(".xls"))
{
System.out.println("Found the bar chart excel");
// BarChart Excel package part
PackagePart barChartExcel = sheet.getRelations().get(i).getPackagePart();
// Reference the excel in workbook
HSSFWorkbook wb = new HSSFWorkbook(barChartExcel.getInputStream());
// Read sheet where Barchart data is available
HSSFSheet mysheet = wb.getSheetAt(1);
// Read first
HSSFRow row = mysheet.getRow(1);
//Print first cell value for debugging
System.out.println("Updating cell value from - " + row.getCell(1));
// New value
double insertValue = 7777777.0;
wb.getSheetAt(1).getRow(1).getCell(1).setCellValue(insertValue);
// Set first BarChart as active sheet
HSSFSheet mysheet0 = wb.getSheetAt(0);
mysheet0.setActive(true);
// Write the updated excel back to workbook
OutputStream excelOut = barChartExcel.getOutputStream();
excelOut.flush();
wb.write(excelOut);
excelOut.close();
// Write workbook to file
FileOutputStream o = new FileOutputStream("MyPresentation.pptx");
ppt.write(o);
o.close();
System.out.println("new ppt is created....");
break; // Exit
}
}
}
}
package.com.ppt;
导入java.io.FileInputStream;
导入java.io.FileOutputStream;
导入java.io.IOException;
导入java.io.OutputStream;
导入java.util.HashMap;
导入java.util.Map;
导入org.apache.poi.hssf.usermodel.HSSFRow;
导入org.apache.poi.hssf.usermodel.HSSFSheet;
导入org.apache.poi.hssf.usermodel.HSSFWorkbook;
导入org.apache.poi.openxml4j.exceptions.InvalidFormatException;
导入org.apache.poi.openxml4j.opc.PackagePart;
导入org.apache.poi.xslf.usermodel.xmlsideshow;
导入org.apache.poi.xslf.usermodel.xslfgraphicsframe;
导入org.apache.poi.xslf.usermodel.XSLFShape;
导入org.apache.poi.xslf.usermodel.XSLFSheet;
导入org.apache.poi.xslf.usermodel.XSLFSlide;
公共类PPTChart{
公共静态void main(字符串args[])引发InvalidFormatException,IOException{
XMLSlideShow ppt;
//读取pptx模板
ppt=新的XMLSlideShow(新的FileInputStream(“MyTemplate.pptx”);
//获取所有幻灯片
XSLFSlide[]slide=ppt.getSlides();
//获取幻灯片=0的工作幻灯片
XSLFSlide slide0=幻灯片[0];
XSLFShape[]shapes=slide0.getShapes();
//将所有形状添加到地图中
Map shapemap=newhashmap();
for(XSLFShape形状:形状)
{
shapemap.put(shape.getShapeName(),shape);
System.out.println(shape.getShapeName()+“”+shape.getShapeId()+“”+shape);
}
//阅读条形图
xslfgraphicsframe chart=(xslfgraphicsframe)shapemap.get(“MyBarChart”);
//去拿图表
XSLFSheet sheet=chart.getSheet();
对于(inti=0;i,您将使用pptx4j来执行此操作
您应该能够将其转换为等效的POI代码
请注意,pptx4j代码正在更新OpenXML电子表格,而您的代码的目标是旧的二进制格式。我现在正在处理类似的问题。请查看下面的线程链接以实际更新图表视觉效果。您必须修改基础XML的绘图区域部分
图表或excel将有一个更新方法。您需要在退出excel之前调用此方法。这将强制更新OLE客户端应用程序显示的Windows图元文件。您似乎已在多个位置发布了相同的问题…是否尝试按照以下方法操作?