8. シート情報の取得

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

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

取得方法は複数ありますが、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

 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
public class SampleRecord {

    // 汎用的な位置情報
    public Map<String, CellPosition> positions;


    @XlsColumns(label="名前")
    private String name;

    // プロパティごとに個別に位置情報を定義するフィールド
    private Point namePosition;

    // プロパティごとに個別に位置情報を定義するメソッド(Pointクラス)
    // フィールド positionsが定義あれば必要ありません。
    public void setNamePosition(CellPosition position) {
        //...
    }

    // プロパティごとに個別に位置情報を定義するメソッド(Pointクラス)
    // フィールド positionsが定義あれば必要ありません。
    public void setNamePosition(int x, int y) {
        //...
    }

    // @XlsMapColumnsの場合
    @XlsMapColumns(previousColumnName="名前")
    private Map<String, String> attendedMap;

    // プロパティごとに個別に位置情報を定義するフィールド
    private Map<String, CellPosition> attendedMapPosition;

    // プロパティごとに個別に位置情報を定義するメソッド1
    // @XlsMapColumnsの場合keyは、セルの見出しの値
    // フィールド positionsが定義あれば必要ありません。
    public void setAttendedMapPosition(String key, CellPosition position) {
        //...
    }

    // プロパティごとに個別に位置情報を定義するメソッド2
    // @XlsMapColumnsの場合keyは、セルの見出しの値
    // フィールド positionsが定義あれば必要ありません。
    public void setAttendedMapPosition(String key, int x, int y) {
        //...
    }

}

注釈

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

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

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

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

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

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
@XlsSheet(name="情報")
public Employee {
    // セルの位置情報
    public Map<String, Point> positions;

    @XlsOrder(1) // プロパティの処理順序を指定します。
    @XlsHorizontalRecords(tableLabel="履歴", terminal=RecordTerminal.Border)
    @XlsRecordOption(overOperation=OverOperation.Insert, remainedOperation=RemainedOperation.Delete) // データによって行の追加、削除する設定
    private List<EmployeeHistory> histories;

    @XlsOrder(2) // プロパティの処理順序を指定します。
    @XlsLabelledCell(label="名前")
    private String name;

}

8.2. シート上の見出しの取得

読み込み時、書き込み時にマッピングしたセルの見出しを取得することができます。

入力値検証の際などのメッセージの引数に使用したりします。

取得方法は複数ありますが、 Map<String, String> labels フィールドを用いるのが記述量が少なく簡単だと思います。

注釈

セルの見出しを取得できるのは、アノテーション @XlsLabelledCell, @XlsColumn, @XlsMapColumns を付与したプロパティです。

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

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

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

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

  • 位置情報を取得用のsetterメソッドは、引数 String 型を取る必要があります。

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

    • String key, String label

  • ただし、@XlsArrayColumns に対するsetterメソッドは、第一引数にセルのインデックスが必要になります。

    • int index, String label

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

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

  • また、@XlsArrayColumns に対するフィールドは、List<String> 型にする必要があります。

 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
public class SampleRecord {

    // 汎用的な見出し情報
    public Map<String, String> labels;

    // プロパティごとに個別に見出し情報を定義するフィールド
    private String nameLabel;

    @XlsColumns(label="名前")
    private String name;

    // プロパティごとに個別に見出し情報を定義するメソッド
    // フィールド labelsが定義あれば必要ありません。
    public void setNameLabel(String label) {
        //...
    }

    // @XlsMapColumnsの場合
    @XlsMapColumns(previousColumnName="出欠")
    private Map<String, String> attendedMap;

    // プロパティごとに個別に見出し情報を定義するフィールド
    private Map<String, String> attendedMapLabel;

    // プロパティごとに個別に見出し情報を定義するメソッド
    // @XlsMapColumnsの場合keyは、セルの見出しの値
    // フィールド labelsが定義あれば必要ありません。
    public void setAttendedMapLabel(String key, String label) {
        //...
    }

    // @XlsArrayColumnsの場合
    @XlsArrayColumns(columnName="ふりがな")
    private List<String> rubyList;

    // プロパティごとに個別に見出し情報を定義するフィールド
    private Map<String, String> rubyListLabel;

    // プロパティごとに個別に見出し情報を定義するメソッド
    // @XlsArrayColumnsの場合indexは、インデックスの値
    // フィールド labelsが定義あれば必要ありません。
    public void setRubyListLabel(int index, String label) {
        //...
    }


}

注釈

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

8.3. シート上のコメントの取得

読み込み時にマッピングしたセルに設定されているコメントを取得することができます。 [ver.2.1]

書き込み時は、セルにコメントを設定することができます。

取得方法は複数ありますが、 Map<String, String> comments フィールドを用いるのが記述量が少なく簡単だと思います。

注釈

セルのコメントを取得できるのは、アノテーション @XlsCell, @XlsLabelledCell, @XlsColumn, @XlsMapColumns, @XlsArrayColumns, @XlsArrayCell, @XlsLabelledArrayCell を付与したプロパティです。

