前提・実現したいこと
POIを利用し、javaで作成したListをExcelに書き込みます。
その際、フラグが立っている値を書き込むセルについては黄色背景にしたいです。
発生している問題・エラーメッセージ
書込み処理に問題はないですが、
if文でフラグを判定し、Trueになったものについてセルスタイルを上書きしていくと、一旦上書きされたセルスタイルが保持され続けています。
行単位での書込みでなく、最終的にはブックごと書き込む仕様になっているため上手くいっていません。
ソースにおかしな箇所があればご指摘お願いします。
該当のソースコード
/*
* 一覧を出力する
*/
// 一覧出力
String fileName_emp = "./M.xlsx";
PoiWrapper poi_emp = new PoiWrapper(fileName_emp, "w");
EmployeeUploadUtil empUploadutil = new EmployeeUploadUtil(poi_emp, fileName_emp);
empUploadutil.createCompareData(UC);
poi_emp.write();
public void createCompareData(ArrayList<EmployeeBean>UC) throws Exception{
// シートの作成
poi.createSheet("マスタ");
// ヘッダーの生成
createHeader();
// リスト書込み
outputEmpInfoUC(UC);
}
// Excelシートへの書き込み処理
private void outputEmpInfoUC(ArrayList<EmployeeBean> UC) throws Exception{
Iterator<EmployeeBean> itr = UC.iterator();
//各行の値を書き込む(全行書き込む)
while(itr.hasNext()){
EmployeeBean emp = itr.next();
// 氏名(漢字)が不一致
if(emp.getJpFlg().equals(mismatching)){
// セル背景を黄色
poi.setColor(Nm_jpStyle,IndexedColors.YELLOW.getIndex());
poi.setFontColor(Nm_jpStyle,IndexedColors.RED.getIndex());
}
// 氏名(かな)が不一致
if(emp.getKnFlg().equals(mismatching)){
// セル背景を黄色
poi.setColor(Nm_knStyle,IndexedColors.YELLOW.getIndex());
poi.setFontColor(Nm_knStyle,IndexedColors.RED.getIndex());
}
// 氏名(英字)が不一致
if(emp.getEnFlg().equals(mismatching)){
// セル背景を黄色
poi.setColor(Nm_enStyle,IndexedColors.YELLOW.getIndex());
poi.setFontColor(Nm_enStyle,IndexedColors.RED.getIndex());
}
// 所属会社コードが不一致
if(emp.getCompanyCodeFlg().equals(mismatching)){
// セル背景を黄色
poi.setColor(CompanyCodeStyle,IndexedColors.YELLOW.getIndex());
poi.setFontColor(CompanyCodeStyle,IndexedColors.RED.getIndex());
}
// 部コードが不一致
if(emp.getDepCodeFlg().equals(mismatching)){
// セル背景を黄色
poi.setColor(DepCodeStyle,IndexedColors.YELLOW.getIndex());
poi.setFontColor(CompanyCodeStyle,IndexedColors.RED.getIndex());
}
// 室コードが不一致
if(emp.getRoCodeFlg().equals(mismatching)){
// セル背景を黄色
poi.setColor(RoCodeStyle,IndexedColors.YELLOW.getIndex());
poi.setFontColor(RoCodeStyle,IndexedColors.RED.getIndex());
}
// 課コードが不一致
if(emp.getSecCodeFlg().equals(mismatching)){
// セル背景を黄色
poi.setColor(SecCodeStyle,IndexedColors.YELLOW.getIndex());
poi.setFontColor(SecCodeStyle,IndexedColors.RED.getIndex());
}
// TEL(内線)が不一致
if(emp.getTelInFlg().equals(mismatching)){
// セル背景を黄色
poi.setColor(TelInStyle,IndexedColors.YELLOW.getIndex());
poi.setFontColor(TelInStyle,IndexedColors.RED.getIndex());
}
// TEL(外線)が不一致
if(emp.getTelOutFlg().equals(mismatching)){
// セル背景を黄色
poi.setColor(TelOutStyle,IndexedColors.YELLOW.getIndex());
poi.setFontColor(TelOutStyle,IndexedColors.RED.getIndex());
}
// e-mailアドレス1が不一致
if(emp.getEmail1Flg().equals(mismatching)){
// セル背景を黄色
poi.setColor(email1Style,IndexedColors.YELLOW.getIndex());
poi.setFontColor(email1Style,IndexedColors.RED.getIndex());
}
// e-mailアドレス2が不一致
if(emp.getEmail2Flg().equals(mismatching)){
// セル背景を黄色
poi.setColor(email2Style,IndexedColors.YELLOW.getIndex());
poi.setFontColor(email2Style,IndexedColors.RED.getIndex());
}
poi.createRow();
poi.setValue(emp.getSyoriCode(), nomalStyle); //処理コード
poi.setValue(YearTermUtil.getYear(), nomalStyle); //年
poi.setValue(YearTermUtil.getTerm(), nomalStyle); //期
poi.setValue(emp.getId(), nomalStyle); //ID
poi.setValue(emp.getNm_jp(), Nm_jpStyle); //氏名(漢字)
poi.setValue(emp.getNm_kn(), Nm_knStyle); //氏名(かな)
poi.setValue(emp.getNm_en(), Nm_enStyle); //氏名(英字)
poi.setValue(emp.getCompanyCode(), CompanyCodeStyle); //所属会社コード
poi.setValue(emp.getDepCode(), DepCodeStyle); //部コード
poi.setValue(emp.getRoCode(), RoCodeStyle); //室コード
poi.setValue(emp.getSecCode(), SecCodeStyle); //課コード
poi.setValue(emp.getTel_in(), TelInStyle); //TEL内線(NICE-NET)
poi.setValue(emp.getTel_out(), TelOutStyle); //TEL外線
poi.setValue("", nomalStyle); //FAX内線(NICE-NET)
poi.setValue("", nomalStyle); //FAX外線
poi.setValue(emp.getEmail_01(), email1Style); //e-mailアドレス1
poi.setValue(emp.getEmail_02(), email2Style); //e-mailアドレス2
}
}
試したこと
変更箇所になりうる列ごとにCellStyleを作成し、setValueの引数として渡しました。
比較処理の方で不一致があれば不一致フラグをONにする処理を行っています。
outputEmpInfoUCメソッドでは、if文で各項目のフラグの値を見て、セル背景色をSetする/しないの処理に分けてみました。
ただ、最後にブックでまとめてwriteする仕様になっているため、
書込み対象のList(UC)をループしても
一旦Styleが上書きされるとそのまま変更が維持されています。
行単位でStyleを設定したいです。
ブック単位でのwriteは影響範囲が大きいため、なるべくならwriteの単位は変えたくないですが実装方法が浮かばずご相談させていただければと思います。
補足情報(言語/FW/ツール等のバージョンなど)
Java JDK1.6
struts 1系
-
気になる質問をクリップする
クリップした質問は、後からいつでもマイページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
クリップを取り消します
-
良い質問の評価を上げる
以下のような質問は評価を上げましょう
- 質問内容が明確
- 自分も答えを知りたい
- 質問者以外のユーザにも役立つ
評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。
質問の評価を上げたことを取り消します
-
評価を下げられる数の上限に達しました
評価を下げることができません
- 1日5回まで評価を下げられます
- 1日に1ユーザに対して2回まで評価を下げられます
質問の評価を下げる
teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。
- プログラミングに関係のない質問
- やってほしいことだけを記載した丸投げの質問
- 問題・課題が含まれていない質問
- 意図的に内容が抹消された質問
- 広告と受け取られるような投稿
評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。
質問の評価を下げたことを取り消します
この機能は開放されていません
評価を下げる条件を満たしてません
質問の評価を下げる機能の利用条件
この機能を利用するためには、以下の事項を行う必要があります。
- 質問回答など一定の行動
-
メールアドレスの認証
メールアドレスの認証
-
質問評価に関するヘルプページの閲覧
質問評価に関するヘルプページの閲覧
checkベストアンサー
+1
行ごとにスタイルを定義するクラスなどはありませんが、セルごとにスタイルを定義できるクラスはあります。
CellStyle cellStyle = workbook.createCellStyle();
cellStyle.setFillPattern(CellStyle.SOLID_FOREGROUND);
cellStyle.setFillForegroundColor(IndexedColors.RED.getIndex());
cell.setCellStyle(cellStyle);
CellStyleのインスタンスを作り、背景色を変えたいセルのスタイルをあらかじめ作ります。
その後、背景色などのスタイルをあてたいセルのインスタンスに対し、setCellStyle(cellStyle) を実行することで、個別のスタイル定義ができるでしょう。
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
15分調べてもわからないことは、teratailで質問しよう!
- ただいまの回答率 89.99%
- 質問をまとめることで、思考を整理して素早く解決
- テンプレート機能で、簡単に質問をまとめられる
2017/02/07 09:21
早速試してみましたが、結果は同じでした。。
setValueの仕方に問題がありそうです。
もう少し模索してみます。
2017/02/07 09:52
標準のXSSFWorkbookではなさそうに思えますが。
2017/02/07 10:57
こちらにsetValue等が記載されていて、呼び出して利用する形になっています。
2017/02/07 11:39
2017/02/07 14:58
ループの中で毎度初期化するようにしたところ、うまく挙動しました。
ありがとうございました!