LoginSignup
15
17

More than 5 years have passed since last update.

Javaで複数の画像ファイルをリサイズしてExcelに一括貼り付け(POI)

Posted at

画像ファイルを一つのセルに一つずつ収めた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, ...)を
セルにあわせて自動的に縦一列に貼り付けるプログラムです。

ImageListGenerator.java

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();
        }
    }

}

15
17
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
15
17