当前位置: 首页 > 知识库问答 >
问题:

未经编辑,无法在pptx中的BarChart中查看Apache POI更新数据值

任昊苍
2023-03-14

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

现在,我正在尝试使用POI API做同样的事情。我在这里执行以下步骤

  1. 读取模板文件 = “我的模板.pptx” - https://docs.google.com/file/d/0B-q0lBy0lKLic3dCSUVsZUdGQzA/edit?usp=sharing
  2. 在“地图”中包含所有形状
  3. 通过引用其名称来阅读条形图形状 - “我的条形图”
  4. 读取条形图的 Excel 文件
  5. 更新工作表 1 中的单元格值
  6. 保存所有内容并写入另一个文件 - “我的演示文稿.pptx”

当我打开文件“MyPresentation.pptx”时,它不会在Bar中显示更新的单元格值。我需要双击图表,将其更改为EDIT模式,以反映最新的值。为什么使用POI更新BarChart的基础数据表时,BarChart没有刷新?

有什么建议可以解决这个问题吗?

这是完整的代码,附带的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个答案

薛烨霖
2023-03-14

这是您用来使用pptx4j执行此操作的代码。

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

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

尉迟龙光
2023-03-14

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

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

 类似资料:
  • 这是豆子 这里的问题是连//////////////////都没有显示,这意味着HTML代码中存在问题,阻止了onCellEdit函数的执行!!!

  • 我想知道如何在android中从我的移动存储或sdcard查看. pptx powerpoint演示文件,我使用了Apache-poi,但它在android上不起作用。

  • 从一个方法call AndUpdateInB(),假设我正在调用B类(@Component)的date()方法,其中我正在调用myRepository.save()方法来更新db中的一些数据,并且在相同的功能中我正在执行一些其他调用...然后将响应返回给类A。 所以问题是,当类B方法update()将响应返回给类A方法callAndUpdateInB()时,数据在数据库中得到更新。但当我调用myR

  • 我试图输出数据帧的所有列。 代码如下: 当我输出数据帧时,并非所有列都显示出来。这有21列,在一些列之间只有点“…”我正在使用ipython笔记本。有没有一种方法可以忽略这一点。

  • 这里是logcat: 06-24 13:33:04.226 23618-23618/?E/Android Runtime︰致命的例外:主要过程:com.example.saleh.findmypassword,PID:23618java.lang.非法争论例外:未知Uri:content://com.example.saleh.findmypassword.provider/PInfos/1com

  • 我有一个php页面正在从mysql数据库创建一个表。在该表中,我有一个编辑按钮来编辑数据和更新mysql数据库。所有的工作都很好,除了一栏是日期。如果我把日期拉到文本输入中,它工作得很好,但我更希望这是一个日期字段,理想情况下有日历选择器。 当我将输入类型更改为date时,它不会将日期拉过--而是显示dd/mm/YYYY。这很烦人,好像我只需要更改其他字段,而不是日期,每次我尝试更新时,我必须手动