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

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

ただいまの
回答率

90.34%

  • Java

    14473questions

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

  • Struts

    189questions

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

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

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 2,213

pingu612

score 7

前提・実現したいこと

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ページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

+1

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

CellStyle cellStyle = workbook.createCellStyle();
cellStyle.setFillPattern(CellStyle.SOLID_FOREGROUND);
cellStyle.setFillForegroundColor(IndexedColors.RED.getIndex());

cell.setCellStyle(cellStyle);

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/02/07 09:21

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

    キャンセル

  • 2017/02/07 09:52

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

    キャンセル

  • 2017/02/07 10:57

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

    キャンセル

  • 2017/02/07 11:39

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

    キャンセル

  • 2017/02/07 14:58

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

    キャンセル

同じタグがついた質問を見る

  • Java

    14473questions

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

  • Struts

    189questions

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