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
シート名を指定するメソッドにした場合、、、
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"); });