画像ファイルを一つのセルに一つずつ収めたExcelファイルを自動生成する方法です。
Apache POIを使用しました。
http://poi.apache.org/
-
セルのサイズ指定はSheetクラスのsetColumnWidthメソッドとRowクラスのsetHeightInPointsメソッドで行いますが、setColumnWidthは単位が「1文字の幅の1/256」、setHeightInPointsはポイント指定で若干ややこしいです。
-
ClientAnchorクラスでアンカーを設定することで、画像とセルを関連付けることができます。これにより、画像をセルごとコピペすることが可能になります。setAnchorTypeメソッドの引数で画像とセルの関連を指定出来ます(0:セルに合わせて画像の移動、サイズ変更をおこなう。2:セルに合わせて移動するが、サイズは変更しない。3:セルに合わせて移動もサイズ変更もしない)
-
Pictureクラスのresizeメソッドは引数で拡大縮小率を指定できます。例えば拡大200%なら2、縮小50%なら0.5です。画素数は元のファイルのままです。
以下、imgフォルダの連番pngファイル(1.png, 2.png, ...)を
セルにあわせて自動的に縦一列に貼り付けるプログラムです。
import java.awt.image.BufferedImage;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import javax.imageio.ImageIO;
import org.apache.poi.ss.usermodel.ClientAnchor;
import org.apache.poi.ss.usermodel.Drawing;
import org.apache.poi.ss.usermodel.Picture;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
// メインクラス
public class ImageListGenerator {
public static void main(String[] args) {
ImageListGenerator ilg = new ImageListGenerator();
ilg.main();
}
// メイン
public void main() {
// excelシートクラス作成
Workbook wb = new XSSFWorkbook();
Sheet sh = wb.createSheet("ImageList");
sh.setColumnWidth(0, 50 * 256);
Integer i = new Integer(1);
while (true) {
// ファイル読み込み
File file = new File(i.toString() + ".png");
//File file = new File("./img/" + i.toString() + ".png");
if (file.exists()) {
try {
ByteArrayOutputStream byteArrayOut = new ByteArrayOutputStream();
// イメージファイル作成
BufferedImage img = ImageIO.read(file);
ImageIO.write(img, "png", byteArrayOut);
//行作成
Row row = sh.createRow(i);
row.setHeightInPoints(180);
//画像描画
Drawing drawing = sh.createDrawingPatriarch();
ClientAnchor anchor = drawing.createAnchor(0,0,0,0,0,i,0,i);
anchor.setAnchorType(0);
int picIndex = wb.addPicture(byteArrayOut.toByteArray(), Workbook.PICTURE_TYPE_PNG);
Picture pic = drawing.createPicture(anchor, picIndex);
//元の画像のサイズに合わせてリサイズ
pic.resize(Math.floor(220 / (double) img.getHeight() * 100) / 100);
} catch (IOException e) {
e.printStackTrace();
}
} else {
break;
}
i++;
}
try {
FileOutputStream out = new FileOutputStream("ImageList.xlsx");
wb.write(out);
out.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}