シート上の位置情報の取得

読み込み時、書き込み時にマッピングしたセルのアドレス取得できます。

取得方法は複数ありますが、Map<String, CellPosition> positions フィールドを用いるのが記述量を少なくできます。

  1. Map<String, CellPosition> positions というフィールドを定義しておくとプロパティ名をキーにセルの位置がセットされるようになっています。

  • アノテーション @XlsMapColumns のセルの位置情報のキーは、 <プロパティ名>[<セルの見出し>] としてセットされます。

  • アノテーション @XlsArrayColumns のセルの位置情報のキーは、 <プロパティ名>[<セルのインデックス>] としてセットされます。

  1. アノテーションを付与した <setterメソッド名>Position というメソッドを用意しておくと、引数にセルの位置が渡されます。

  • 位置情報を取得用のsetterメソッドは以下のいずれかの引数を取る必要があります。

    • int x, int y

    • com.gh.mygreen.xlsmapper.util.CellPosition

  • ただし、@XlsMapColumns に対するsetterメソッドは、第一引数にセルの見出しが必要になります。

    • String key, int x, int y

    • String key, com.gh.mygreen.xlsmapper.util.CellPosition

  1. アノテーションを付与した <フィールド名>Position という com.gh.mygreen.xlsmapper.util.CellPosition 型のフィールドを用意しておくと、セルの位置が渡されます。

  • ただし、@XlsMapColumns に対するフィールドは、Map<String, CellPosition> 型にする必要があります。キーには見出しが入ります。

  1. com.gh.mygreen.xlsmapper.util.CellPosition クラスの代わりに、以下のクラスでも代替できます。

  • java.awt.Point

  • org.apache.poi.ss.util.CellAddress

 1public class SampleRecord {
 2
 3    // 汎用的な位置情報
 4    public Map<String, CellPosition> positions;
 5
 6
 7    @XlsColumns(label="名前")
 8    private String name;
 9
10    // プロパティごとに個別に位置情報を定義するフィールド
11    private Point namePosition;
12
13    // プロパティごとに個別に位置情報を定義するメソッド(Pointクラス)
14    // フィールド positionsが定義あれば必要ありません。
15    public void setNamePosition(CellPosition position) {
16        //...
17    }
18
19    // プロパティごとに個別に位置情報を定義するメソッド(Pointクラス)
20    // フィールド positionsが定義あれば必要ありません。
21    public void setNamePosition(int x, int y) {
22        //...
23    }
24
25    // @XlsMapColumnsの場合
26    @XlsMapColumns(previousColumnName="名前")
27    private Map<String, String> attendedMap;
28
29    // プロパティごとに個別に位置情報を定義するフィールド
30    private Map<String, CellPosition> attendedMapPosition;
31
32    // プロパティごとに個別に位置情報を定義するメソッド1
33    // @XlsMapColumnsの場合keyは、セルの見出しの値
34    // フィールド positionsが定義あれば必要ありません。
35    public void setAttendedMapPosition(String key, CellPosition position) {
36        //...
37    }
38
39    // プロパティごとに個別に位置情報を定義するメソッド2
40    // @XlsMapColumnsの場合keyは、セルの見出しの値
41    // フィールド positionsが定義あれば必要ありません。
42    public void setAttendedMapPosition(String key, int x, int y) {
43        //...
44    }
45
46}

注釈

フィールド Map<String, CellPosition> positions と対応するsetterメソッドやフィールドをそれぞれ定義していた場合、 優先度 positions > setterメソッド > フィールド に従い設定されます。

書き込み時の位置情報取得の注意点

書き込み時は、行を追加/削除する処理がある場合、アノテーションを付与したプロパティの処理順序によって、セルの位置が正しく取得できない場合があります。

例えば、既に処理して取得したセルの位置情報よりも、上方の表で後から行を削除、追加したとき、取得済みのセルの位置情報が不正になります。

このような場合、アノテーション @XlsOrder をプロパティに付与して、処理順序を一定に保ちます。

 1@XlsSheet(name="情報")
 2public Employee {
 3    // セルの位置情報
 4    public Map<String, Point> positions;
 5
 6    @XlsOrder(1) // プロパティの処理順序を指定します。
 7    @XlsHorizontalRecords(tableLabel="履歴", terminal=RecordTerminal.Border)
 8    @XlsRecordOption(overOperation=OverOperation.Insert, remainedOperation=RemainedOperation.Delete) // データによって行の追加、削除する設定
 9    private List<EmployeeHistory> histories;
10
11    @XlsOrder(2) // プロパティの処理順序を指定します。
12    @XlsLabelledCell(label="名前")
13    private String name;
14
15}