SeasarプロジェクトでExcelファイルを出力する方法[明細編]
今回は、Excelファイルに繰り返しデータを出力する方法を紹介する。
前々回で例として出力した「請求書」に明細をつける方法を例に説明を行う。
<手順概要>
1.Excelテンプレートにデータを渡すためのDTOを修正する
2.Excelテンプレートを修正する
3.明細に表示するデータを作成する
<手順詳細>
1.Excelテンプレートにデータを渡すためのDTOを修正する
明細データを格納するための、List型のフィールドを定義する。
Listの要素となる「SampleItemDto」クラスも別途定義する。
package jp.co.smp.excel.dto; import java.util.Date; import java.util.List; public class SampleDto { //↓↓↓ 今回追加したフィールド ↓↓↓ private List<SampleItemDto> itemList; //明細データ //↑↑↑ 今回追加したフィールド ↑↑↑ private String customerNo; //顧客番号 private String customerName; //顧客名 private String tradeNo; //取引番号 private String contact; //担当者 private Date date; //発行日 private int total; //請求額 public List<SampleItemDto> getItemList() { return itemList; } public void setItemList(List<SampleItemDto> itemList) { this.itemList = itemList; } : : getter、setter以下略 : }
package jp.co.smp.excel.dto; public class SampleItemDto { private String itemNo; //商品番号 private String itemName; //商品名 private int price; //単価 private int num; //数量 private int subtotal; //小計 public String getItemNo() { return itemNo; } public void setItemNo(String itemNo) { this.itemNo = itemNo; } : : getter、setter以下略 : }
2.Excelテンプレートを修正する
図の赤枠部分を追加する。
List型のデータにを要素単位に参照するには、「#foreach」の制御文を使用する。
制御文は必ずA列に記述する必要がある。また「#end」で必ず閉じること。
(考え方はJavaの拡張for文と同じ)
3.明細に表示するデータを作成する
ポイントは、小計や合計の値をプログラム中で算出することである。繰り返しデータを含む場合、Excelテンプレートファイルに計算式を埋め込んでも正常に動作しない。
package jp.co.smp.excel.action; import java.io.IOException; import java.io.OutputStream; import java.util.ArrayList; import java.util.Date; import java.util.List; import javax.annotation.Resource; import javax.servlet.http.HttpServletResponse; import jp.co.smp.excel.dto.SampleDto; import jp.co.smp.excel.dto.SampleItemDto; import jp.co.smp.excel.fpao.SampleFpao; import org.apache.poi.hssf.usermodel.HSSFWorkbook; import org.seasar.struts.annotation.Execute; public class IndexAction { @Resource protected SampleFpao sampleFpao; @Resource protected HttpServletResponse httpServletResponse; @Execute(validator = false) public String index() { return "index.jsp"; } @Execute(validator = false) public String createExcel(){ //データ作成 SampleDto dto = new SampleDto(); dto.setContact("担当者の名前"); dto.setCustomerNo("c0001"); dto.setCustomerName("顧客の名前"); dto.setTradeNo("2013008028"); dto.setDate(new Date()); // ↓↓↓↓↓ 今回の変更箇所 ↓↓↓↓↓ List<SampleItemDto> itemList = new ArrayList<SampleItemDto>(); int total = 0; for(int i=1; i<10; i++){ SampleItemDto itemDto = new SampleItemDto(); itemDto.setItemNo("item-01-0" + i); itemDto.setItemName("商品名" + i); itemDto.setPrice(30 * i); itemDto.setNum(i); itemDto.setSubtotal(itemDto.getPrice() * itemDto.getNum()); total += itemDto.getSubtotal(); itemList.add(itemDto); } dto.setItemList(itemList); dto.setTotal(total); // ↑↑↑↑↑ 今回の変更箇所 ↑↑↑↑↑ //Excelテンプレートにデータを埋め込む HSSFWorkbook wb = sampleFpao.sampleTemplate(dto); // ファイル名を設定 httpServletResponse.setHeader( "Content-Disposition", "attachment; filename=SampleExcel" + System.currentTimeMillis() + ".xls"); //ダウンロードをさせるため「OutputStream」に書き込む try { OutputStream out = httpServletResponse.getOutputStream(); wb.write(out); out.close(); } catch (IOException e) {} return null; } }
<関連記事>
SeasarプロジェクトでExcelファイルを出力する方法【準備編】
SeasarプロジェクトでExcelファイルを出力する方法【出力編】
SeasarプロジェクトでExcelファイルを出力する方法【ダウンロード編】
SeasarプロジェクトでExcelファイルを出力する方法【明細編】
<お勧め書籍>