質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Struts

StrutsはJava向けのWebアプリケーションフレームです。MVCモデルに基づいており、JSPやJavaサーブレットを組み合わせ、アプリケーション構築時に使用する各機能を提供しています。

Q&A

解決済

1回答

12825閲覧

POIを利用し、行単位でCellStyleを変更する方法

pingu612

総合スコア13

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Struts

StrutsはJava向けのWebアプリケーションフレームです。MVCモデルに基づいており、JSPやJavaサーブレットを組み合わせ、アプリケーション構築時に使用する各機能を提供しています。

0グッド

0クリップ

投稿2017/02/06 05:16

編集2017/02/06 05:20

###前提・実現したいこと
POIを利用し、javaで作成したListをExcelに書き込みます。
その際、フラグが立っている値を書き込むセルについては黄色背景にしたいです。

###発生している問題・エラーメッセージ
書込み処理に問題はないですが、
if文でフラグを判定し、Trueになったものについてセルスタイルを上書きしていくと、一旦上書きされたセルスタイルが保持され続けています。
行単位での書込みでなく、最終的にはブックごと書き込む仕様になっているため上手くいっていません。
ソースにおかしな箇所があればご指摘お願いします。

###該当のソースコード

java

1 /* 2 * 一覧を出力する 3 */ 4 // 一覧出力 5 String fileName_emp = "./M.xlsx"; 6 PoiWrapper poi_emp = new PoiWrapper(fileName_emp, "w"); 7 EmployeeUploadUtil empUploadutil = new EmployeeUploadUtil(poi_emp, fileName_emp); 8 empUploadutil.createCompareData(UC); 9 poi_emp.write(); 10

java

