首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无法在pptx中看到BarChart中未经编辑的Apache更新的数据值

无法在pptx中看到BarChart中未经编辑的Apache更新的数据值
EN

Stack Overflow用户
提问于 2013-07-26 20:32:36
回答 2查看 2.7K关注 0票数 2

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

现在,我正在尝试使用POI进行同样的操作。我在这里做下面的步骤

  1. 读取模板文件= "MyTemplate.pptx“- https://docs.google.com/file/d/0B-q0lBy0lKLic3dCSUVsZUdGQzA/edit?usp=sharing
  2. 地图中的所有形状
  3. 通过引用BarChart的名称- "MyBarChart“来读取它的形状
  4. 读取BarChart的excel文件
  5. 更新Sheet1中的单元格值
  6. 保存所有文件并写入另一个文件"MyPresentation.pptx“

当我打开文件- "MyPresentation.pptx“时,它不会在条形图中预先显示更新的单元格值。我需要双击图表,以改变它的编辑模式,以获得最新的价值反映。为什么BarChart在使用POI更新底层数据表时没有得到刷新?

有解决这个问题的建议吗?

这是完整的代码,附加了pptx模板文件。

代码语言:javascript
复制
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
            }

        }
    }
}
EN

回答 2

Stack Overflow用户

发布于 2013-07-28 01:31:36

这是代码,你会用pptx4j来做它。

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

注意,pptx4j代码正在更新OpenXML电子表格,而您的代码是针对遗留二进制格式的。

票数 1
EN

Stack Overflow用户

发布于 2016-04-03 05:00:23

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

如何以编程方式使用Apache的POI从Powerpoint演示文稿中读取图形值?

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17890549

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档