【Java】Apache POI グラフを複製したい

Apache POI を使ってエクセルの資料を作成してるんだけど、
テンプレートとなるグラフをコピーして参照データのセルとか
だけ変えたかったので、その方法をメモメモ

情報が少なくて苦労したけど
実際の手順は意外とシンプルだった

    XSSFSheet sheet = (XSSFSheet) workbook.getSheet("sheet1");
    XSSFDrawing drawing = sheet.createDrawingPatriarch();

    // テンプレートとなるグラフ
    List<XSSFChart> chartTmp = drawing.getCharts();

    // 作成するグラフの挿入場所 offsetの単位はピクセル数x9525?
    XSSFClientAnchor anchor = drawing.createAnchor(1*9525, 0, 0, 0, 0, 0, 10, 10);

    // グラフ作成
    XSSFChart chart = drawing.createChart(anchor);

    // 作成したグラフにテンプレートをインポート
    chart.importContent(chartTmp);
    
    CTChart cct = chart.getCTChart();
    CTPlotArea pa = cct.getPlotArea();

    // 既存のSERIES(系列)の参照値のみ変更したい場合
    for (CTLineChart clc : pa.getLineChartList()) {
        int i = 0;
        for (CTLineSer cls : clc.getSerList()) {
            cls.getCat().getStrRef().setF("sheet1!$D$10:$I$10");
            cls.getVal().getNumRef().setF("sheet1!$D$"+(10+i)+":$I$"+(10+i));
            i++;
        }
    }

    // SERIES(系列)を追加したい場合
    CTLineChart clc = pa.getLineChartArray(0);
    CTLineSer cls = clc.addNewSer(); 
    cls.addNewTx().addNewStrRef().setF("sheet1!$E$11");
//      ctLineSer.addNewIdx().setVal(2); //2= Color Grey 
    cls.addNewCat().addNewStrRef().setF("sheet1!$D$10:$I$10");
    cls.addNewVal().addNewNumRef().setF("sheet1!$D$11:$I$11");
    cls.addNewSmooth().setVal(false);

コメント

タイトルとURLをコピーしました