LoginSignup
22
30

More than 5 years have passed since last update.

Apache POIを使ってExcelを操作

Posted at

概要

本記事は、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

22
30
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
22
30