これでモテ言語マスターも近いか…?。
実は、これまでJavaを使って本格的に開発をしたことはありませんでした。
もちろん、会社の新人教育とか、オブジェクト指向の学習のために、サンプル題材として簡単なJavaプログラミングをしたことはありますし、C/C++/C# は扱ったことがありますし、J#に関する記事を書いたこともありますので、Javaに関して全くの無知であるということはないのですが、本格的な開発をしたことはなくて、packageの使い方もimportの使い方も、「おまじない」以上の意味はよくわからなかったりもします。
というのも、あれはたしか、7年くらい前だったか…。あるとき突っ込まれた大規模炎上プロジェクトで、Javaスキルを持つプログラマが大変苦労させられている様を目の当たりにしてから、なんというか、Javaを本格的に、本腰を入れて学習しようという心が完全に萎えてしまいまして。
また、その後、Javaで開発をしなければならない状況に置かれてこなかった、というのも一因です。
ただ、Javaは大変広範囲に使われている言語ですし、最近では戦闘機のプログラミングもJava上で構築されることもあると聞きますし、クライアントサイドもJava、サーバサイドもJava、猫も杓子もJavaと、Javaが大変人気、モテモテ言語なわけですね。
今注目の「Scala」もJavaプラットフォーム上で動作すると聞きますし。
そんな中で、ようやくJavaを学習する機会が訪れました。膨大なExcel帳票を扱う事案が出てきまして、その中でPOIを使いましょうという話が出てきました。POIを使う以上はJavaが扱えなければダメだろうということで、Javaを学習しなければならない状況に、ようやく自分のみを置くことが出来ました。
ちなみにPOIというのは、Java上でMS-Officeファイルを扱うためのライブラリです。
Javaの開発をGUIでやりたければ、Eclipseを使う、というのは、知識として知っていました。先の大規模炎上プロジェクトでもEclipseが使われていましたし。

というわけで、Eclipseの入手からスタート。ダウンロードページから、Java開発に最適化されているっぽい「Eclipse IDE for Java Developers Eclipse IDE for Java Developers」を選んで、ダウンロードしてきました。
さらに、開発環境が英語だと使いにくいのでこちらのサイトを参考に、Pleiades プラグイン・ダウンロードから、最新のプラグインを落としてきました。
ってか、よく見てみたら、このページには、すでに日本語化された「Eclipse本体+プラグインのセット」が置いてあるので、ここから落としてくればラクだったなぁ…とか、後から後悔してみたり。
引き続き、Apache POIのダウンロード。β版ではない、最新のバージョンっぽいものをダウンロードしてきました。(今日時点では 3.9)
とりあえずは、展開して適当なフォルダに配置しておきます。
まずはExcelファイルの特定のセルから、値を取り出してコンソールに表示してみるプログラムを作ってみたいと思います。
Javaの良いところは、インターネット上に参考情報とかサンプルプログラムが山のように転がっていること。ググれば必要な知識はいくらでも手に入りそうです。
というわけで、意味の理解はともかくとして、ネット上のサンプルプログラムを切り貼りして作ってみました。
package poitest;
import java.io.*;
// Apache POI ライブラリ群
import org.apache.poi.ss.usermodel.*;
public class Poitest {
public static void main(String[] args) throws Exception {
// Excelファイルの指定
// (エラー処理は省略。本来ならIOExceptionかなんかをcatchしないといけないはず)
InputStream is = new FileInputStream("C:\\eclipse\\workspace\\poitest\\bin\\poitest\\book1.xlsx");
Workbook wb = WorkbookFactory.create(is);
// 最初のシートの最初の行の最初のセルの値を取得し、コンソールに出力する
Sheet sheet = wb.getSheetAt(0);
Row row = sheet.getRow(0);
Cell cell = row.getCell(0); // (0,0)
System.out.print("左上セル(0,0)の内容=");
System.out.println(cell.getStringCellValue());
}
}
コンパイルを行う前に、POIを展開して出てきたjarファイル(展開したフォルダ直下にあるpoi-*.jarファイル群と、oooxml-lib配下にある*.jarファイル群)を、すべて、エクスプローラからEclipseのパッケージ・エクスプローラの最上位項目のところへドラッグ&ドロップし、さらにドロップして現れた項目すべて選択し、コンテキストメニューから「ビルド・パス」→「ビルド・パスの構成」を行います。
book1.xlsxを準備して、Eclipseの「実行」メニューから「実行」。
それっぽい感じで、値を取得できました。

