概要
本記事は、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形式のファイルの読み書きが可能となります。
<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