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ファイルを出力する方法【明細編】

<お勧め書籍>