Help us understand the problem. What is going on with this article?

Apache POIを使ってExcelを操作

More than 1 year has passed since last update.

概要

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

yhayashi30
このアカウントでの投稿は私個人の見解に基づくものです。
https://yhayashi30.org
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした