【POI】Javaでワークブック間の図形をコピーする

Apache POI
スポンサーリンク

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

サンプルプログラム

package samplePOI;

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

import org.apache.poi.xssf.usermodel.XSSFClientAnchor;
import org.apache.poi.xssf.usermodel.XSSFDrawing;
import org.apache.poi.xssf.usermodel.XSSFShape;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFSimpleShape;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.openxmlformats.schemas.drawingml.x2006.spreadsheetDrawing.CTShape;

// 図形のコピー
public class ShapeCopy {

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

        // 入力元のワークブックを読み込む
        FileInputStream fis = new FileInputStream(inputPath);
        XSSFWorkbook sourceWorkbook = new XSSFWorkbook(fis);
        XSSFSheet sourceSheet = sourceWorkbook.getSheetAt(0);

        // コピー元の図形を取得します
        XSSFDrawing sourceDrawing = sourceSheet.createDrawingPatriarch();

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

        for (XSSFShape sourceShape : sourceDrawing.getShapes()) {
            if (sourceShape instanceof XSSFSimpleShape) {
                // 図形をコピーします
                XSSFClientAnchor anchor = (XSSFClientAnchor) sourceShape.getAnchor();
                int row = anchor.getRow1(); // コピー先の開始行番号
                int col = anchor.getCol1(); // コピー先の開始列番号
                int row2 = anchor.getRow2(); // コピー先の終了行番号
                int col2 = anchor.getCol2(); // コピー先の終了列番号

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

                // コピー先のアンカーを指定
                XSSFClientAnchor targetAnchor = new XSSFClientAnchor(
                        sourceShape.getAnchor().getDx1(), sourceShape.getAnchor().getDy1(),
                        sourceShape.getAnchor().getDx2(), sourceShape.getAnchor().getDy2(),
                        col, row, col2, row2);

                // コピー先の図形オブジェクトを作成
                XSSFDrawing targetDrawing = targetSheet.createDrawingPatriarch();
                XSSFSimpleShape targetShape = targetDrawing.createSimpleShape(targetAnchor);

                // コピー元の図形情報を取得し、コピー先の図形情報に設定
                XSSFSimpleShape sourceSimpleShape = (XSSFSimpleShape) sourceShape;
                CTShape sourceCtShape = sourceSimpleShape.getCTShape();
                targetShape.getCTShape().set(sourceCtShape);

                System.out.println("図形をコピーしました。\n\n");
            } 
        }

        // Excelファイルを保存します
        FileOutputStream fos = new FileOutputStream(outputPath);
        targetWorkbook.write(fos);
        fos.close();

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

        System.out.println("終了");
    }
}

実行結果

コンソール

コピー先の位置: (3, 1)
図形をコピーしました。


コピー先の位置: (4, 5)
図形をコピーしました。


コピー先の位置: (11, 2)
図形をコピーしました。


終了

コピー元

コピー先

備考

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

図形全てに対応しているかは確認していないため、本プログラムを参考する方がいましたら、自己責任でお願い致します。

また、「inputPath」と「outputPath」のセルの縦横は同じという過程でプログラムが作成されています。
縦横が異なる場合、縦横を合わせてから本プログラムを使用して下さい。

本プログラムは、chatGPTに一部ソースコードを整形してもらいました。
便利な世の中になりましたね。

参考

Apache POIJava
はじめまして
blueze

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

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

コメント

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