画面キャプチャをSeleniumでとって、ExcelにApache POIで画像を複数枚連続で貼り付けるときに使用したコード。
今回はエビデンス取得目的の全画面キャプチャなので、画像の大きさはすべて同じで、貼り付け方は1シート目のA1から下方向に連続で貼り付けるという仕様とする。
Workbook book = new HSSFWorkbook();
Sheet sheet = book.createSheet();
// 1画像あたり縦横何個のセルを使用するか(この範囲に合わせてリサイズする)
int picRows = 29;
int picCols = 13;
for (int i = 0; i < files.size(); i++) {
try (ByteArrayOutputStream byteArrayOut = new ByteArrayOutputStream()) {
BufferedImage img = ImageIO.read(file.get(i));
ImageIO.write(img, "png", byteArrayOut);
Drawing drawing = sheet.createDrawingPatriarch();
// 画像の貼り付け位置指定
// dx1 = 0, dy1 = 100 : 貼り付け開始位置(col1, row1)からの指定した分だけずれて貼り付けされる。
// dx2 = 0, dy2 = 0 : 貼り付け終了位置(col2, row2)からの指定した分だけずれて貼り付けされる。
// dy1に値をセットしているのは、連続で貼り付けた時に上下の画像が完全にくっついてしまうのが見づらいため。
// col1 = 0, row1 = i * picRows : 貼り付け開始位置。
// col2 = picCols, row2 = (i + 1) * picRows : 貼り付け終了位置。
ClientAnchor anchor = drawing.createAnchor(0, 100, 0, 0, 0, i * picRows, picCols, (i + 1) * picRows);
int picIndex = book.addPicture(byteArrayOut.toByteArray(), Workbook.PICTURE_TYPE_PNG);
drawing.createPicture(anchor, picIndex);
}
}
try (OutputStream out = new FileOutputStream(Paths.get(System.getProperty("java.io.tmpdir"), "エビデンス.xls").toFile())) {
book.write(out);
}