Java | 複数の入力をまとめて List に格納するサンプル

Java Java
スポンサーリンク

では、前回の「統計値表をPDFに出力」に 条件付き書式をさらに発展させて、棒グラフ風の可視化(セル幅を値に応じて伸ばす) を加えるサンプルを紹介します。

サンプルコード:棒グラフ風セル付き PdfPTable

import java.io.FileOutputStream;
import java.util.*;
import com.itextpdf.text.*;
import com.itextpdf.text.pdf.*;

public class ChartPDFWithBarCells {
    public static void main(String[] args) {
        // ダミーデータ
        Map<String, List<Integer>> datasets = new LinkedHashMap<>();
        datasets.put("データセット1", Arrays.asList(3, 5, 2, 7));
        datasets.put("データセット2", Arrays.asList(2, 4, 6, 5));

        try {
            Document document = new Document();
            PdfWriter.getInstance(document, new FileOutputStream("chart_with_bar_cells.pdf"));
            document.open();

            document.add(new Paragraph("=== 棒グラフ風セル付き統計表 ===\n\n"));

            PdfPTable table = new PdfPTable(2); // 列数: ラベル, 棒グラフ風セル
            table.setWidthPercentage(100);

            // ヘッダー
            PdfPCell h1 = new PdfPCell(new Phrase("データセット"));
            h1.setBackgroundColor(BaseColor.LIGHT_GRAY);
            table.addCell(h1);
            PdfPCell h2 = new PdfPCell(new Phrase("値の可視化"));
            h2.setBackgroundColor(BaseColor.LIGHT_GRAY);
            table.addCell(h2);

            // 最大値を全体から取得(スケーリング用)
            int globalMax = datasets.values().stream()
                    .flatMap(List::stream)
                    .max(Integer::compareTo)
                    .orElse(1);

            // 各データセットを行として追加
            for (Map.Entry<String, List<Integer>> entry : datasets.entrySet()) {
                String label = entry.getKey();
                List<Integer> values = entry.getValue();

                table.addCell(label);

                // 棒グラフ風のサブテーブル
                PdfPTable barTable = new PdfPTable(values.size());
                for (int val : values) {
                    // 値に応じてセルの背景色を塗る
                    PdfPCell cell = new PdfPCell(new Phrase(String.valueOf(val)));
                    cell.setHorizontalAlignment(Element.ALIGN_CENTER);

                    // 値に応じて色を変える(例:平均以上は緑、未満は赤)
                    double avg = values.stream().mapToInt(Integer::intValue).average().orElse(0);
                    if (val >= avg) {
                        cell.setBackgroundColor(new BaseColor(144, 238, 144)); // ライトグリーン
                    } else {
                        cell.setBackgroundColor(new BaseColor(255, 182, 193)); // ライトピンク
                    }

                    // 値に応じてセルの最小高さを調整(棒グラフ風)
                    float barHeight = (float) val / globalMax * 30f; // 最大30pt高さ
                    cell.setMinimumHeight(barHeight + 15); // 数字表示分を足す

                    barTable.addCell(cell);
                }

                PdfPCell barCell = new PdfPCell(barTable);
                table.addCell(barCell);
            }

            document.add(table);
            document.close();

            System.out.println("chart_with_bar_cells.pdf に保存しました。");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
Java

✅ 実行結果

  • chart_with_bar_cells.pdf が生成されます
  • 各データセットの行に「値の可視化」列があり、セルの高さと色で棒グラフ風に表現されます
  • 平均以上の値は緑、未満は赤で表示され、直感的に比較可能

ポイント

  • setMinimumHeight() を値に応じて変化させることで「棒の長さ」を表現
  • setBackgroundColor() で条件付き書式(平均以上=緑、未満=赤)を実現
  • サブテーブルを使って複数の値を横並びに表示

👉 これで「統計値表+棒グラフ風セルのPDF出力」が完成しました。

Java
スポンサーリンク
シェアする
@lifehackerをフォローする
スポンサーリンク
タイトルとURLをコピーしました