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の回答内容を参考に作成したものになります。
参考
- chatGPT
https://chat.openai.com/
コメント