@XlsArrayColumns
アノテーション @XlsHorizontalRecords もしくは @XlsVerticalRecords において、 隣接する連続したカラムを、Collection(List, Set)または配列にマッピングします。 [ver.2.0+]
属性
columnName
で、見出しとなるセルのラベルを指定します。属性
size
で、連続するセルの個数を指定します。見出しとなるカラムは、結合している必要があります。
見出しとなるセルが見つからない場合はエラーとなりますが、属性
optional
をtrue
とすることで無視して処理を続行します。Collection(List, Set)型または配列のフィールドに付与します。
List型などの場合、Genericsのタイプとして、マッピング先のクラスを指定します。
指定しない場合は、アノテーションの属性
elementClass
でクラス型を指定します。
1public class SampleRecord {
2
3 @XlsColumn(columnName="ID")
4 private int id;
5
6 @XlsColumn(columnName="名前")
7 private String name;
8
9 @XlsArrayColumns(columnName="ふりがな", size=10)
10 private List<String> nameRuby;
11}
結合したセルをマッピングする場合
属性
elementMerged
で、セルの結合を考慮するか指定します。trueのときは、結合されているセルを1つのセルとしてマッピングします。
falseの場合は、結合されていても解除した状態と同じマッピング結果となります。
ただし、falseのときは、書き込む際には結合が解除されます。
初期値はtrueであるため、特に意識はする必要はありません。
セルが結合されている場合は、結合後の個数を指定します。
1public class SampleRecord {
2
3 @XlsColumn(columnName="ID")
4 private int id;
5
6 @XlsColumn(columnName="名前")
7 private String name;
8
9 // elementMerged=trueは初期値なので、省略可
10 @XlsArrayColumns(columnName="連絡先", size=3)
11 private List<String> contactInfos;
12}
書き込み時に配列・リストのサイズが不足、または余分である場合
アノテーション @XlsArrayOption を指定することで、書き込み時のセルの制御を指定できます。
属性
overOperation
で、書き込み時にJavaオブジェクトの配列・リストのサイズに対して、属性size
の値が小さく、足りない場合の操作を指定します。属性
remainedOperation
で、書き込み時にJavaオブジェクトの配列・リストのサイズに対して、属性size
の値が大きく、余っている場合の操作を指定します。
1public class SampleRecord {
2
3 @XlsColumn(columnName="ID")
4 private int id;
5
6 @XlsColumn(columnName="名前")
7 private String name;
8
9 @XlsArrayColumns(columnName="ふりがな", size=6)
10 @XlsArrayOption(overOperation=OverOperation.Error, remainedOperation=RemainedOperation.Clear)
11 private List<String> nameRuby;
12}
位置情報/見出し情報を取得する際の注意事項
マッピング対象のセルのアドレスを取得する際に、フィールド Map<String, Point> positions
を定義しておけば、自動的にアドレスがマッピングされます。
通常は、キーにはプロパティ名が記述(フィールドの場合はフィールド名)が入ります。
アノテーション @XlsArrayColumns
でマッピングしたセルのキーは、インデックス付きの <プロパティ名>[<インデックス>]
形式になります。
インデックスは、0から始まります。
同様に、マッピング対象の見出しを取得する、フィールド Map<String, String> labels
へのアクセスも、キーは、 <プロパティ名>[<インデックス>]
の形式になります。
ただし、見出し情報の場合は、全ての要素が同じ値になるため、従来通りの <プロパティ名>
でも取得できます。
1public class SampleRecord {
2
3 // 位置情報
4 private Map<String, Point> positions;
5
6 // 見出し情報
7 private Map<String, String> labels;
8
9 @XlsColumn(columnName="ID")
10 private int id;
11
12 @XlsColumn(columnName="名前")
13 private String name;
14
15 @XlsArrayColumns(columnName="ふりがな", size=6)
16 private List<String> nameRuby;
17}
18
19// 位置情報・見出し情報へのアクセス
20SampleRecord record = /* レコードのインスタンスの取得 */;
21
22Point position = record.positions.get("nameRuby[2]");
23
24String label = recrod.labeles.get("nameRuby[2]");
25
26// 見出し情報の場合、従来通りのインデックスなしでも取得できる
27String label = recrod.labeles.get("nameRuby");
見出しを正規表現、正規化して指定する場合
シートの構造は同じだが、ラベルのセルが微妙に異なる場合、ラベルセルを正規表現による指定が可能です。 また、空白や改行を除去してラベルセルを比較するように設定することも可能です。 [ver1.1+]
正規表現で指定する場合、アノテーションの属性の値を
/正規表現/
のように、スラッシュで囲み指定します。スラッシュで囲まない場合、通常の文字列として処理されます。
正規表現の指定機能を有効にするには、システム設定のプロパティ
regexLabelText
の値を trueに設定します。
ラベセルの値に改行が空白が入っている場合、それらを除去し、正規化してアノテーションの属性値と比較することが可能です。
正規化とは、空白、改行、タブを除去することを指します。
ラベルを正規化する機能を有効にするには、システム設定のプロパティ
normalizeLabelText
の値を trueに設定します。
これらの指定が可能な属性は、columnName
です。
1// システム設定
2XlsMapper xlsMapper = new XlsMapper();
3xlsMapper.getConfiguration()
4 .setRegexLabelText(true) // ラベルを正規表現で指定可能にする機能を有効にする。
5 .setNormalizeLabelText(true); // ラベルを正規化して比較する機能を有効にする。
6
7// レコード用クラス
8public class SampleRecord {
9
10 @XlsColumn(columnName="ID")
11 private int id;
12
13 // 正規表現による指定
14 @XlsColumn(columnName="/名前.+/")
15 private String name;
16
17 // 正規表現による指定
18 @XlsArrayColumns(columnName="/ふりがな.+/", size=10)
19 private List<String> nameRuby;
20
21
22}