@XlsVerticalRecords

垂直方向に連続する列をListまたは配列にマッピングします。 要するに @XlsHorizontalRecords を垂直方向にしたものです。

メソッドに定義する場合、@XlsHorizontalRecords と同じくList型の引数を1つだけ取るsetterメソッドに対して付与します。

ここでは、アノテーション @XlsHorizontalRecords と異なる部分を説明します。 共通の使い方は、アノテーション @XlsHorizontalRecords の説明を参照してください。

_images/VerticalRecord.png

VerticalRecords

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
// シート用クラス
@XlsSheet(name="Weather")
public class SampleSheet {

    @XlsVerticalRecords(tableLabel="天気情報")
    private List<WeatherRecord> records;

}

// レコード用クラス
public class WeatherRecord {

    @XlsColumn(columnName="時間")
    private String time;

    @XlsColumn(columnName="降水")
    private double precipitation;
}

表の名称位置の指定

実際に表を作る場合、垂直方向ですが表の名称は上方に設定することが一般的です。 そのような場合、属性 tableLabelAbove の値を true に設定すると表のタイトルが上方に位置するとして処理します。 [ver1.0+]

_images/VerticalRecord_tableLabelAbove.png

VerticalRecords(tableLabelAbove)

1
2
3
4
5
6
@XlsSheet(name="Users")
public class SampleSheet {

    @XlsVerticalRecords(tableLabel="天気情報", tableLabelAbove=true)
    private List<WeatherRecord> records;
}

表の名称から開始位置が離れた場所にある場合(bottom)

属性 tableLabelAbove の値が true のときのみ有効になります。 表の名称がセルの直後に表がなく離れている場合、属性 bottom で表の開始位置が 下方向 にどれだけ離れているか指定します。 [ver2.0]+

アノテーション @XlsHorizontalRecords の属性 bottom と同じような意味になります。

_images/VerticalRecord_bottom.png

VerticalRecords(bottom)

1
2
3
4
5
6
@XlsSheet(name="Users")
public class SampleSheet {

    @XlsVerticalRecords(tableLabel="天気情報", tableLabelAbove=true, bottom=3)
    private List<WeatherRecord> records;
}

表の見出しが横に結合されデータレコードの開始位置が離れた場所にある場合

表の見出しセルが横に結合され、データレコードの開始位置が離れている場合、属性 headerRight でデータレコードの開始位置がどれだけ離れているか指定します。 [ver1.1+]

アノテーション @XlsHorizontalRecords の属性 headerBottom と同じような意味になります。

下記の例の場合、見出しの「テスト結果」は横に結合されているため @XlsColumn(headerMerged=N) と組み合わせて利用します。

_images/VerticalRecord_headerRight.png

VerticalRecords(headerRight)

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
// シート用クラス
@XlsSheet(name="Weather")
public class SampleSheet {

    // 見出しが横に結合され、データのレコードの開始位置が離れている場合
    @XlsVerticalRecords(tableLabel="天気情報", headerRight=2)
    private List<WeatherRecord> records;

}

// レコード用クラス
public class WeatherRecord {

    @XlsColumn(columnName="時間")
    private String time;

    // セル「降水」のマッピング
    @XlsColumn(columnName="測定結果")
    private double precipitation;

    // セル「気温」のマッピング
    // 結合されている見出しから離れている数を指定する
    @XlsColumn(columnName="測定結果", headerMerged=1)
    private int temperature;

    // セル「天気」のマッピング
    // 結合されている見出しから離れている数を指定する
    @XlsColumn(columnName="測定結果", headerMerged=2)
    private String wather;

}

書き込み時にレコードが不足、余分である場合の操作の指定

アノテーション @XlsRecordOption を指定することで、書き込み時のレコードの制御を指定することができます。

  • 属性 overOperation で、書き込み時にJavaオブジェクトのレコード数に対して、シートのレコード数が足りないときの操作を指定します。

    • ただし、 @XlsVerticalRecords の場合、列の挿入を行う OverOperation#Insert は使用できません。

  • 属性 remainedOperation で、書き込み時にJavaオブジェクトのレコード数に対して、シートのレコード数が余っているときの操作を指定します。

    • ただし、 @XlsVerticalRecords の場合、列の削除を行う RemainedOperation#Delete は使用できません。

_images/VerticalRecord_RecordOption.png

VerticalRecords(RecordOption)

1
2
3
4
5
6
7
8
@XlsSheet(name="Users")
public class SampleSheet {

    @XlsVerticalRecords(tableLabel="天気情報")
    @XlsRecordOption(overOperation=OverOperation.Copy, remainedOperation=RemainedOperation.Clear)
    private List<WeatherRecord> records;

}

任意の位置からレコードが開始するかを指定する場合

データレコードの途中で中見出しがあり、分割されているような表の場合、アノテーション @XlsRecordFinder で、レコードの開始位置を決める処理を指定することができます。 [ver2.0+]

  • 属性 value で、レコードの開始位置を検索する実装クラスを指定します。

  • 属性 args で、レコードの開始位置を検索する実装クラスに渡す引数を指定します。

_images/VerticalRecord_RecordFinder.png

VerticalRecords(RecordFinder)

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
// マッピングの定義
@XlsSheet(name="Weather")
public class SampleSheet {

    @XlsOrder(1)
    @XlsVerticalRecords(tableLabel="天気情報", tableLabelAbove=true, terminal=RecordTerminal.Border, terminateLabel="/{0-9}月{0-9}[1-2]日/")
    @XlsRecordFinder(value=DateRecordFinder.class, args="2月1日")
    private List<WeatherRecord> date1;

    @XlsOrder(2)
    @XlsVerticalRecords(tableLabel="天気情報", tableLabelAbove=true, terminal=RecordTerminal.Border, terminateLabel="/{0-9}月{0-9}[1-2]日/")
    @XlsRecordFinder(value=DateRecordFinder.class, args="2月1日")
    private List<WeatherRecord> date2;

}

// 日にち用の見出しのレコードを探すクラス
public class DateRecordFinder implements RecordFinder {

    @Override
    public CellPosition find(ProcessCase processCase, String[] args, Sheet sheet,
            CellPosition initAddress, Object beanObj, Configuration config) {

        // 実装は省略
    }

}