Javaでエクセルを操作したい!POIの環境構築からセルの背景色を設定して出力まで

ApachePOI

こんにちは。

さくさくTECHブロガーの「さく」です。


Webアプリケーションの開発では、“○○○一覧画面の内容をエクセルに出力する”といった場面がよく出てきます。

さらに、“○○○の条件に一致したらセルを赤くして!”といったユーザからのリクエストもありえますね。


Javaからエクセルを操作するための方法として、POIを使ったエクセル操作がとても便利です。

ライブラリが豊富で、ある程度の要件ついては、ほぼ対応することができます。


という訳で今回は、POIを使ってJavaでエクセル操作をおこなう方法を紹介します。


Apache POI

Javaでエクセルを扱うといえば。。。『Apache POI』しかないでしょう!

Apache POIは、Java用のエクセル操作ライブラリになります。

エクセルファイルの読み書き、セルを指定して文字列を出力、セル背景色を変更、といった様々な機能をもっています。

Apache POIの詳細については公式ページを参照ください。

ライブラリ本体(JARファイル)も、公式ページからダウンロードできます。



環境を構築

Apache POIを組み込んだJavaのバッチプログラムを動かすための環境を構築します。

今回、サンプルプログラムを作成した実行した環境としては以下になります。

  • OS:Windows 7
  • Java:Java1.8.0_40
  • Apache POI:poi 4.1.0

Javaのメインクラスを作って、必要なライブラリをダウンロードしてクラスパスを通して。。。といった具合で環境は作れるのですが、筆者はいくつかつまずきました。

ビルドはすんなり通ったのですが、実行しようとしても「NoClassFound」が発生してしまう、などですね。

結果、うまくいったのですが、ビルドする際に必要なJARと実行する際に必要なJARを記載しておきます。


ビルドする際に必要なJAR

  • poi-4.1.0.jar
  • poi-ooxml-4.1.0.jar
  • poi-ooxml-schemas-4.1.0.jar
  • poi-scratchpad-4.1.0.jar

実行する際に必要なJAR

  • poi-4.1.0.jar
  • poi-ooxml-4.1.0.jar
  • poi-ooxml-schemas-4.1.0.jar
  • poi-scratchpad-4.1.0.jar
  • xmlbeans-3.1.0.jar
  • commons-collections4-4.3.jar
  • commons-compress-1.18.jar

サンプルコードを実行するためには、上記のJARをクラスパスに設定する必要があります。


サンプルコードと解説

では実際にプログラムを作成して実行してみます。

以下を実行するプログラムを作成しました。


  1. テンプレートファイルである「template.xlsx」を読み込み。
  2. 3つのセルに文字列を書き込み。同時にそれぞれのセルの背景色設定。
  3. 作成したエクセルファイルを「out.xlsx」として保存。

簡単なプログラムですが、セルに色を付ける方法は理解頂けると。

プログラムは以下になります。


import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.File;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;

import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.CellStyle;
import org.apache.poi.ss.usermodel.FillPatternType;
import org.apache.poi.ss.usermodel.CellValue;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.apache.poi.ss.usermodel.IndexedColors;

public class PoiColor {

    public static void main(String[] args){
        System.out.print("start: main\r\n");

        Workbook tempbook = null;
        try {
            //--- テンプレートファイルをひらいて、シートを指定 --//
            Path tempPath = Paths.get("./template.xlsx");
            InputStream inSt = Files.newInputStream(tempPath);
            tempbook = new XSSFWorkbook(inSt);
            Sheet sheet = tempbook.getSheet("Sheet1");

            //--- A1セルへの書き込み --//
            //--- セル背景色は栗色 --//
            Row row = sheet.createRow(0);
            Cell cell = row.createCell(0);
            cell.setCellValue("あああ");
            CellStyle styleA1 = tempbook.createCellStyle();
            styleA1.setFillPattern(
                FillPatternType.SOLID_FOREGROUND);
            styleA1.setFillForegroundColor(
                IndexedColors.MAROON.getIndex());
            cell.setCellStyle(styleA1);

            //--- A2セルへの書き込み --//
            //--- セル背景色は青 --//
            row = sheet.createRow(1);
            cell = row.createCell(0);
            cell.setCellValue("いいい");
            CellStyle styleA2 = tempbook.createCellStyle();
            styleA2.setFillPattern(
                FillPatternType.SOLID_FOREGROUND);
            styleA2.setFillForegroundColor(
                IndexedColors.BLUE.getIndex());
            cell.setCellStyle(styleA2);

            //--- A3セルへの書き込み --//
            //--- セル背景色は緑 --//
            row = sheet.createRow(2);
            cell = row.createCell(0);
            cell.setCellValue("ううう");
            CellStyle styleA3 = tempbook.createCellStyle();
            styleA3.setFillPattern(
                FillPatternType.SOLID_FOREGROUND);
            styleA3.setFillForegroundColor(
                IndexedColors.GREEN.getIndex());
            cell.setCellStyle(styleA3);

            //--- out.xlsxとしてファイル出力 --//
            Path outPath = Paths.get("./out.xlsx");
            OutputStream outSt = Files.newOutputStream(outPath);
            tempbook.write(outSt);
        } catch (IOException e) {
            System.out.print("入出力例外が発生!");
        } finally {
            //--- テンプレートをクローズ --//
            try {
                if (tempbook != null) {
                    tempbook.close();
                }
            } catch (IOException e) {
                System.out.print("終了処理で入出力例外が発生!");
            }
        }
        System.out.print("end: main\r\n");
    }
}

