Apache POIを使ってJavaからExcelを操作

・Apache POIは、マイクロソフトのOLE2ドキュメントフォーマットをJavaで操作するためのライブラリである。

・OLE2とは、Microsoft Officeの文書で使用している機能の1つで、アプリケーション間のデータ共有を実現する。

・Apache POIはJavaのみで動作するので、LinuxなどのWindows以外のOS上でもExcelファイルを生成するプログラムを生成できる。

・apache POIのダウンロードは以下から行う。
http://poi.apache.org/download.html

・apache POIをダウンロードしたら、クラスパスの追加を行う。

package poi;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
public class ReadExcelSheetTest {
public static void main(String[] args) {
try {
//読み込みたいExcelファイルを指定する
HSSFWorkbook workbook = new HSSFWorkbook(new FileInputStream("C:\\temp\\良い文章.xlsx"));
System.out.println("総シート数:" + workbook.getNumberOfSheets());
} catch (FileNotFoundException e) {
// TODO 自動生成された catch ブロック
e.printStackTrace();
} catch (IOException e) {
// TODO 自動生成された catch ブロック
e.printStackTrace();
}
}
}

しかし、サンプルを実行すると以下のようなエラーが出た。

Exception in thread "main" org.apache.poi.poifs.filesystem.OfficeXmlFileException: The supplied data appears to be in the Office 2007+ XML. You are calling the part of POI that deals with OLE2 Office Documents. You need to call a different part of POI to process this data (eg XSSF instead of HSSF)
at org.apache.poi.poifs.storage.HeaderBlock.<init>(HeaderBlock.java:131)
at org.apache.poi.poifs.storage.HeaderBlock.<init>(HeaderBlock.java:104)
at org.apache.poi.poifs.filesystem.POIFSFileSystem.<init>(POIFSFileSystem.java:138)
at org.apache.poi.hssf.usermodel.HSSFWorkbook.<init>(HSSFWorkbook.java:322)
at org.apache.poi.hssf.usermodel.HSSFWorkbook.<init>(HSSFWorkbook.java:303)
at poi.ReadExcelSheetTest.main(ReadExcelSheetTest.java:15)

「XSSF instead of HSSF」
excel2007以降を読みたいなら、HSSFの代わりにXSSFを使え、とのこと。
気を取り直してXSSFを使ってみる。
以下、Apache POIを使ってJavaでExcelを操作するサンプル

package poi;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import org.apache.poi.xssf.usermodel.XSSFCell;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
public class ReadExcelSheetTest {
public static void main(String[] args) {
try {
//読み込みたいExcelファイルを指定する
XSSFWorkbook workbook = new XSSFWorkbook(new FileInputStream("C:\\temp\\良い文章.xlsx"));
//getNumberOfSheetsはワークブック内のシート数を取得する
System.out.println("総シート数:" + workbook.getNumberOfSheets());
System.out.println("シート名(1):" + workbook.getSheetName(0));
System.out.println("シート名(2):" + workbook.getSheetName(1));
//引数で指定したシートを取得する
XSSFSheet sheet = workbook.getSheetAt(1);
//シート名を指定してシートオブジェクトを取得する
XSSFSheet sheet2 = workbook.getSheet("エンジニア");
//行のオブジェクトを取得する
//17行目
XSSFRow row = sheet.getRow(16);
//18行目
XSSFRow row2 = sheet.getRow(17);
//セルのオブジェクトを取得する
//3列目
XSSFCell cell = row.getCell(2);
XSSFCell cell2 = row2.getCell(2);
//セルの値を出力する
System.out.println(cell.getStringCellValue());
System.out.println(cell2.getStringCellValue());
} catch (FileNotFoundException e) {
// TODO 自動生成された catch ブロック
e.printStackTrace();
} catch (IOException e) {
// TODO 自動生成された catch ブロック
e.printStackTrace();
}
}
}

結果は以下の通り

総シート数:8
シート名(1):新聞
シート名(2):エンジニア
プログラム開発は、多くの人々が目的達成のため、もがき苦闘するタールの沼であるとともに、また独自の喜びと苦悩を伴った創作活動でもある。
スケジュールに時間的余裕のないことが原因でうまくいかなかったソフトウェアプロジェクトは、それ以外の原因で失敗したプロジェクト全部を合わせたものよりも多い。

・シートに値を書き込むサンプル
こちらも簡単にエクセルの操作の処理を書くことができた。

package poi;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import org.apache.poi.xssf.usermodel.XSSFCell;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
public class ReadExcelSheetTest {
public static void main(String[] args) {
try {
//書き込みたいExcelファイルを指定する
XSSFWorkbook workbook = new XSSFWorkbook(new FileInputStream("C:\\temp\\良い文章.xlsx"));
XSSFSheet newSheet = workbook.createSheet("テストシート");
//1行目の作成
XSSFRow newRow = newSheet.createRow(0);
//A1のデータセット
XSSFCell newCell = newRow.createCell(0);
//セルに書き込む
newCell.setCellValue("新しいセルの生成のテスト");
//シートに書き換えを保存(アウトプットする)
workbook.write(new FileOutputStream("C:\\temp\\良い文章.xlsx"));
} catch (FileNotFoundException e) {
// TODO 自動生成された catch ブロック
e.printStackTrace();
} catch (IOException e) {
// TODO 自動生成された catch ブロック
e.printStackTrace();
}
}
}

これを実行すると、エクセルシートに新しいシートが追加され、そのセルに値が書き込まれる。
応用すると、JDBCでDBから値を取ってきて、それをExcelに書き込むとかに使えそう。
データを俯瞰するにはやっぱりExcelが便利だから。