@XlsRecordFinder

アノテーション @XlsHorizontalRecords@XlsVerticalRecords において、データレコードの開始位置が既存のアノテーションの属性だと表現できない場合に、任意の実装方法を指定するようにします。 [ver.2.0+]

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

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

_images/RecordFinder.png

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
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
// マッピングの定義
@XlsSheet(name="Users")
public class SheetSheet {

    // クラスAに対するマッピング定義
    @XlsOrder(1)
    // マッピングの終了条件が、「クラスB」であるため、terminalLabelを指定します。汎用的に正規表現で指定します。
    @XlsHorizontalRecords(tableLabel="成績一覧", bottom=2, terminal=RecordTerminal.Border, terminateLabel="/クラス.+/")
    // クラスAの見出しを探すために、属性argsでクラス名を指定します。
    @XlsRecordFinder(value=ClassNameRecordFinder.class, args="クラスA")
    private List<Record> classA;

    // クラスBに対するマッピング定義
    @XlsOrder(2)
    // マッピングの終了条件が、終端のセルに罫線があるのため、terminalを指定します。
    @XlsHorizontalRecords(tableLabel="成績一覧", bottom=2, terminal=RecordTerminal.Border, terminateLabel="/クラス.+/")
    // クラスAの見出しを探すために、属性argsでクラス名を指定します。
    @XlsRecordFinder(value=ClassNameRecordFinder.class, args="クラスB")
    private List<Record> classB;

}

// クラス用の見出しのレコードを探すクラス
class ClassNameRecordFinder implements RecordFinder {

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

        // アノテーション @XlsRecordFinder の属性argsで指定された値を元にセルを検索します。
        final String className = args[0];
        Cell classNameCell = CellFinder.query(sheet, className, config)
                .startPosition(initAddress)
                .findWhenNotFoundException();

        // 見出し用のセルから1つ下がデータレコードの開始位置
        return CellPosition.of(classNameCell.getRowIndex()+1, initAddress.getColumn());
    }

}

// ユーザレコードの定義
public class UserRecord {

    @XlsColumn(columnName="No.", optional=true)
    private int no;

    @XlsColumn(columnName="氏名")
    private String name;

    @XlsColumn(columnName="算数")
    private Integer sansu;

    @XlsColumn(columnName="国語")
    private Integer kokugo;

    @XlsColumn(columnName="合計")
    @XlsFormula(value="SUM(D{rowNumber}:E{rowNumber})", primary=true)
    private Integer sum;

    @XlsIgnorable
    public boolean isEmpty() {
        return IsEmptyBuilder.reflectionIsEmpty(this, "positions", "labels", "no");
    }

    // getter、setterは省略

}