表も良いけど、グラフがあるとやっぱりわかりやすいですよね。
Excelの強みだねー。
Apache POIを使って、Excelで折れ線グラフを書くサンプル
Apache POIを使ってExcelファイルを作成します。
乱数で適当に作った6カ月間の売上と粗利の推移グラフを描きます。
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 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 | import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.util.stream.IntStream; import org.apache.poi.ss.usermodel.Cell; import org.apache.poi.ss.usermodel.Row; import org.apache.poi.ss.util.CellRangeAddress; import org.apache.poi.xddf.usermodel.chart.AxisPosition; import org.apache.poi.xddf.usermodel.chart.ChartTypes; import org.apache.poi.xddf.usermodel.chart.LegendPosition; import org.apache.poi.xddf.usermodel.chart.MarkerStyle; import org.apache.poi.xddf.usermodel.chart.XDDFCategoryAxis; import org.apache.poi.xddf.usermodel.chart.XDDFChartLegend; import org.apache.poi.xddf.usermodel.chart.XDDFDataSource; import org.apache.poi.xddf.usermodel.chart.XDDFDataSourcesFactory; import org.apache.poi.xddf.usermodel.chart.XDDFLineChartData; import org.apache.poi.xddf.usermodel.chart.XDDFNumericalDataSource; import org.apache.poi.xddf.usermodel.chart.XDDFValueAxis; import org.apache.poi.xssf.usermodel.XSSFChart; import org.apache.poi.xssf.usermodel.XSSFClientAnchor; import org.apache.poi.xssf.usermodel.XSSFDrawing; import org.apache.poi.xssf.usermodel.XSSFSheet; import org.apache.poi.xssf.usermodel.XSSFWorkbook; public class ExcelChartTest { 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); //折れ線グラフ作成 createChart(sheet); //Excelファイル書き込み wb.write(fileOut); }catch(Exception e) { e.printStackTrace(); } } private static void createChart(XSSFSheet sheet) throws FileNotFoundException, IOException { //グラフの表示位置設定 XSSFDrawing drawing = sheet.createDrawingPatriarch(); XSSFClientAnchor anchor = drawing.createAnchor(0, 0, 0, 0, 0, 4, 7, 26); //グラフ作成・タイトル設定 XSSFChart chart = drawing.createChart(anchor); chart.setTitleText("6カ月推移"); chart.setTitleOverlay(false); //凡例設定 XDDFChartLegend legend = chart.getOrAddLegend(); legend.setPosition(LegendPosition.BOTTOM); //軸ラベル設定 XDDFCategoryAxis bottomAxis = chart.createCategoryAxis(AxisPosition.BOTTOM); bottomAxis.setTitle("年月"); XDDFValueAxis leftAxis = chart.createValueAxis(AxisPosition.LEFT); leftAxis.setTitle("金額"); //データソース(系列データ)作成 XDDFDataSource<String> dsYyyyMm = XDDFDataSourcesFactory.fromStringCellRange(sheet, new CellRangeAddress(0, 0, 0, 5)); XDDFNumericalDataSource<Double> dsSales = XDDFDataSourcesFactory.fromNumericCellRange(sheet, new CellRangeAddress(1, 1, 0, 5)); XDDFNumericalDataSource<Double> dsProfit = XDDFDataSourcesFactory.fromNumericCellRange(sheet, new CellRangeAddress(2, 2, 0, 5)); //データソース(系列データ)、ラベル等を設定 XDDFLineChartData data = (XDDFLineChartData) chart.createData(ChartTypes.LINE, bottomAxis, leftAxis); XDDFLineChartData.Series s1 = (XDDFLineChartData.Series) data.addSeries(dsYyyyMm, dsSales); s1.setTitle("売上", null); s1.setSmooth(false); s1.setMarkerStyle(MarkerStyle.STAR); XDDFLineChartData.Series s2 = (XDDFLineChartData.Series) data.addSeries(dsYyyyMm, dsProfit); s2.setTitle("粗利", null); s2.setSmooth(false); s2.setMarkerSize((short) 6); s2.setMarkerStyle(MarkerStyle.SQUARE); //プロット chart.plot(data); } private static void createCellData(XSSFSheet sheet) { Row row1 = sheet.createRow(0); Row row2 = sheet.createRow(1); Row row3 = sheet.createRow(2); //乱数でとりあえず上下30%ぶれのデータを準備 IntStream.range(0, 6).forEach(i -> { //年月 Cell cell = row1.createCell(i); cell.setCellValue("2023年" + (i + 1) + "月"); //売上 cell = row2.createCell(i); cell.setCellValue((int)(1000000 * (0.7 + Math.random() * 0.6))); //粗利 cell = row3.createCell(i); cell.setCellValue((int)(200000 * (0.7 + Math.random() * 0.6))); }); } } |
実行結果
こんな感じにグラフが描かれます。
サンプルの解説
XSSFChartが肝になるクラスです。
タイトル、データ、軸ラベルなどをセットして、最後にXSSFChart#plot(XDDFChartData)で作成しています。
※このコードを使用するには、別途Apache POIの入手が必要です。
入手方法などはこちらの記事に書いてあります。