8. シート情報の取得
8.1. シート上の位置情報の取得
読み込み時、書き込み時にマッピングしたセルのアドレス取得できます。
取得方法は複数ありますが、Map<String, CellPosition> positions
フィールドを用いるのが記述量を少なくできます。
Map<String, CellPosition> positions というフィールドを定義しておくとプロパティ名をキーにセルの位置がセットされるようになっています。
アノテーション
@XlsMapColumns
のセルの位置情報のキーは、<プロパティ名>[<セルの見出し>]
としてセットされます。アノテーション
@XlsArrayColumns
のセルの位置情報のキーは、<プロパティ名>[<セルのインデックス>]
としてセットされます。
アノテーションを付与した <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
アノテーションを付与した <フィールド名>Position という
com.gh.mygreen.xlsmapper.util.CellPosition
型のフィールドを用意しておくと、セルの位置が渡されます。
ただし、
@XlsMapColumns
に対するフィールドは、Map<String, CellPosition>
型にする必要があります。キーには見出しが入ります。
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メソッド > フィールド に従い設定されます。
8.1.1. 書き込み時の位置情報取得の注意点
書き込み時は、行を追加/削除する処理がある場合、アノテーションを付与したプロパティの処理順序によって、セルの位置が正しく取得できない場合があります。
例えば、既に処理して取得したセルの位置情報よりも、上方の表で後から行を削除、追加したとき、取得済みのセルの位置情報が不正になります。
このような場合、アノテーション @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}
8.2. シート上の見出しの取得
読み込み時、書き込み時にマッピングしたセルの見出しを取得できます。
入力値検証の際などのメッセージの引数に使用したりします。
取得方法は複数ありますが、 Map<String, String> labels
フィールドを用いる方が記述量を少なくできます。
注釈
セルの見出しを取得できるのは、アノテーション @XlsLabelledCell, @XlsColumn, @XlsMapColumns
を付与したプロパティです。
Map<String, String> labels
というフィールドを定義しておくとプロパティ名をキーにセルの位置がセットされるようになっています。
アノテーション
@XlsMapColumns
のセルの位置情報のキーは、 <プロパティ名>[<セルの見出し>] としてセットされます。アノテーション
@XlsArrayColumns
のセルの位置情報のキーは、 <プロパティ名>[<インデックス>] としてセットされます。
アノテーションを付与した <setterメソッド名>Label というメソッドを用意しておくと、引数にセルの位置が渡されます。
位置情報を取得用のsetterメソッドは、引数
String
型を取る必要があります。ただし、
@XlsMapColumns
に対するsetterメソッドは、第一引数にセルの見出しが必要になります。
String key, String label
ただし、
@XlsArrayColumns
に対するsetterメソッドは、第一引数にセルのインデックスが必要になります。
int index, String label
アノテーションを付与した <フィールド名>Label というString型のフィールドを用意しておくと、セルの位置が渡されます。
ただし、
@XlsMapColumns
に対するフィールドは、Map<String, String>
型にする必要があります。キーには見出しが入ります。また、
@XlsArrayColumns
に対するフィールドは、List<String>
型にする必要があります。
1public class SampleRecord {
2
3 // 汎用的な見出し情報
4 public Map<String, String> labels;
5
6 // プロパティごとに個別に見出し情報を定義するフィールド
7 private String nameLabel;
8
9 @XlsColumns(label="名前")
10 private String name;
11
12 // プロパティごとに個別に見出し情報を定義するメソッド
13 // フィールド labelsが定義あれば必要ありません。
14 public void setNameLabel(String label) {
15 //...
16 }
17
18 // @XlsMapColumnsの場合
19 @XlsMapColumns(previousColumnName="出欠")
20 private Map<String, String> attendedMap;
21
22 // プロパティごとに個別に見出し情報を定義するフィールド
23 private Map<String, String> attendedMapLabel;
24
25 // プロパティごとに個別に見出し情報を定義するメソッド
26 // @XlsMapColumnsの場合keyは、セルの見出しの値
27 // フィールド labelsが定義あれば必要ありません。
28 public void setAttendedMapLabel(String key, String label) {
29 //...
30 }
31
32 // @XlsArrayColumnsの場合
33 @XlsArrayColumns(columnName="ふりがな")
34 private List<String> rubyList;
35
36 // プロパティごとに個別に見出し情報を定義するフィールド
37 private Map<String, String> rubyListLabel;
38
39 // プロパティごとに個別に見出し情報を定義するメソッド
40 // @XlsArrayColumnsの場合indexは、インデックスの値
41 // フィールド labelsが定義あれば必要ありません。
42 public void setRubyListLabel(int index, String label) {
43 //...
44 }
45
46
47}
注釈
フィールド 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 を使用します。
Map<String, String> comments
というフィールドを定義しておくとプロパティ名をキーにセルの位置がセットされるようになっています。
アノテーション
@XlsMapColumns
のセルのコメント情報のキーは、 <プロパティ名>[<セルの見出し>] としてセットされます。アノテーション
@XlsArrayColumns
のセルのコメント情報のキーは、 <プロパティ名>[<インデックス>] としてセットされます。
アノテーションを付与した <setterメソッド名>Comment というメソッドを用意しておくと、引数にセルのコメントが渡されます。
コメント情報取得用のsetterメソッドは、引数
String
型を取る必要があります。ただし、
@XlsMapColumns
に対するsetterメソッドは、第一引数にセルの見出しが必要になります。
String key, String label
また、
@XlsArraysColumns
に対するsetterメソッドは、第一引数にセルのインデックスが必要になります。
int index, String label
アノテーションを付与した <フィールド名>Comment というString型のフィールドを用意しておくと、セルのコメントが渡されます。
ただし、
@XlsMapColumns
に対するフィールドは、Map<String, String>
型にする必要があります。キーには見出しが入ります。また、
@XlsArrayColumns
に対するフィールドは、List<String>
型にする必要があります。
1public class SampleRecord {
2
3 // 汎用的なコメント情報
4 public Map<String, String> comments;
5
6 // プロパティごとに個別にコメント情報を定義するフィールド
7 private String nameComment;
8
9 @XlsColumns(label="名前")
10 private String name;
11
12 // プロパティごとに個別にコメント情報を定義するメソッド
13 // フィールド commentsが定義あれば必要ありません。
14 public void setNameComment(String comment) {
15 //...
16 }
17
18 // @XlsMapColumnsの場合
19 @XlsMapColumns(previousColumnName="名前")
20 private Map<String, String> attendedMap;
21
22 // プロパティごとに個別にコメント情報を定義するフィールド
23 private Map<String, String> attendedMapComment;
24
25 // プロパティごとに個別に見出し情報を定義するメソッド
26 // @XlsMapColumnsの場合keyは、セルの見出しの値
27 // フィールド commentsが定義あれば必要ありません。
28 public void setAttendedMapComment(String key, String comment) {
29 //...
30 }
31
32 // @XlsArrayColumnsの場合
33 @XlsArrayColumns(columnName="ふりがな")
34 private List<String> rubyList;
35
36 // プロパティごとに個別にコメント情報を定義するフィールド
37 private Map<String, String> rubyListComment;
38
39 // プロパティごとに個別にコメント情報を定義するメソッド
40 // @XlsArrayColumnsの場合indexは、インデックスの値
41 // フィールド labelsが定義あれば必要ありません。
42 public void setRubyListComment(int index, String comment) {
43 //...
44 }
45
46}
注釈
フィールド Map<String, String> comments
と対応するsetterメソッドやフィールドをそれぞれ定義していた場合、
優先度 comments > setterメソッド > フィールド に従い設定されます。
8.3.1. 書き込み時のコメント情報の設定方法
書き込み時は、読み込み時と同様に複数の定義方法があります。
書き込むコメント情報の定義方法は複数ありますが、 Map<String, String> comments
フィールドを用いる方が記述量を少なくできます。
各プロパティに対するメソッドを定義しておけば、getterメソッド経由で取得されます。
1// 書き込むデータの定義
2SampleSheet sheet = new SampleSheet();
3
4SampleRecord item = new SampleRecord();
5
6// コメントを保持するフィールドのインスタンス定義
7item.comments = new HashMal<>();
8
9// プロパティ「name」に対するコメントを設定する
10item.comments.put("name", "コメント1");
11
12// @XlsMapColumnsに対するコメントを設定する。
13item.comments.put("attendedMap[4月1日]", "コメント2");
14item.comments.put("attendedMap[4月2日]", "コメント3");
15
16// @XlsArrayColumnsに対するコメントを設定する。
17item.comments.put("rubyList[0]", "コメント4");
18item.comments.put("rubyList[1]", "コメント5");
19
20// レコードの定義
21public class SampleRecord {
22
23 // 汎用的なコメント情報
24 public Map<String, String> comments;
25
26 // プロパティごとに個別にコメント情報を定義するフィールド
27 private String nameComment;
28
29 @XlsColumns(label="名前")
30 private String name;
31
32 // プロパティごとに個別にコメント情報を定義するメソッド
33 // フィールド commentsが定義あれば必要ありません。
34 public String getNameComment() {
35 //...
36 }
37
38 // @XlsMapColumnsの場合
39 @XlsMapColumns(previousColumnName="名前")
40 private Map<String, String> attendedMap;
41
42 // プロパティごとに個別にコメント情報を定義するフィールド
43 private Map<String, String> attendedMapComment;
44
45 // プロパティごとに個別に見出し情報を定義するメソッド
46 // @XlsMapColumnsの場合keyは、セルの見出しの値
47 // フィールド commentsが定義あれば必要ありません。
48 public String getAttendedMapComment(String key) {
49 //...
50 }
51
52 // @XlsArrayColumnsの場合
53 @XlsArrayColumns(columnName="ふりがな")
54 private List<String> rubyList;
55
56 // プロパティごとに個別にコメント情報を定義するフィールド
57 private Map<String, String> rubyListComment;
58
59 // プロパティごとに個別にコメント情報を定義するメソッド
60 // @XlsArrayColumnsの場合indexは、インデックスの値
61 // フィールド labelsが定義あれば必要ありません。
62 public String setRubyListComment(int index) {
63 //...
64 }
65
66}
注釈
書き込み時のコメントの枠サイズなどは、アノテーション @XlsCommentOption を使用します。
フォントなどは、セルの設定値を引き継ぎます。 ただし、すでにコメントが設定されている場合は、設定されている書式に従います。