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に一部ソースコードを整形してもらいました。
便利な世の中になりましたね。
コメント