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

Apache POI
スポンサーリンク

Apache POIで、ワークブックに張り付けられた画像を別のワークブックにコピーするサンプルプログラムです。

サンプルプログラム


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

import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.usermodel.XSSFClientAnchor;
import org.apache.poi.xssf.usermodel.XSSFDrawing;
import org.apache.poi.xssf.usermodel.XSSFPicture;
import org.apache.poi.xssf.usermodel.XSSFPictureData;
import org.apache.poi.xssf.usermodel.XSSFShape;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;


//画像のコピー
public class ImageCopy {

	public static void main(String[] args) throws IOException {
		String inputPath = "C:\\Excel\\sample_input.xlsx"; // コピー元のワークブック
		String outputPath = "C:\\Excel\\sample_output.xlsx"; // コピー先のワークブックを読み込む

		try {
			// コピー元のワークブックを読み込む
			FileInputStream sourceFis = new FileInputStream(inputPath);
			XSSFWorkbook sourceWorkbook = new XSSFWorkbook(sourceFis);
			XSSFSheet sourceSheet = sourceWorkbook.getSheetAt(0);
			XSSFDrawing sourceDrawing = sourceSheet.getDrawingPatriarch();

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

			// 画像・表・グラフなどを一つずつ取り出し、画像だけを指定のワークブックに張り付け
			for (XSSFShape sourceShape : sourceDrawing.getShapes()) {
				if (sourceShape instanceof XSSFPicture) {
					// 画像の設置位置を取得
					XSSFClientAnchor xca = ((XSSFPicture) sourceShape).getPreferredSize();
					int targetRow = xca.getRow1(); // コピー先の開始行番号
					int targetCol = xca.getCol1(); // コピー先の開始列番号
					int targetRow2 = xca.getRow2(); // コピー先の終了行番号
					int targetCol2 = xca.getCol2(); // コピー先の終了列番号

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

					XSSFPicture picture = (XSSFPicture) sourceShape;
					XSSFPictureData pictureData = picture.getPictureData();

					byte[] imageBytes = pictureData.getData();
					int pictureIndex = targetWorkbook.addPicture(imageBytes, Workbook.PICTURE_TYPE_PNG);

					// 位置を指定して画像をコピー
					XSSFClientAnchor targetAnchor = new XSSFClientAnchor(
							sourceShape.getAnchor().getDx1(), sourceShape.getAnchor().getDy1(),
							sourceShape.getAnchor().getDx2(), sourceShape.getAnchor().getDy2(),
							targetCol, targetRow, targetCol2, targetRow2);

					targetSheet.createDrawingPatriarch().createPicture(targetAnchor, pictureIndex);
				}
			}

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

			// リソースの解放
			sourceWorkbook.close();
			targetWorkbook.close();
			sourceFis.close();
		} catch (Exception e) {
			e.printStackTrace();
		}

		System.out.println("処理が終了しました。");
	}
}

実行結果

コンソール

コピー先の位置: (4, 2)
処理が終了しました。

コピー元

コピー先

備考

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

エクセル上で編集した画像(テキストを載せている等)は、コピペできない可能性があります。

本プログラムは、一部chatGPTの回答内容を参考に作成したものになります。

参考

Apache POIJava
はじめまして
blueze

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

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

コメント

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