2

私は pptx テンプレートを持っています。テスト用のスライドが 1 つだけあります。スライドには単純な棒グラフがあります。pptx ファイルをダブルクリックして棒グラフを編集し、Sheet1 (Barchart のデータ シート) の値を変更して、BarChart で変更をすぐに確認できます。

今、私は POI API を使用して同じことをしようとしています。ここで以下の手順を実行しています

  1. テンプレート ファイルを読む = "MyTemplate.pptx" - https://docs.google.com/file/d/0B-q0lBy0lKLic3dCSUVsZUdGQzA/edit?usp=sharing
  2. マップにすべての図形を含める
  3. 「MyBarChart」という名前を参照して BarChart 形状を読み取ります。
  4. BarChart の Excel ファイルを読み取る
  5. Sheet1 のセル値を更新する
  6. すべてを保存し、別のファイル「MyPresentation.pptx」に書き込みます

ファイル「MyPresentation.pptx」を開くと、更新されたセル値がバーに表示されません。チャートをダブルクリックして編集モードに変更し、最新の値を反映させる必要があります。基になるデータ シートが POI を使用して更新されたときに、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
            }

        }
    }
}
4

2 に答える 2

1

pptx4j でそれを行うために使用するコードを次に示します。

それを同等のPOIコードに変換できるはずです。

pptx4j コードは OpenXML スプレッドシートを更新していますが、コードは従来のバイナリ形式をターゲットにしていることに注意してください。

于 2013-07-28T01:31:36.223 に答える
1

私は今、似たようなことに取り組んでいます。グラフのビジュアルを実際に更新するには、以下のスレッド リンクを確認してください。基になる XML のプロット エリア部分を変更する必要があります。

Apache の POI を使用して、Powerpoint プレゼンテーションからグラフの値をプログラムで読み取るにはどうすればよいですか?

于 2016-04-03T05:00:23.727 に答える