このプログラムを実行すると、以下のエクセル(out.xlsx)が出力されます。

ApachePOIを使用したエクセルの出力

では、ポイントを説明していきます。

エクセルの読み込み・書き込み

Apahce POIは「XSSFWorkbook」というクラスでエクセルファイル(ブック)を管理します。

このファイルにInputStreamで読み込んだエクセルファイルを食わせてあげるだけですね。


    Path tempPath = Paths.get("./template.xlsx");
    InputStream inSt = Files.newInputStream(tempPath);
    tempbook = new XSSFWorkbook(inSt);
    Sheet sheet = tempbook.getSheet("Sheet1");

一番最後の「getSheet」は、対象となるシートを指定しています。

“Sheet1をカレントにしている”という感じですね。

セルの指定と文字列書き込み

行(row)と列(colum)を指定する形でセルを特定し、文字列出力などの操作をおこないます。

普段使っているエクセルでは、行は1始まりの番号で、列はAから始まるアルファベットですが、Apache POIは両方とも0オリジンの数値指定です。


    //--- A1セルへの書き込み --//
    //--- セル背景色は栗色 --//
    Row row = sheet.createRow(0);
    Cell cell = row.createCell(0);
    cell.setCellValue("あああ");

上はサンプルコードの一部抜粋ですが、このプログラムで、エクセルのA1セルに”あああ”という文字列を出力しています。

色の指定(スタイル指定)

セルに対する色指定は、スタイル指定という方法で可能です。

サンプルコードでは背景色を設定しています。


    CellStyle styleA1 = tempbook.createCellStyle();
    styleA1.setFillPattern(FillPatternType.SOLID_FOREGROUND);
    styleA1.setFillForegroundColor(IndexedColors.MAROON.getIndex());
    cell.setCellStyle(styleA1);

背景色の設定は、『塗り潰しパターン』と『色』を指定することで設定可能です。

『塗り潰しパターン』は、CellStyle クラスのsetFillPatternメソッドで変更可能です。

設定する値は、FillPatternTypeクラスに列挙型として定義されているようです。


NO_FILL

SOLID_FOREGROUND

FINE_DOTS

ALT_BARS

SPARSE_DOT

THICK_HORZ_BANDS

THICK_VERT_BANDS

THICK_BACKWARD_DIAG

THICK_FORWARD_DIAG

BIG_SPOTS

BRICKS

THIN_HORZ_BANDS

THIN_VERT_BANDS

THIN_BACKWARD_DIAG

THIN_FORWARD_DIAG

SQUARES

DIAMONDS

LESS_DOTS

LEAST_DOTS


試しに塗りつぶしパターンを「DIAMONDS」にしてみます。

そうすると、ちょっと出力結果が変わってきます。



格子上の塗りつぶしになりました。

これってつまり、エクセルのセルの書式設定で変更できるやつ、ですね。


FillPatternTypeをDIAMONDに指定

『色』は、CellStyle クラスのsetFillForegroundColorメソッドで変更可能です。

色については、「IndexedColors」に定義されている列挙型で定義されている色のインデックスを指定します。


AQUA

AUTOMATIC

BLACK

BLACK1

BLUE

BLUE_GREY

BLUE1

BRIGHT_GREEN

BRIGHT_GREEN1

BROWN

CORAL

CORNFLOWER_BLUE

DARK_BLUE

DARK_GREEN

DARK_RED

DARK_TEAL

DARK_YELLOW

GOLD

GREEN

GREY_25_PERCENT

GREY_40_PERCENT

GREY_50_PERCENT

GREY_80_PERCENT

INDIGO

LAVENDER

LEMON_CHIFFON

LIGHT_BLUE

LIGHT_CORNFLOWER_BLUE

LIGHT_GREEN

LIGHT_ORANGE

LIGHT_TURQUOISE

LIGHT_TURQUOISE1

LIGHT_YELLOW

LIME

MAROON

OLIVE_GREEN

ORANGE

ORCHID

PALE_BLUE

PINK

PINK1

PLUM

REDRED1

ROSE

ROYAL_BLUE

SEA_GREEN

SKY_BLUE

TAN

TEAL

TURQUOISE

TURQUOISE1

VIOLET

WHITE

WHITE1

YELLOW

YELLOW1

 


どんな色かは、名前からだいたいで察してもらえればと。

まとめ

いかがでしたでしょうか?

Apache POIの基本的な使い方と、セルの色設定方法についてわかって頂いたかと思います。



まとめ
  • Javaでエクセルを操作するためには、Apache POIをつかうべき!
  • Apache POIを使えば、エクセルへの文字列出力だけではなく、色設定も簡単におこなうことができる

それではまた!



sakusaku

都内でSIerをやっています。 使用している技術は、Java、PHP、MySQL、PostgreSQL、Oracle、Apache、Tomcat、あたりです。 Pythonやってみたいです。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA


このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください