Excelの強みその2は、ピボットテーブル。
さくっと集計。ひと目でわかる。
Apache POIを使って、Excelでピボットテーブルを作るサンプル
Apache POIを使ってExcelファイルを作成します。
乱数で適当に作った3年間の売上を年と月でクロス集計したピボットテーブルを作ります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 | import java.io.FileOutputStream; import java.util.stream.IntStream; import org.apache.poi.ss.SpreadsheetVersion; import org.apache.poi.ss.usermodel.DataConsolidateFunction; import org.apache.poi.ss.usermodel.Row; import org.apache.poi.ss.util.AreaReference; import org.apache.poi.ss.util.CellReference; import org.apache.poi.xssf.usermodel.XSSFPivotTable; import org.apache.poi.xssf.usermodel.XSSFSheet; import org.apache.poi.xssf.usermodel.XSSFWorkbook; public class ExcelPivotTest { //ピボット集計用にデータを重複させる回数(データが重複しないと面白くないので、何回か作るw) private static final int REPEAT = 3; public static void main(String[] args) { try (XSSFWorkbook wb = new XSSFWorkbook(); FileOutputStream fileOut = new FileOutputStream("C:\\work\\test.xlsx")) { //シート作成 XSSFSheet sheet = wb.createSheet("てすと1"); //データ作成 createCellData(sheet); //ピボットテーブル作成 createPivotTable(sheet); //Excelファイル書き込み wb.write(fileOut); } catch (Exception e) { e.printStackTrace(); } } private static void createPivotTable(XSSFSheet sheet) { //ピボットテーブルを作成する XSSFPivotTable pivotTable = sheet.createPivotTable( //データ範囲 new AreaReference(new CellReference(0, 0), new CellReference(3 * 12 * REPEAT, 2), SpreadsheetVersion.EXCEL2007), //ピボットテーブルの左上の座標 new CellReference(0, 5) ); //行フィールドを追加 pivotTable.addRowLabel(0); //列フィールドを追加 pivotTable.addColLabel(1); //値データを追加 pivotTable.addColumnLabel(DataConsolidateFunction.SUM, 2, "合計"); } private static void createCellData(XSSFSheet sheet) { //見出し Row row1 = sheet.createRow(0); row1.createCell(0).setCellValue("年"); row1.createCell(1).setCellValue("月"); row1.createCell(2).setCellValue("売上"); //リピート回数分だけ売上データ作成 IntStream.range(0, REPEAT).forEach(i -> createCellSalesData(sheet, i)); } private static void createCellSalesData(XSSFSheet sheet, int repeat) { //とりあえず3年間の売上データを乱数で作成 IntStream.range(0, 3 * 12).forEach(i -> { Row row = sheet.createRow(i + 1 + repeat * 3 * 12); //年(2020-2022) row.createCell(0).setCellValue(2020 + i / 12); //月(1-12) row.createCell(1).setCellValue(i % 12 + 1); //売上(上下30%ぶれの乱数) row.createCell(2).setCellValue((int)(1000000 * (0.7 + Math.random() * 0.6))); }); } } |
実行結果
こんな感じにピボットテーブルが作られます。
サンプルの解説
XSSFSheet#createPivotTable(AreaReference,CellReference)でピボットテーブルを作成します。
系列データの範囲は、この引数内のAreaReferenceで指定します。
ピボットテーブルの行、列、値は、それぞれXSSFPivotTable#addRowLabel(int)などで指定しています。
この引数は系列データの範囲にある、列番号を指定します。
また、値データの追加の時は、集計する方法の設定が必要です。このサンプルでは合計にしています。
※このコードを使用するには、別途Apache POIの入手が必要です。
入手方法などはこちらの記事に書いてあります。