こんにちは。
さくさく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をクラスパスに設定する必要があります。
サンプルコードと解説
では実際にプログラムを作成して実行してみます。
以下を実行するプログラムを作成しました。
- テンプレートファイルである「template.xlsx」を読み込み。
- 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)が出力されます。
では、ポイントを説明していきます。
エクセルの読み込み・書き込み
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」にしてみます。
そうすると、ちょっと出力結果が変わってきます。
格子上の塗りつぶしになりました。
これってつまり、エクセルのセルの書式設定で変更できるやつ、ですね。
『色』は、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を使えば、エクセルへの文字列出力だけではなく、色設定も簡単におこなうことができる
それではまた!