引き続き、値を入れたりセルに線を引いたり、セルの背景色を変えたりしてみます。
package poitest;
import java.io.*;
// Apache POI ライブラリ群
import org.apache.poi.ss.usermodel.*;
public class Poitest {
public static void main(String[] args) throws Exception {
// Excelファイルの指定
// (エラー処理は省略。本来ならIOExceptionかなんかをcatchしないといけないはず)
InputStream is = new FileInputStream("C:\\eclipse\\workspace\\poitest\\bin\\poitest\\book1.xlsx");
Workbook wb = WorkbookFactory.create(is);
// 最初のシートの最初の行の最初のセルの値を取得し、コンソールに出力する
Sheet sheet = wb.getSheetAt(0);
Row row = sheet.getRow(0);
Cell cell = row.getCell(0); // (0,0)
System.out.print("左上セル(0,0)の内容=");
System.out.println(cell.getStringCellValue());
// 上記セルに値を設定
cell.setCellValue("bbbbb");
// 他のセルに値を設定(無いところに作る場合は作成してから)
cell = row.createCell(1); // (1,0)
cell.setCellValue(10);
cell = row.createCell(2); // (2,0)
cell.setCellValue(1.25);
cell = row.createCell(3); // (3,0)
cell.setCellValue("文字列書き込み");
cell = row.createCell(4); // (4,0)
cell.setCellValue("Test");
// 罫線の設定。上下左右バラバラに罫線を指定できる。
// 罫線はスタイルとして指定しておき、あとからセルに設定する
CellStyle style = wb.createCellStyle();
// セルの左と右の線。線の種類を指定している
style.setBorderLeft(CellStyle.BORDER_DASHED);
style.setBorderRight(CellStyle.BORDER_DOUBLE);
// セル上部の線。色を指定している
style.setBorderBottom(CellStyle.BORDER_MEDIUM);
style.setBottomBorderColor(IndexedColors.MAROON.getIndex());
// セルの背景色
// 背景色はスタイルとして指定しておき、あとからセルに設定する
style.setFillPattern(CellStyle.SOLID_FOREGROUND);
style.setFillForegroundColor(IndexedColors.SKY_BLUE.getIndex());
// セルに対してスタイルを設定
cell.setCellStyle(style);
// 書き込み
FileOutputStream out = new FileOutputStream("C:\\eclipse\\workspace\\poitest\\bin\\poitest\\book2.xlsx");
wb.write(out);
}
}
実行結果は次のようになります。

この調子でいくと、こんな感じで、基本的にExcelマクロ(VBA)で出来るような操作は、一通りPOIでも出来そうな感じがします。(今はダメでも将来的には)
大まかには、POIのドキュメントのクイックガイドを参照で。
そこに書いてある「Index of Features」によれば
、| ・How to create a new workbook | (新しいブックを作成) |
| ・How to create a sheet | (シートを作成) |
| ・How to create cells | (セルを作成) |
| ・How to create date cells | (日付セルの作成) |
| ・Working with different types of cells | (異なる種類のセルを使用した作業) |
| ・Iterate over rows and cells | (行とセルを反復処理) |
| ・Getting the cell contents | (セルの内容を取得) |
| ・Text Extraction | (テキスト抽出) |
| ・Files vs InputStreams | (入力ストリームVSファイル) |
| ・Aligning cells | (セルを整列させる) |
| ・Working with borders | (bordersでの作業) |
| ・Fills and color | (塗りつぶしと色) |
| ・Merging cells | (セルの結合) |
| ・Working with fonts | (フォントの操作) |
| ・Custom colors | (カスタムカラー) |
| ・Reading and writing | (読み書き) |
| ・Use newlines in cells. | (セル内で改行) |
| ・Create user defined data formats | (ユーザ定義のデータフォーマットを作成) |
| ・Fit Sheet to One Page | (一つのページに合わせるシート) |
| ・Set print area for a sheet | (シートの印刷範囲の設定) |
| ・Set page numbers on the footer of a sheet | (シートのフッターに設定されたページ番号) |
| ・Shift rows | (行をずらす) |
| ・Set a sheet as selected | (選択されたシートを設定) |
| ・Set the zoom magnification for a sheet | (シートにズーム倍率を設定) |
| ・Create split and freeze panes | (分割やウィンドウ枠の固定を作成) |
| ・Repeating rows and columns | (繰り返し行と列) |
| ・Headers and Footers | (ヘッダーとフッター) |
| ・Drawing Shapes | (図形を描く) |
| ・Styling Shapes | (スタイリングシェイプ) |
| ・Shapes and Graphics2d | (2Dシェイプ) |
| ・Outlining | (アウトライン) |
| ・Images | (絵) |
| ・Named Ranges and Named Cells | (名前付き範囲と名前付きセル) |
| ・How to set cell comments | (セルのコメントを設定) |
| ・How to adjust column width to fit the contents | (内容に合わせて列幅を調整) |
| ・Hyperlinks | (ハイパーリンク) |
| ・Data Validations | (データの検証) |
| ・Embedded Objects | (埋め込みオブジェクト) |
| ・Autofilters | (オートフィルタ) |
| ・Conditional Formatting | (条件付き書式) |
| ・Hiding and Un-Hiding Rows | (行の表示/非表示) |
という機能があるらしいです。