Apache POI 新規Excel 作成

org.apache.poi.ss.usermodel.Workbook 
を、引数なしコンストラクタで
Excel 2003 の形式なら、new HSSFWorkbook()
Excel 2007 から、new XSSFWorkbook()
で作成すれば良い。

シート名が曲者で、

Workbook book = new XSSFWorkbook();
book.createSheet();
book.cloneSheet(0);
book.cloneSheet(0);

StreamSupport.stream(Spliterators.spliteratorUnknownSize(book.sheetIterator(), Spliterator.ORDERED), false)
.map(s->s.getSheetName())
.forEach(System.out::println);

と、すると、

Sheet0
Sheet0 (2)
Sheet0 (3)

となる。

createSheet 実行を book.createSheet("sheet"); で行うと、

sheet
sheet (2)
sheet (3)

createSheet 実行を book.createSheet("sheet1"); で行うと、

sheet1
sheet1 (2)
sheet1 (3)

シートを作成するのを簡単でも次のstatic メソッドを用意する

public static Stream<Sheet> createAndSheets(Workbook book, int size) {
    book.createSheet();
    for(int n=1; n < size;n++) {
        book.cloneSheet(0);
    }
    return StreamSupport.stream(Spliterators.spliteratorUnknownSize(book.sheetIterator(), Spliterator.ORDERED), false);
}

使用例

Workbook book = new XSSFWorkbook();
AtomicInteger ix = new AtomicInteger(0);
ExcelWorker.createAndSheets(book, 3).forEach(sheet->{
   book.setSheetName(ix.get(), "シート_" + ix.incrementAndGet());
   sheet.createRow(0).createCell(0).setCellValue("A1 の cell");
});
book.write(outst);
book.close();

作成した Excel
f:id:posturan:20220109123919j:plain

シート名を指定するメソッドにした場合、、、

    public static Stream<Sheet> createAndSheets(Workbook book, String...names) {
        book.createSheet(names[0]);
        for(int n=1; n < names.length;n++) {
            book.createSheet(names[n]);
        }
        return StreamSupport.stream(Spliterators.spliteratorUnknownSize(book.sheetIterator(), Spliterator.ORDERED), false);
    }

こちらの方が綺麗に書ける。がシート名を重複して実行したら例外発生する。

Workbook book = new XSSFWorkbook();
ExcelWorker.createAndSheets(book, "sh1", "sh2", "sh3").forEach(sheet->{
    sheet.createRow(0).createCell(0).setCellValue("A1 の cell");
});