@XlsRecordFinder
アノテーション @XlsHorizontalRecords 、 @XlsVerticalRecords において、データレコードの開始位置が既存のアノテーションの属性だと表現できない場合に、任意の実装方法を指定するようにします。 [ver.2.0+]
属性
value
で、レコードの開始位置を検索するRecordFinder
の実装クラスを指定します。属性
args
で、レコードの開始位置を検索する実装クラスに渡す引数を指定します。
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}