倭マン's BLOG

くだらない日々の日記書いてます。 たまにプログラミング関連の記事書いてます。 書いてます。

PoiBuilder で Quick Guide (10) : 色のカスタマイズ

今回は色のカスタマイズ (Custom colors) です(一覧)。

Java コード


色のカスタマイズの仕方は HSSF と XSSF とでかなり違うようです。 まずは HSSF の方から。

    HSSFWorkbook wb = new HSSFWorkbook();
    HSSFSheet sheet = wb.createSheet();
    HSSFRow row = sheet.createRow((short) 0);
    HSSFCell cell = row.createCell((short) 0);
    cell.setCellValue("Default Palette");

    //apply some colors from the standard palette,
    // as in the previous examples.
    //we'll use red text on a lime background

    HSSFCellStyle style = wb.createCellStyle();
    style.setFillForegroundColor(HSSFColor.LIME.index);
    style.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);

    HSSFFont font = wb.createFont();
    font.setColor(HSSFColor.RED.index);
    style.setFont(font);

    cell.setCellStyle(style);

    //now, let's replace RED and LIME in the palette
    // with a more attractive combination
    // (lovingly borrowed from freebsd.org)

    cell.setCellValue("Modified Palette");

    //creating a custom palette for the workbook
    HSSFPalette palette = wb.getCustomPalette();

    //replacing the standard red with freebsd.org red
    palette.setColorAtIndex(HSSFColor.RED.index,
            (byte) 153,  //RGB red (0-255)
            (byte) 0,    //RGB green
            (byte) 0     //RGB blue
    );
    //replacing lime with freebsd.org gold
    palette.setColorAtIndex(HSSFColor.LIME.index, (byte) 255, (byte) 204, (byte) 102);

ワークブック (HSSFWorkbook) からパレットに対応する HSSFPalette オブジェクトを取得して、色のカスタマイズを行います。 HSSF で扱える色は HSSFColor クラスに定数として定義されているようです。

次は XSSF のバージョン。

    XSSFWorkbook wb = new XSSFWorkbook();
    XSSFSheet sheet = wb.createSheet();
    XSSFRow row = sheet.createRow(0);
    XSSFCell cell = row.createCell( 0);
    cell.setCellValue("custom XSSF colors");

    XSSFCellStyle style1 = wb.createCellStyle();
    style1.setFillForegroundColor(new XSSFColor(new java.awt.Color(128, 0, 128)));
    style1.setFillPattern(CellStyle.SOLID_FOREGROUND);

色を表すのに AWT の Color オブジェクトが使えます。 ただし、直接ではなく XSSFColor オブジェクトを生成して、それを CellStyle オブジェクトにセットする必要がありますが。 まぁ、HSSF よりは簡単ですかね。

PoiBuilder による構築


では PoiBuilder による構築方法を見ていきましょう。 まずは HSSF の場合。

@GrabResolver('http://www5.ocn.ne.jp/~coast/repo/')
@Grab('org.waman.tools:poi-builder:0.0.5')

import org.waman.tools.poi.PoiBuilder
import org.apache.poi.hssf.util.HSSFColor

def builder = new PoiBuilder()
def workbook = builder.hssfworkbook{
    sheet{
        row(0){
            cell(0, cellValue:'Default Palette',
                    cellStyle:cellStyle(
                        fillForegroundColor:HSSFColor.LIME.index,
                        fillPattern:SOLID_FOREGROUND,
                        font:font(color:HSSFColor.RED.index)))
        }
    }

    customPalette{
        setColorAtIndex(HSSFColor.RED.index, (byte)153, (byte)0, (byte)0)
        setColorAtIndex(HSSFColor.LIME.index, (byte)255, (byte)204, (byte)102)
    }
}

customPalette ノード*1によって HSSFPalette オブジェクトを取得し、その子ノードでそのオブジェクトのメソッドを呼び出してます。 どんなメソッドがあるかは API ドキュメントを参照のこと。 HSSFColor クラスに定義されている定数は PoiBuilder のプロパティとして取得できるようにはしていません。

次は XSSF の場合。 poi-builder 0.0.5 から OOXML への依存性 (XSSF を使うのに必要) は transitive に解決されるようにしました。 Grape などで依存性を解決する場合、別途 OOXML への依存性を付加する必要はありません。 で、ビルダーの方は以下のようになります:

@GrabResolver('http://www5.ocn.ne.jp/~coast/repo/')
@Grab('org.waman.tools:poi-builder:0.0.5')

import org.waman.tools.poi.PoiBuilder

def builder = new PoiBuilder()
def workbook = builder.xssfworkbook{
    sheet{
        row(0){
            cell(0, cellValue:'XSSF colors',
                    cellStyle:cellStyle(fillForegroundColor:color(128, 0, 128), fillPattern:SOLID_FOREGROUND))
        }
    }
}

XSSFColor オブジェクトは color ノードによって取得できるようにしてます。

作成されるスプレッドシート


HSSF


XSSF


プログラミングGROOVY

プログラミングGROOVY

*1:poi-builder 0.0.5 の実装では、実際には customPalette メソッドにクロージャを渡してるんですが。