2. 基本的な使い方¶
2.1. ダウンロード¶
Mavenを使用する場合は pom.xml に以下の記述を追加してください。
1 2 3 4 5 | <dependency>
<groupId>com.github.mygreen</groupId>
<artifactId>excel-cellformatter</artifactId>
<version>0.12</version>
</dependency>
|
本ライブラリは、ロギングライブラリ SLF4j を使用しているため、好きな実装を追加してください。
1 2 3 4 5 6 7 8 9 10 | <dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.7.1</version>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
|
2.2. Apaceh POIの場合¶
Apache POI を利用する場合は、 POICellFormatter を利用します。
書式が「m/d/yy」の時など、実行環境の言語設定によって異なる場合は、ロケールを指定します。
ロケールを指定しない場合は、デフォルトのロケールになるため、Linux環境などのでは注意してください。
Cellのインスタンスがnullの場合、空(Blank)セルとして扱います。
POIの場合、データの入力がない領域のセルは、nullとなるためです。
これはJExcelAPIの仕様に合わせるためです。
結合されたセルの場合、結合領域を走査し、非空セルがそのセルの値を評価します。
POIの場合、結合されたセルの領域は、基本的に左上のセルに値が設定され、それ以外のセルは空セルとなるためです。
ただし、古いバージョンのExcelだったり、プログラムから出力したExcelファイルの場合、 必ずしも左上のセルに値が入っているとは限らないため、結合した全ての領域を走査します。
これはJExcelAPIの仕様に合わせるためです。
数式や関数が設定されたセルの場合、それらを評価した結果を返します。
POIが対応していない数式や関数の場合、Excel上では正しく表示されていても、エラーセルの扱いとなります。
使用するPOIのバージョンによって対応する関数も異なります。
Cell cell = /* セルの値の取得 */;
final POICellFormatter cellFormatter = new POICellFormatter();
String contents = cellForrmatter.formatAsString(cell);
// ロケールを指定してフォーマットする。
contents = cellForrmatter.formatAsString(cell, Locale.JAPANESE);
書式に色の条件式など指定されている場合、詳細の結果を取得することもできます。
final POICellFormatter cellFormatter = new POICellFormatter();
// フォーマット結果の詳細を取得する
CellFormatResult result = cellForrmatter.format(cell);
// フォーマットした文字列の取得
String text = result.getText();
// 文字色が設定されている場合、その色の取得。
// 色が設定されていない場合は、nullを返す。
MSColor color = result.getTextColor();
// フォーマット対象の値を取得します。
// どのタイプの書式として処理されたかによって、値の取得方法がことなります。
if(result.isDate()) {
Date dateValue = result.getValueAsDate();
} else if(result.isNumber()) {
double numberValue = result.getValueAsDouble();
} else if(result.isText()) {
String stringValue = rsult.getValueAsString();
} else {
// エラー用セルやブランクセルの場合
}
2.3. JExcelAPIの場合¶
JExcelAPI を利用する場合は、 JXLCellFormatter を利用します。
日本語を含むExcelファイルの場合、文字コードを ISO8859_1 を指定します。
指定しない場合は、会計の書式中の円記号 ¥ が文字化けします。
Windows-31j と指定しても文字化けするため、注意してください。
1904年始まりの設定がされているExelファイルの設定かどうか、メソッド JXLUtils.isDateStart1904(...) で調べた値を渡します。
通常は1899年12月31日(Excel表記上は 1900年1月0日)が基準です。
JXLUtils.isDateStart1904(...)メソッドには、Sheetオブジェクトを引数にとるメソッドも用意されています。
書式が「m/d/yy」の時など、実行環境の言語設定によって切り替わる場合は、ロケールを指定します。
ロケールを指定しない場合は、デフォルトのロケールになるため、Linux環境などでは注意してください。
// シートの読み込み
final WorkbookSettings settings = new WorkbookSettings();
settings.setSuppressWarnings(true);
settings.setGCDisabled(true);
// 文字コードを「ISO8859_1」にしないと、一部の文字が文字化けします。
settings.setEncoding("ISO8859_1");
final Workbook workbook = Workbook.getWorkbook(in, settings);
// 1904年始まりのシートか調べる。
boolean startDate1904 = JXLUtils.isDateStart1904(workbook);
Cell cell = /* セルの値の取得 */;
final JXLCellFormatter cellFormatter = new JXLCellFormatter();
// セルの値を文字列として取得
String contents = cellForrmatter.formatAsString(cell, startDate1904);
// ロケールを指定してフォーマットする。
contents = cellForrmatter.formatAsString(cell, Locale.JAPANESE, startDate1904);
2.4. Javaオブジェクトの場合¶
Javaのオブジェクトを直接フォーマットすることもできます。
直接フォーマットをする場合、ObjectCellFormatter
(ver0.6から利用可能)を使用します。
フォーマットするには、
ObjectCellFormatter#formatAsString(<書式>, <値>)
を利用します。フォーマット可能なクラスは、Excelの型に対応する次のクラスになります。
文字列値:
String
ブール値:
boolean/Boolean
数値
プリミティブ型
byte/short/int/long/float/double
プリミティブ型のラッパークラス
Byte/Short/Integer/Long/Float/Double
。java.math.Number
のサブクラスAtomicInteger/AtomicLong/BigDecimal/BigInteger
。
日時:
java.util.Date
とそのサブクラスjava.sql.Date/java.sql.Time/java.sql.Timestamp
。
// 各型に対応したインタフェースを利用します。
ObjectCellFormatter cellFormatter = new ObjectCellFormatter();
String text = cellFormatter.formatAsString("yyyy\"年\"m\"月\"d\"日\";@", Timestamp.valueOf("2012-02-01 12:10:00.000"));
細かく設定を行いたい場合は、仮想的なセル
ObjectCell
のサブクラスのインスタンスを引数に渡します。文字列型を表すセル:
TextCell
ブール型を表すセル:
BooleanCell
数値型を表すセル:
NumberCell
日時型を表すセル:
DateCell
。1904年始まりなどの設定ができます。
//仮想的なセルのクラス「ObejctCell」の、型に合った具象クラスを利用します。
ObejctCell cell = new DateCell(Timestamp.valueOf("2012-02-01 12:10:00.000"), "yyyy\"年\"m\"月\"d\"日\";@", false)
CellFormatResult result = cellFormatter.format(cell);
// フォーマットした文字列の取得
String text = result.getText();
// 文字色が設定されている場合、その色の取得。
MSColor color = result.getTextColor();