Apache POIを使ってExcelを操作

Posted by

概要

本記事は、Excelに対して何らかの機械的な操作を行いたい、でもマクロを書くのはめんどくさいという場合の選択肢としてJavaのApache POIを使う際の非常にベーシックな実装方法を紹介します。
システムの開発の現場では、多くの設計書がExcelで書かれていることがあり、一度に大量のテーブル定義書や画面項目定義を確認する際に困るシチュエーション等があるかと思います。
そんな時にVBA(マクロ)以外の方法として、普段慣れ親しんでいるJavaで簡単にツールを作れるのが、「Apache POI」のライブラリとなります。

Apache POIとは

Apache POI(アパッチ・ポイまたはピーオーアイ)はApacheソフトウェア財団のプロジェクトで、WordやExcelといったMicrosoft Office形式のファイルを読み書きできる100% Javaライブラリとして提供されている。
https://ja.wikipedia.org/wiki/Apache_POI

初期設定

Mavenのプロジェクトを作成しpom.xmlファイルのdependencyに「poi」と「poi-ooxml」を追加します。(下記を参照)
「poi-ooxml」も追加しておくことでOOXML形式のファイルも使用できます。つまり、POIを利用して、拡張子が「xlsx」「docx」といった2007形式のファイルの読み書きが可能となります。

pom.xml
<dependencies>
  <dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi</artifactId>
    <version>[バージョンを指定]</version>
  </dependency>
  <dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi-ooxml</artifactId>
    <version>[バージョンを指定]</version>
  </dependency>
</dependencies>

最新だと、バージョンは”4.0.1“のようです。(2019/2/1時点)
https://mvnrepository.com/artifact/org.apache.poi/poi/4.0.1
https://mvnrepository.com/artifact/org.apache.poi/poi-ooxml/4.0.1

基本実装

Excelファイルの読み取り

ファイルを開く

Workbook workbook = WorkbookFactory.create(new File("ファイルパス"));

シートを開く

// シート名がわかっている場合
Sheet sheet = workbook.getSheet("シート名");

// 取得したいシートが何番目かわかっている場合
// シート番号はゼロベース
Sheet sheet = workbook.getSheetAt(0);

// 全シートを繰り返し処理する場合
Iterator<Sheet> sheets = workbook.sheetIterator();
while(sheets.hasNext()) {
  Sheet sheet = sheets.next();
}

// シート名を取得
String sheetName = inputSheet.getSheetName();

セルの値を取得

// 行を取得
// 行番号はゼロベース
Row row = sheet.getRow("行番号");

// セルを取得
// 列番号はゼロベース
Cell cell = row.getCell("列番号");

// セルの型を取得
int cellType = cell.getCellType();

// 型に応じたgetterで値を取得
// String
cell.getStringCellValue();
// Boolean
cell.getBooleanCellValue()
// Formula
cell.getCellFormula();
// Numeric
cell.getNumericCellValue();
// etc

Excelファイルの作成、出力

ファイルを作成

// Excel2003までのファイルフォーマット
Workbook outputWorkbook = new HSSFWorkbook();

// Excel2007におけるOOXML(Office Open XML)形式のファイルフォーマット
Workbook outputWorkbook = new XSSFWorkbook();

シートを作成

Sheet outputSheet = outputWorkbook.createSheet();

セルに値を設定

// 行を作成
// 行番号はゼロベース
Row outputRow = outputSheet.createRow("行番号");

// セルを作成
// 列番号はゼロベース
Cell outputCell = outputRow.createCell("列番号");

// セルに値を設定
outputCell.setCellValue("設定したい値");

ファイルへの出力

// 出力用のストリームを用意
FileOutputStream out = new FileOutputStream("出力ファイルパス");
// ファイルへ出力
outputWorkbook.write(out);

参考

今回、個人的に作ったツールは以下となります。
かなり雑な実装ですが、大量のExcelファイルから必要な部分を切り取ってを一つのファイルにマージするという処理を行なっています。
https://github.com/yhayashi30/ExcelMergeTool