ApachePOIを導入する話


ApachePOIにかなり躓いたので備忘録的に
導入の手順を残しておくことにする

まず、ApachePOI通称ぽい
（海外の方がYoutubeで説明している動画を閲覧すると
「ぽぉぉい」と何度もいうのでだんだんじわじわ来る）

使用している開発環境に導入することで
Excelとの連携が取れ
【Xlsx】や【Xls】といったエクセルファイルの
操作が行えるというものである


今回の使用環境
===================================
Eclipse
ApachePOI5.0.0
ｰｰｰｰｰｰｰｰｰｰｰｰｰｰｰｰｰｰｰｰｰｰｰｰｰｰｰｰｰｰｰｰｰｰｰｰｰｰｰｰｰｰｰｰｰｰｰｰｰｰｰｰｰｰｰｰｰｰｰｰｰｰ

まずは
ApachPOIをDL（https://poi.apache.org/）
よりdownloadのリンクをクリック
binaryとsourceの両方があるが
迷ったらsourceをDLしろというのは個人的鉄則

（開発者用などの機能がふんだんにある可能性もあるが
必要なファイルの漏れなどはなくなる可能性が高くなる）

その後解凍すると
poi-*.*.*(今回だとpoi-5.0.0)
の直下に複数のjarfile
また、【lib】【ooxml-lib】の中にもjarfile
があることが確認できると思う

エクリプスのプロジェクトの中にlibフォルダを作り、
そこに先ほど挙げたjarfileをすべてD&D（ドラッグアンドドロップ

その後libファイルの中にあるjarをすべて選択し右クリック
BuildPath　より　ビルドパスに通してあげる
これで導入に関しては完了である

１．エクセルを出力する
===============
まずはエクセルをjavaの中で作成して出力する方法であるが

```java:java
public static void main(String[] args)throws FileNotFoundException,IOException{
HSSFWorkbook wb = new HSSFWorkbook(); //ここで新しいワークブックを定義
HSSFSheet sheet = workbook.createSheet("sheet1"); //ここでシートに名前を付けれます

//ここら辺に後で紹介するセルのスタイル定義などをすると見やすい

HSSFRow row = sheet.createRow(0);//0行目を追加
HSSFCell cell = sheet.create.Cell(0)//セルを0列目に追加
//この間に後で紹介するセルのスタイル定義を書きます
cell.setCellValue("お前んちおっばけや～しき！！");
//これで0行目の0列目にこれが記述されます

workbook.write(new FileOutPutStream("sample.xls");//sample.xlsはご自身で変えてください
workbook.close();//一応閉じておきましょう

```

これにてあなたのプロジェクトの中にある任意のエクセルファイルの
0行目かつ0列目から「お前んちおばけや～しき」とカンタくんに茶化されることになります

さて、しかしこれでは罫線や色はついていないので
ただ文字が入っているだけです
なのでcellにスタイルを追加しましょう
まず覚えてほしいのが複数のスタイル定義を使うことができないということです
setcellstyle(色);
setcellstyle(罫線);
setcellstyle(なんか);

といった具合にそれぞれに役割を持たせて細分化しても
オーバライド。上書きされてしまい、残るのは最後の「なにか」のスタイルだけとなってしまいます

「えぇ～でも色も罫線もつけてエクセルっぽくしたいよドラ〇も～ん」

でしょうね。なのでその場合は一個の定義にまとめてやればいいのです
（つまりは複雑なエクセルファイルの出力をしようとすると、スタイルが違う部分それぞれ
すべて定義しないといけないのでくっそ面倒で見にくくなりますねコレ）

```java:セルにスタイルを付与する
//今回はcellを罫線で囲って色を付けてみましょう
CellStyle style = wb.createCellStyle();
//罫線をそれぞれ作成し、線の種類を指定
style.setBorderTop(BorderStyle.MEDIUM);
style.setBorderBottom(BorderStyle.MEDIUM);
style.setBorderLeft(BorderStyle.MEDIUM);
style.setBorderRight(BorderStyle.MEDIUM);
//セルを塗りつぶしてやろう
style.setFillForgroundColor(IndexColors.AQUA.index);
style.setFillPattern(FillPatternType.SOLID_FORGROUND);
```

これでセルの周りを囲い、水色に塗りつぶすことができます
このスタイルを使いたい場合は使いたいセルに値を入れる前に
名前.setCellStyle(style);
といった具合に定義してあげればOKです
複数の定義がある場合はstyleの部分が変わっていくわけですね



では次、僕が死ぬほど詰まって
詰まった挙句、簡単に解決できてしまってPCを感謝の正拳突きで貫きたくなった

２．DBからデータを取得する
=====

これですが
ぶっちゃけ、基本的には変わらないですので
早速行ってみましょう
今回はMySQLを使用
事前にエクリプスとMYSQLをつなぐコネクタのjarをご用意ください
これに関しては！！説明が潤沢なので！！
調べたら　八百屋で売れ残って若干色がかすんだ桃くらい出てきます

```java:DBにつなぐやつ
//まずはMySQLにつなぎましょう
Class.forName("com.mysql.jdbc.Driver");
Connection connect = DriverManager.getConnection{
"jdbc:mysql://localhost:3306/schema名",
//port番号は変更している場合はそれを
//schema名は使用したいDBの名前を使ってください
"root", "root" //Mysqlのログイン時と同じものです
};

Statement st = connect.CreateStatement();
ResultSet rs = st.executeQuery("SQL文");

int i = 1;
//DBをwhile文で回します
while(rs.next()){
row = sheet.createRow(i);
```

特徴として、上記の下、cellに値を代入する際は
cell.setcellValue(rs.getInt("OO_ID"));
のように、ResultSetから値を扱います

まぁ、こんな感じで導入はできますので
皆さんも良きPOIライフを僕は嫌です

追記
有識者の方に質問なのですが
jspでボタンアクション
POSTリクエストで値をServletへ→apachepoiを用いて
表を作成→jspに画面がリダイレクトされ、エクセルをダウンロード開始
という流れは実現可能なのでしょうか

複雑化してくるとわからなくなってきました