poiを使ってみた
javaで走らせたり、というかSeleniumでのテスト時に一緒にデータを取って、その結果がExcelとかに出力できたらなー、とか考えたのが始まり
1. poi
ここからダウンロードできるライブラリの一種。簡単に言うと、「Microsoft Documentsにアクセスしやすくするライブラリ」 とのこと。 今回はそのうちの一つであるExcelへのアクセスを手伝ってもらう。
今回は poi-bin-3.10-FINAL-20140208.tar.gz を使用。
2. 環境設定
とりあえずよくわからないので、
docs以下
LICENCE
NOTICE
以外は全部プロジェクトに放り込んだうえでパスを通した。 examplesとかいるのかなぁ…
3. WorkBookの作成
一つずつ順に。WorkBookはその名の通り作業する場所。ここにExcelファイルの1シートをコピーして作業する。 あくまでコピーなので、最後に書き込まないとExcelファイル自体は更新、書き込みされない点に注意。
try {
/* エクセルファイルはどこですか */
File f = new File(filepath);
InputStream is = new FileInputStream(f);
/* ワークブックにアクセス */
XSSFWorkbook wb = new XSSFWorkbook(is);
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
filepathはExcelファイルの在り処。「ファイルが無ければ作る」処理を追加してもいいかも。 WorkBookの作成時には2つもExceptionが発生するので、きちんと捕まえるなど対処が必要。4. シート、行、列からセルの指定
WorkBookにシートを読み込ませて、徐々に絞っていく感じ。
try {
/* エクセルファイルはどこですか */
File f = new File(filepath);
InputStream is = new FileInputStream(f);
/* ワークブックにアクセス */
XSSFWorkbook wb = new XSSFWorkbook(is);
/* シートの指定 */
XSSFSheet sheet = wb.getSheet(sheetname);
/* シートの定義の最初の行 */
int firstRow = sheet.getFirstRowNum() + 1;
/* シートの定義の最終行 */
int lastRow = sheet.getLastRowNum();
/* 行を順に上から見ていく。 */
for (int i = firstRow; i <= lastRow; i++) {
/* 行情報を取得 */
XSSFRow row = sheet.getRow(i);
/* 列の読み込み。 とりあえず 1 で */
XSSFCell cell = row.getCell(columnno);
}
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
sheetnameとcolumnnoは別途指定。
sheetnameはそのままシートにつける名前。デフォルトは【Sheet1】とかなってるアレ。実はintで順番指定も可能らしい(未検証)。
columnnoは列の番号。 A列が0、B列が1、といった順で対応しているらしい。
作業の順番は、
シートの指定 → 行の指定 → 列の指定
行の指定の際に、シート中にて、【何かしらが列のどこかに記入されている行】の行数が取得できる。今回は事前に項番を振っておいたExcelを読み込んでいるため、項番の分だけ回ってくれる寸法。 【最初の行】の指定の際 +1 しているのは、各列のラベルを設定した結果、その行まで含めて【最初の行】とされてしまったのか、うまくいかなかったため。
もちろん行数をピンポイントに指定してやることも可能。
sheetnameはそのままシートにつける名前。デフォルトは【Sheet1】とかなってるアレ。実はintで順番指定も可能らしい(未検証)。
columnnoは列の番号。 A列が0、B列が1、といった順で対応しているらしい。
作業の順番は、
シートの指定 → 行の指定 → 列の指定
行の指定の際に、シート中にて、【何かしらが列のどこかに記入されている行】の行数が取得できる。今回は事前に項番を振っておいたExcelを読み込んでいるため、項番の分だけ回ってくれる寸法。 【最初の行】の指定の際 +1 しているのは、各列のラベルを設定した結果、その行まで含めて【最初の行】とされてしまったのか、うまくいかなかったため。
もちろん行数をピンポイントに指定してやることも可能。
5. セルの内容の確認
既に記入されていないか確認。 /* チェック。 いろいろステータスのサポートがあるらしい */
if (cell != null && cell.getCellType() == Cell.CELL_TYPE_STRING) {
/* セルの内容がStringなら */
String cellval = cell.getStringCellValue();
/* 取得してみる */
System.out.println(cellval);
} else if (cell == null || cell.getCellType() == Cell.CELL_TYPE_BLANK) {
/* ブランクなら */
System.out.println("からっぽ(・д・`)");
}
セルの読み込み直後から
Cell.CELL_TYPE_STRING はいわゆるセルの型。数字や日付なんかの指定もあり、読み込み時などに型のチェックができる。「数値が取り出せた場合のみ」なんて条件も可能。
Cell.CELL_TYPE_STRING はいわゆるセルの型。数字や日付なんかの指定もあり、読み込み時などに型のチェックができる。「数値が取り出せた場合のみ」なんて条件も可能。
6. 書き込み
実際に書き込む。/* 指定された列番号のセルを準備する */
XSSFCell cell = row.getCell(columnNum, Row.CREATE_NULL_AS_BLANK);
/* 値を適当に書き込む */
/* TODO Stringじゃなくて数字でよくないかなこれ */
cell.setCellValue(String.format(" %1$d", 12345));
少し巻き戻って、指定の行から書き込むセルの指定のし直し。columnNumはまた別の列番号。
Row.CREATE_NULL_AS_BLANK は【空のセルとする】的な宣言...?('A`)
setCellValueで値を書き込む。TODOにある通り、なぜ数値をStringで書き込んでいるかは謎(他のとこからコピペしてきたからなんだがな…('A`))
Row.CREATE_NULL_AS_BLANK は【空のセルとする】的な宣言...?('A`)
setCellValueで値を書き込む。TODOにある通り、なぜ数値をStringで書き込んでいるかは謎(他のとこからコピペしてきたからなんだがな…('A`))
7. Excelに書き込み
先述の通り、ここまでは WorkBook上での出来事。きちんとExcelファイルに放り込んでやらないと更新されない。 /* 最後にワークブックをファイルに書き込み */
OutputStream os = new FileOutputStream(f);
wb.write(os);
これだけ。だけどこれをやらないとExcelファイルには何も起きない…('A`)
8.番外編 -色の指定-
ちょっとだけ戻ってセルの取得あたり。フォントの色やセルの色を付けてみる。
/* style準備 */
XSSFCellStyle style = wb.createCellStyle();
style.setFillPattern(XSSFCellStyle.SOLID_FOREGROUND);
/* font準備 */
XSSFFont font = wb.createFont();
/* 背景色設定 */
style.setFillForegroundColor(backgroundColor);
/* フォント設定 */
font.setColor(fontColor);
style.setFont(font);
/* セルにスタイルを反映 */
cell.setCellStyle(style);
styleがセルの色やら、fontが文字周り。 styleの準備をして、 fontの準備をして、最後にセルにその設定を反映する、という手順。
backgroundColorやfontColorは別宣言。色の指定は HSSFColorクラスが使用可能。たとえば赤であれば、HSSFColor.RED.index で使用できる。
文字の書き込みなどとは別で宣言できるが、当然 7. Excelに書き込み の処理の前にやらないと反映されない。
|ω・`) |Ю .。o0 ( 次は型やら何やらをきれいにしないとな )
backgroundColorやfontColorは別宣言。色の指定は HSSFColorクラスが使用可能。たとえば赤であれば、HSSFColor.RED.index で使用できる。
文字の書き込みなどとは別で宣言できるが、当然 7. Excelに書き込み の処理の前にやらないと反映されない。
|ω・`) |Ю .。o0 ( 次は型やら何やらをきれいにしないとな )