@XlsRecordFinder

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

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

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

_images/RecordFinder.png

RecordFinder

任意の位置のレコードをマッピングする場合
 1// マッピングの定義
 2@XlsSheet(name="Users")
 3public class SheetSheet {
 4
 5    // クラスAに対するマッピング定義
 6    @XlsOrder(1)
 7    // マッピングの終了条件が、「クラスB」であるため、terminalLabelを指定します。汎用的に正規表現で指定します。
 8    @XlsHorizontalRecords(tableLabel="成績一覧", bottom=2, terminal=RecordTerminal.Border, terminateLabel="/クラス.+/")
 9    // クラスAの見出しを探すために、属性argsでクラス名を指定します。
10    @XlsRecordFinder(value=ClassNameRecordFinder.class, args="クラスA")
11    private List<Record> classA;
12
13    // クラスBに対するマッピング定義
14    @XlsOrder(2)
15    // マッピングの終了条件が、終端のセルに罫線があるのため、terminalを指定します。
16    @XlsHorizontalRecords(tableLabel="成績一覧", bottom=2, terminal=RecordTerminal.Border, terminateLabel="/クラス.+/")
17    // クラスAの見出しを探すために、属性argsでクラス名を指定します。
18    @XlsRecordFinder(value=ClassNameRecordFinder.class, args="クラスB")
19    private List<Record> classB;
20
21}
22
23// クラス用の見出しのレコードを探すクラス
24class ClassNameRecordFinder implements RecordFinder {
25
26    @Override
27    public CellPosition find(ProcessCase processCase, String[] args, Sheet sheet,
28            CellPosition initAddress, Object beanObj, Configuration config) {
29
30        // アノテーション @XlsRecordFinder の属性argsで指定された値を元にセルを検索します。
31        final String className = args[0];
32        Cell classNameCell = CellFinder.query(sheet, className, config)
33                .startPosition(initAddress)
34                .findWhenNotFoundException();
35
36        // 見出し用のセルから1つ下がデータレコードの開始位置
37        return CellPosition.of(classNameCell.getRowIndex()+1, initAddress.getColumn());
38    }
39
40}
41
42// ユーザレコードの定義
43public class UserRecord {
44
45    @XlsColumn(columnName="No.", optional=true)
46    private int no;
47
48    @XlsColumn(columnName="氏名")
49    private String name;
50
51    @XlsColumn(columnName="算数")
52    private Integer sansu;
53
54    @XlsColumn(columnName="国語")
55    private Integer kokugo;
56
57    @XlsColumn(columnName="合計")
58    @XlsFormula(value="SUM(D{rowNumber}:E{rowNumber})", primary=true)
59    private Integer sum;
60
61    @XlsIgnorable
62    public boolean isEmpty() {
63        return IsEmptyBuilder.reflectionIsEmpty(this, "positions", "labels", "no");
64    }
65
66    // getter、setterは省略
67
68}