【POI】Javaでワークブック間のグラフをコピーする

Apache POI
スポンサーリンク

Apache POIで、ワークブック上のグラフを別のワークブックにコピーするサンプルプログラムです。

事前準備

サンプルプログラム

package samplePOI;

import java.io.FileInputStream;
import java.io.FileOutputStream;

import org.apache.poi.xssf.usermodel.XSSFChart;
import org.apache.poi.xssf.usermodel.XSSFClientAnchor;
import org.apache.poi.xssf.usermodel.XSSFDrawing;
import org.apache.poi.xssf.usermodel.XSSFGraphicFrame;
import org.apache.poi.xssf.usermodel.XSSFShape;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

public class GraphCopy {

    public static void main(String[] args) throws Exception {
        // 入力元と出力先のパス
        String inputPath = "C:\\Excel\\sample_input.xlsx"; 
        String outputPath = "C:\\Excel\\sample_output.xlsx"; 

        // コピー元のワークブックを読み込み
        FileInputStream sourceFis = new FileInputStream(inputPath);
        XSSFWorkbook sourceWorkbook = new XSSFWorkbook(sourceFis);

        // コピー元のシートとDrawingを取得
        XSSFSheet sourceSheet = sourceWorkbook.getSheetAt(0);
        XSSFDrawing sourceDrawing = sourceSheet.getDrawingPatriarch();

        // コピー先のワークブックを読み込み
        FileInputStream outFis = new FileInputStream(outputPath);
        XSSFWorkbook targetWorkbook = new XSSFWorkbook(outFis);
        XSSFSheet targetSheet = targetWorkbook.getSheetAt(0);

        int index = 0;
        for (XSSFShape sourceShape : sourceDrawing.getShapes()) {
            if (sourceShape instanceof XSSFGraphicFrame) {
                // グラフのコピー処理
                XSSFChart sourceChart = (XSSFChart) sourceDrawing.getCharts().get(index);

                XSSFClientAnchor anchor = (XSSFClientAnchor) sourceShape.getAnchor();
                int row = anchor.getRow1(); // コピー先の開始行番号
                int col = anchor.getCol1(); // コピー先の開始列番号

                System.out.println("コピー先の位置: (" + row + ", " + col + ")");

                // 新しいグラフを作成してコピー
                XSSFDrawing targetDrawing = targetSheet.createDrawingPatriarch();
                XSSFChart targetChart = targetDrawing.createChart(anchor);

                // コピー元のグラフの設定をコピー先に反映
                targetChart.getCTChart().set(sourceChart.getCTChart());
                targetChart.getCTChartSpace().set(sourceChart.getCTChartSpace());
            }

            index++;
        }

        // 新しいワークブックを保存
        FileOutputStream fileOut = new FileOutputStream(outputPath);
        targetWorkbook.write(fileOut);
        fileOut.close();

        // リソースを解放
        sourceWorkbook.close();
        targetWorkbook.close();

        System.out.println("グラフをコピーしました。");
    }
}

ファイル

インプットファイル
アウトプットファイル

グラフは表の内容を反映しているため、事前に表だけはアウトプットするファイルに記載しておく必要があります。

実行結果

コンソール

コピー先の位置: (12, 4)
グラフをコピーしました。

アウトプットファイル

補足

if (sourceShape instanceof XSSFChart)

36行目では上記のようにif文を記載したいところですが、「XSSFShape」は「XSSFChart」のサブクラスにないため、そういった記載をすることができないことに注意してください。

サンプルプログラムは、「.xlsx形式」ですが、「.xls形式」にも対応可能です。

毎度のことになりますが、サンプルプログラムは、chatGPTに一部ソースコードを整形してもらいました。
コメント文も書いてもらえるので、本当に便利です。(感激)

参考

Apache POIJava
はじめまして
blueze

企業でアプリ開発をしているJavaプログラマーです。
当ブログでは、Javaを中心にIT系の発信をしています。
取得資格:Java Gold、AWS CLF、教育免許
趣味:将棋、野球、ゲーム

bluezeをフォローする
bluezeをフォローする
一緒に学ぶエンジニア

コメント

タイトルとURLをコピーしました