无法在没有编辑的情况下在pptx中看到BarChart中的Apache POI更新数据值

时间:2013-07-26 20:32:37

标签: java apache apache-poi powerpoint

我有一个pptx模板,它只有一张幻灯片用于测试目的。幻灯片有一个简单的条形图。我可以通过在pptx文件上双击来编辑条形图,我可以更改Sheet1(条形图的数据表)中的值,并且我能够立即在BarChart中看到更改。

现在,我正在尝试使用POI API执行相同的操作。我在这里做了以下步骤

  1. 阅读模板文件=“MyTemplate.pptx” - https://docs.google.com/file/d/0B-q0lBy0lKLic3dCSUVsZUdGQzA/edit?usp=sharing
  2. 拥有地图中的所有形状
  3. 通过引用它的名字 - “MyBarChart”
  4. 来阅读BarChart形状
  5. 阅读BarChart的Excel文件
  6. 更新Sheet1中的单元格值
  7. 保存所有内容并写入另一个文件 - “MyPresentation.pptx”
  8. 当我打开文件 - “MyPresentation.pptx”时,它不会在条形图中预先显示更新的单元格值。我需要双击图表将其更改为编辑模式以获得反映的最新值。为什么BarChart在使用POI更新基础数据表时不会刷新?

    有任何解决问题的建议吗?

    这是完成的代码,附带了pptx模板文件。

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

2 个答案:

答案 0 :(得分:1)

Here is the code您可以使用pptx4j来完成此操作。

您应该能够将其转换为等效的POI代码。

请注意,pptx4j代码正在更新OpenXML电子表格,而您的代码则定位为旧版二进制格式。

答案 1 :(得分:1)

我正在做类似的事情。查看下面的线程链接,以实际更新图表视觉效果。您必须修改基础XML的绘图区域部分。

How can one programmatically read the graph values from a Powerpoint presentation using Apache's POI?