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

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

ただいまの
回答率

87.36%

POIでExcel出力をしていますが…Styleの挙動がおかしいです。

解決済

回答 1

投稿

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

データベースの中に、下のようなStringの形でデータが有るのですが、これをApache POIを利用してExcelの文字色にあてたいと思っています。

#062C54
#8491C3
#2A4073
#D4ECEE
#0086CC
#DFF2FC
#002E4E
#181B39
#005B98
#0086A2
#003A47
#EBF4F4
#7EC7D8
#004150
#BCE1DF
#887B3E

下記のソースコードで文字色はちゃんと出るのは出るのですが、全ての文字が最後の色(#887B3E)黄土色になってしまうのです。

下記にサーブレットのソースコードを掲載しますので、どこに問題があるかご教示いただけますと幸いです。よろしくお願いいたします。
Excelファイルの出力先は、適宜変更していただけますと幸いです。

なお、Listのサイズは可変(上記のカラーコードの数が変わるということ)という前提でコードを書いています。

import java.awt.Color;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.TreeMap;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import org.apache.poi.hssf.util.HSSFColor;
import org.apache.poi.ss.usermodel.BorderStyle;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.CellStyle;
import org.apache.poi.ss.usermodel.CellType;
import org.apache.poi.ss.usermodel.DataFormat;
import org.apache.poi.ss.usermodel.FillPatternType;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.VerticalAlignment;
import org.apache.poi.ss.util.CellRangeAddress;
import org.apache.poi.xssf.streaming.SXSSFCell;
import org.apache.poi.xssf.streaming.SXSSFSheet;
import org.apache.poi.xssf.streaming.SXSSFWorkbook;
import org.apache.poi.xssf.usermodel.IndexedColorMap;
import org.apache.poi.xssf.usermodel.XSSFCellStyle;
import org.apache.poi.xssf.usermodel.XSSFColor;
import org.apache.poi.xssf.usermodel.XSSFFont;

    public static void main(String[] args) {

        String outputFilePath = "C:/Users/(ここにユーザ名など)/Documents/out.xlsx";
        FileOutputStream fout = null;

        List<String> list = new ArrayList<String>();

        list.add("#062C54");
        list.add("#8491C3");
        list.add("#2A4073");
        list.add("#D4ECEE");
        list.add("#0086CC");
        list.add("#DFF2FC");
        list.add("#002E4E");
        list.add("#181B39");
        list.add("#005B98");
        list.add("#0086A2");
        list.add("#003A47");
        list.add("#EBF4F4");
        list.add("#7EC7D8");
        list.add("#004150");
        list.add("#BCE1DF");
        list.add("#887B3E");

        SXSSFWorkbook book = new SXSSFWorkbook(list.size());

        Cell cell;
        Row[] row = new Row[list.size()];

        XSSFFont font = (XSSFFont) book.createFont();
        XSSFCellStyle[] style = new XSSFCellStyle[list.size()];

        Sheet sheet = book.createSheet();
        int[] dec_color = new int[3];/*RGBそれぞれの10進数を入れる*/
        String color_code = "";

        for (int i = 0; i < list.size(); i++) {

            color_code = list.get(i);

            String red = color_code.substring(1, 3);
            String green = color_code.substring(3, 5);
            String blue = color_code.substring(5, 7);

            dec_color[0] = Integer.parseInt(red, 16);
            dec_color[1] = Integer.parseInt(green, 16);
            dec_color[2] = Integer.parseInt(blue, 16);

            font.setColor(new XSSFColor(new Color(dec_color[0], dec_color[1], dec_color[2])));

            style[i] = (XSSFCellStyle) book.createCellStyle();
            style[i].setFont(font);

            row[i] = sheet.createRow(i + 1);

            cell = row[i].createCell(0);

            cell.setCellStyle(style[i]);
            cell.setCellType(CellType.STRING);
            cell.setCellValue(list.get(i));

        }

        try {
            fout = new FileOutputStream(outputFilePath);
            book.write(fout);
        } catch (IOException e) {
            e.printStackTrace();
        }

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 1

checkベストアンサー

+1

fontという変数が一つしかなく、全てのセルのスタイルにその変数が代入されてて、それの色がどんどん変わっていって、最後に書き込みが起こるからではないでしょうか

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2019/01/18 22:56

    まさにそのとおりで、Font[]にすると、解決しました。ありがとうございます。

    キャンセル

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

  • ただいまの回答率 87.36%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

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