1 public void createCompareData(ArrayList<EmployeeBean>UC) throws Exception{ 2 // シートの作成 3 poi.createSheet("マスタ"); 4 5 // ヘッダーの生成 6 createHeader(); 7 8 // リスト書込み 9 outputEmpInfoUC(UC); 10 } 11

java

1 // Excelシートへの書き込み処理 2 private void outputEmpInfoUC(ArrayList<EmployeeBean> UC) throws Exception{ 3 Iterator<EmployeeBean> itr = UC.iterator(); 4 //各行の値を書き込む(全行書き込む) 5 while(itr.hasNext()){ 6 EmployeeBean emp = itr.next(); 7 8 // 氏名(漢字)が不一致 9 if(emp.getJpFlg().equals(mismatching)){ 10 // セル背景を黄色 11 poi.setColor(Nm_jpStyle,IndexedColors.YELLOW.getIndex()); 12 poi.setFontColor(Nm_jpStyle,IndexedColors.RED.getIndex()); 13 } 14 // 氏名(かな)が不一致 15 if(emp.getKnFlg().equals(mismatching)){ 16 // セル背景を黄色 17 poi.setColor(Nm_knStyle,IndexedColors.YELLOW.getIndex()); 18 poi.setFontColor(Nm_knStyle,IndexedColors.RED.getIndex()); 19 } 20 // 氏名(英字)が不一致 21 if(emp.getEnFlg().equals(mismatching)){ 22 // セル背景を黄色 23 poi.setColor(Nm_enStyle,IndexedColors.YELLOW.getIndex()); 24 poi.setFontColor(Nm_enStyle,IndexedColors.RED.getIndex()); 25 } 26 // 所属会社コードが不一致 27 if(emp.getCompanyCodeFlg().equals(mismatching)){ 28 // セル背景を黄色 29 poi.setColor(CompanyCodeStyle,IndexedColors.YELLOW.getIndex()); 30 poi.setFontColor(CompanyCodeStyle,IndexedColors.RED.getIndex()); 31 } 32 // 部コードが不一致 33 if(emp.getDepCodeFlg().equals(mismatching)){ 34 // セル背景を黄色 35 poi.setColor(DepCodeStyle,IndexedColors.YELLOW.getIndex()); 36 poi.setFontColor(CompanyCodeStyle,IndexedColors.RED.getIndex()); 37 } 38 // 室コードが不一致 39 if(emp.getRoCodeFlg().equals(mismatching)){ 40 // セル背景を黄色 41 poi.setColor(RoCodeStyle,IndexedColors.YELLOW.getIndex()); 42 poi.setFontColor(RoCodeStyle,IndexedColors.RED.getIndex()); 43 } 44 // 課コードが不一致 45 if(emp.getSecCodeFlg().equals(mismatching)){ 46 // セル背景を黄色 47 poi.setColor(SecCodeStyle,IndexedColors.YELLOW.getIndex()); 48 poi.setFontColor(SecCodeStyle,IndexedColors.RED.getIndex()); 49 } 50 // TEL(内線)が不一致 51 if(emp.getTelInFlg().equals(mismatching)){ 52 // セル背景を黄色 53 poi.setColor(TelInStyle,IndexedColors.YELLOW.getIndex()); 54 poi.setFontColor(TelInStyle,IndexedColors.RED.getIndex()); 55 } 56 // TEL(外線)が不一致 57 if(emp.getTelOutFlg().equals(mismatching)){ 58 // セル背景を黄色 59 poi.setColor(TelOutStyle,IndexedColors.YELLOW.getIndex()); 60 poi.setFontColor(TelOutStyle,IndexedColors.RED.getIndex()); 61 } 62 // e-mailアドレス1が不一致 63 if(emp.getEmail1Flg().equals(mismatching)){ 64 // セル背景を黄色 65 poi.setColor(email1Style,IndexedColors.YELLOW.getIndex()); 66 poi.setFontColor(email1Style,IndexedColors.RED.getIndex()); 67 } 68 // e-mailアドレス2が不一致 69 if(emp.getEmail2Flg().equals(mismatching)){ 70 // セル背景を黄色 71 poi.setColor(email2Style,IndexedColors.YELLOW.getIndex()); 72 poi.setFontColor(email2Style,IndexedColors.RED.getIndex()); 73 } 74 75 76 poi.createRow(); 77 poi.setValue(emp.getSyoriCode(), nomalStyle); //処理コード 78 poi.setValue(YearTermUtil.getYear(), nomalStyle); //年 79 poi.setValue(YearTermUtil.getTerm(), nomalStyle); //期 80 poi.setValue(emp.getId(), nomalStyle); //ID 81 poi.setValue(emp.getNm_jp(), Nm_jpStyle); //氏名(漢字) 82 poi.setValue(emp.getNm_kn(), Nm_knStyle); //氏名(かな) 83 poi.setValue(emp.getNm_en(), Nm_enStyle); //氏名(英字) 84 poi.setValue(emp.getCompanyCode(), CompanyCodeStyle); //所属会社コード 85 poi.setValue(emp.getDepCode(), DepCodeStyle); //部コード 86 poi.setValue(emp.getRoCode(), RoCodeStyle); //室コード 87 poi.setValue(emp.getSecCode(), SecCodeStyle); //課コード 88 poi.setValue(emp.getTel_in(), TelInStyle); //TEL内線(NICE-NET) 89 poi.setValue(emp.getTel_out(), TelOutStyle); //TEL外線 90 poi.setValue("", nomalStyle); //FAX内線(NICE-NET) 91 poi.setValue("", nomalStyle); //FAX外線 92 poi.setValue(emp.getEmail_01(), email1Style); //e-mailアドレス1 93 poi.setValue(emp.getEmail_02(), email2Style); //e-mailアドレス2 94 } 95 }

###試したこと
変更箇所になりうる列ごとにCellStyleを作成し、setValueの引数として渡しました。
比較処理の方で不一致があれば不一致フラグをONにする処理を行っています。
outputEmpInfoUCメソッドでは、if文で各項目のフラグの値を見て、セル背景色をSetする/しないの処理に分けてみました。
ただ、最後にブックでまとめてwriteする仕様になっているため、
書込み対象のList(UC)をループしても
一旦Styleが上書きされるとそのまま変更が維持されています。
行単位でStyleを設定したいです。
ブック単位でのwriteは影響範囲が大きいため、なるべくならwriteの単位は変えたくないですが実装方法が浮かばずご相談させていただければと思います。

###補足情報(言語/FW/ツール等のバージョンなど)
Java JDK1.6
struts 1系

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

行ごとにスタイルを定義するクラスなどはありませんが、セルごとにスタイルを定義できるクラスはあります。

java

1CellStyle cellStyle = workbook.createCellStyle(); 2cellStyle.setFillPattern(CellStyle.SOLID_FOREGROUND); 3cellStyle.setFillForegroundColor(IndexedColors.RED.getIndex()); 4 5cell.setCellStyle(cellStyle);

CellStyleのインスタンスを作り、背景色を変えたいセルのスタイルをあらかじめ作ります。
その後、背景色などのスタイルをあてたいセルのインスタンスに対し、setCellStyle(cellStyle) を実行することで、個別のスタイル定義ができるでしょう。

Apache POI|Busy Developers' Guide to HSSF and XSSF Features

投稿2017/02/06 13:05

A-pZ

総合スコア12011

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

pingu612

2017/02/07 00:21

ご回答いただきありがとうございます! 早速試してみましたが、結果は同じでした。。 setValueの仕方に問題がありそうです。 もう少し模索してみます。
A-pZ

2017/02/07 00:52

気になるのは、poiのインスタンスが何者なんだろうか、というところでしょうか。。。 標準のXSSFWorkbookではなさそうに思えますが。
pingu612

2017/02/07 01:57

既存の仕様として、独自にPoiUtilやPoiwrapperクラスが存在していて、poiのインスタンスになっているのはPoiWrapperです。 こちらにsetValue等が記載されていて、呼び出して利用する形になっています。
A-pZ

2017/02/07 02:39

そのWrapperクラスの使い方に問題ありそうですねー。POIのもともとであれば、セル単位に色変えることも可能です。
pingu612

2017/02/07 05:58

そもそも、セルスタイルをクラス変数として宣言していたのが原因でした。 ループの中で毎度初期化するようにしたところ、うまく挙動しました。 ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問