見出しセルに対するコメントの取得は、アノテーション @XlsLablledComment を使用します。 さらに、任意の位置のセルのコメントの取得は、アノテーション @XlsComment を使用します。

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

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

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

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

  • コメント情報取得用のsetterメソッドは、引数 String 型を取る必要があります。

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

    • String key, String label

  • また、@XlsArraysColumns に対するsetterメソッドは、第一引数にセルのインデックスが必要になります。

    • int index, String label

  1. アノテーションを付与した <フィールド名>Comment というString型のフィールドを用意しておくと、セルのコメントが渡されます。

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

  • また、@XlsArrayColumns に対するフィールドは、List<String> 型にする必要があります。

 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
public class SampleRecord {

    // 汎用的なコメント情報
    public Map<String, String> comments;

    // プロパティごとに個別にコメント情報を定義するフィールド
    private String nameComment;

    @XlsColumns(label="名前")
    private String name;

    // プロパティごとに個別にコメント情報を定義するメソッド
    // フィールド commentsが定義あれば必要ありません。
    public void setNameComment(String comment) {
        //...
    }

    // @XlsMapColumnsの場合
    @XlsMapColumns(previousColumnName="名前")
    private Map<String, String> attendedMap;

    // プロパティごとに個別にコメント情報を定義するフィールド
    private Map<String, String> attendedMapComment;

    // プロパティごとに個別に見出し情報を定義するメソッド
    // @XlsMapColumnsの場合keyは、セルの見出しの値
    // フィールド commentsが定義あれば必要ありません。
    public void setAttendedMapComment(String key, String comment) {
        //...
    }

    // @XlsArrayColumnsの場合
    @XlsArrayColumns(columnName="ふりがな")
    private List<String> rubyList;

    // プロパティごとに個別にコメント情報を定義するフィールド
    private Map<String, String> rubyListComment;

    // プロパティごとに個別にコメント情報を定義するメソッド
    // @XlsArrayColumnsの場合indexは、インデックスの値
    // フィールド labelsが定義あれば必要ありません。
    public void setRubyListComment(int index, String comment) {
        //...
    }

}

注釈

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

8.3.1. 書き込み時のコメント情報の設定方法

書き込み時は、読み込み時と同様に複数の定義方法があります。

書き込むコメント情報の定義方法は複数ありますが、 Map<String, String> comments フィールドを用いるのが記述量が少なく簡単だと思います。

各プロパティに対するメソッドを定義しておけば、getterメソッド経由で取得されます。

 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
// 書き込むデータの定義
SampleSheet sheet = new SampleSheet();

SampleRecord record = new SampleRecord();

// コメントを保持するフィールドのインスタンス定義
record.comments = new HashMal<>();

// プロパティ「name」に対するコメントを設定する
record.comments.put("name", "コメント1");

// @XlsMapColumnsに対するコメントを設定する。
record.comments.put("attendedMap[4月1日]", "コメント2");
record.comments.put("attendedMap[4月2日]", "コメント3");

// @XlsArrayColumnsNi対するコメントを設定する。
record.comments.put("rubyList[0]", "コメント4");
record.comments.put("rubyList[1]", "コメント5");

// レコードの定義
public class SampleRecord {

    // 汎用的なコメント情報
    public Map<String, String> comments;

    // プロパティごとに個別にコメント情報を定義するフィールド
    private String nameComment;

    @XlsColumns(label="名前")
    private String name;

    // プロパティごとに個別にコメント情報を定義するメソッド
    // フィールド commentsが定義あれば必要ありません。
    public String getNameComment() {
        //...
    }

    // @XlsMapColumnsの場合
    @XlsMapColumns(previousColumnName="名前")
    private Map<String, String> attendedMap;

    // プロパティごとに個別にコメント情報を定義するフィールド
    private Map<String, String> attendedMapComment;

    // プロパティごとに個別に見出し情報を定義するメソッド
    // @XlsMapColumnsの場合keyは、セルの見出しの値
    // フィールド commentsが定義あれば必要ありません。
    public String getAttendedMapComment(String key) {
        //...
    }

    // @XlsArrayColumnsの場合
    @XlsArrayColumns(columnName="ふりがな")
    private List<String> rubyList;

    // プロパティごとに個別にコメント情報を定義するフィールド
    private Map<String, String> rubyListComment;

    // プロパティごとに個別にコメント情報を定義するメソッド
    // @XlsArrayColumnsの場合indexは、インデックスの値
    // フィールド labelsが定義あれば必要ありません。
    public String setRubyListComment(int index) {
        //...
    }

}

注釈

書き込み時のコメントの枠サイズなどは、アノテーション @XlsCommentOption を使用します。

フォントなどは、セルの設定値を引き継ぎます。 ただし、すでにコメントが設定されている場合は、設定されている書式に従います。