ApachePOIを色々連携する話

こんにちは
======
先日ApachePOIを導入→出力するという内容を投稿したものですが
あれでは全然実用性がないジャナイカ
もっといろいろ連携したいジャナイカ
HTMLやJspの内容を出力したいジャマイカ

ということで
本日の議題はこちら

データベースから引っ張ってきた値を
jspでtableタグに放り込んで表を作り、
それをさらに出力できるように
あわよくばスタイル設定までしちゃおう！！

のコーナー

はい
急になんか複雑な感じに見えてきます
でも大丈夫です
プログラミングを初めて4か月目の僕でもできました
つまりはサルでもできるはおろか
犬でもできます
ワン。

ということで早速前提条件を揃えていきましょう
この記事を見ている方からしたら
データベースから値をとってきて、jspにsessionで送り
jspでEL式で表を作るなんてことは朝飯前はおろか
朝起きてうがいするより前にできることでしょう

この時のポイントとして、送りたい表を作っている部分を
formタグで囲いましょう
今回はボタンを押すとXlsx形式でDLできるようにしたいので

```jsp:そういうやつ
<form action="Servletの名前" method="post">
<table>
	<tr>
         <th>項目</th>

	</tr>
						
	    <c:forEach items="${ ListA }" var="名前">
	<tr>
	    <td 所定のEL式/></td>
	</tr>
	　　　</c:forEach>
</table>
<button type="submit" value = "excel">ボタン</button>
</form>

```

今回は項目に対してListAというものをとってきてそれを一覧にする感じですね
とってきたい項目が増えるにつれて
<th>と<td>の中身が増えます
またif文なんかで条件分岐もできますね

さてこれをボタンタグで送信いたしまして
POSTリクエストをします

というわけでjspにアクセスしてきたサーブレットのdoPostの部分を書いていきましょう

```java:post処理

//dogetは省略
protected void doPost(HttpServletRequest req, HttpServletResponse resp) 
throws ServletException ,IOException {
	req.setCharacterEncoding("UTF-8");//念のため言語を固定	
	HttpSession session = req.getSession(false);//セッションの取得
			
	     SimpleDateFormat simple = new SimpleDateFormat("yyyy-MM-dd");
	     String filename = simple.format(new Date())+ ".xlsx";

		
	  // レスポンスヘッダを設定する。
resp.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
resp.setHeader("content-disposition", String.format("attachment; filename=\"%s\"", filename));
resp.setCharacterEncoding("UTF-8");
	try (Connection conn = DataSourceManager.getConnection()) {       	
	         OutputStream outputStream = resp.getOutputStream();   
	  	    Statement statement = conn.createStatement();
		      XSSFWorkbook workbook = new XSSFWorkbook();
		      XSSFSheet spreadsheet = workbook.createSheet("シートの名前");

//あらかじめスタイルを決めている部分
 CellStyle style = workbook.createCellStyle();
style.setBorderTop(BorderStyle.DOUBLE);
style.setBorderBottom(BorderStyle.DOUBLE);
style.setBorderLeft(BorderStyle.DOUBLE);
style.setBorderRight(BorderStyle.DOUBLE);
style.setFillForegroundColor(IndexedColors.LIGHT_BLUE.index);				
style.setFillPattern(FillPatternType.SOLID_FOREGROUND);

		      
		      
 XSSFRow row = spreadsheet.createRow(1);
 XSSFCell cell;
  cell = row.createCell(1);
  cell.setCellStyle(style);
  cell.setCellValue("項目");
		
int i = 2;
	List<Dto> List = Dao.selectAll();
	// 取得した一覧をリクエストに保持する
	req.setAttribute("List", List);
        
	             for (Dto category : List) {
	            	 row = spreadsheet.createRow(i);
	            	 cell2 = row.createCell(1);
	            	 cell2.setCellValue(category.getCategoryName());
	            	 cell2.setCellStyle(style);
	            	  spreadsheet.autoSizeColumn(i);
	            	 i++;	            	
	             }
	             spreadsheet.autoSizeColumn(1);
	     
        
	        workbook.write(outputStream);
		      
	} catch (IOException  | SQLException | NamingException e) {
		// TODO Auto-generated catch block
		e.printStackTrace();
	}
	};



```

流石に内容はかけないのでかなり削ってざっくりといった感じにしましたが
具体的にはこんな感じの流れになります

もし、取得する値を分岐させる場合にはfor分を複数重ねることで
分岐も可能ですので
そこで調節してあげてください

まぁ、正直こんなことを偉そうに書いていますけど
コードを書いて動かしたときは
「ｳｺﾞｲﾀｧｧｧｧｧｧｧｧｧｧ!!!!???」
といった具合に
未知の生物がしゃべった時並みの反応でした
もし、この処理をわかりやすく紹介してほしいなどあったら
テスト的にDBなど用意して
全て一から紹介する記事でも書いてみようと思いますので
リクエストあればください

セルの結合に関してはスタイルと同じ感じにできます
はい

ではこのあたりで
駄文を貯めてしまいましたが半分くらいは自分のためなのでご容赦ください
それでは