SeasarプロジェクトでExcelファイルを出力する方法[出力編]

前回は「Fisshplate」を使用するための準備を行った。
今回は「Fisshplate」を利用して、実際にExcelファイルを出力する手順を紹介する。


1.Excelテンプレートにデータを渡すためのDTOを定義する
2.インターフェースを定義する
3.Excelテンプレートを作成する
4.creator.diconにFisshplateCreatorを登録する
5.Excelファイルを出力する



1.Excelテンプレートにデータを渡すためのDTOを定義する
Excelテンプレートにデータを渡すためのDTOを「dto」パッケージの配下に作成する。publicフィールドはサポートされていないので、privateフィールドに「getter」「setter」を作成する。

package jp.co.smp.excel.dto;

import java.util.Date;

public class SampleDto {
	
	private String customerNo;	//顧客番号
	private String customerName;	//顧客名
	private String tradeNo;		//取引番号
	private String contact;		//担当者
	private Date date;		//発行日
	private int total;		//請求額
	
	public String getCustomerNo() {
		return customerNo;
	}

           :
           : getter、setter以下省略
           :
}


2.インターフェースを定義する
2-1.ルートパッケージ配下に「fpao」パッケージを作成する
(fpaoは「Fisshplate Access Object」の略です)

2-2.インターフェースを作成する
ポイントは下記の通り。

  • 2-1で作成したパッケージに作成する
  • インターフェース名は「Fpao」で終えること
  • インターフェースのメソッドの戻り値は、「HSSFWorkbook」にすること
  • インターフェースの引数に1で作成したDTOを指定すること
  • インターフェースのメソッド名がExcelテンプレートのファイル名の一部となる
package jp.co.smp.excel.fpao;

import jp.co.smp.excel.dto.SampleDto;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;

public interface SampleFpao {
	
	HSSFWorkbook sampleTemplate(SampleDto dto);

}

2-3.作成したインターフェースをapp.diconにコンポーネントとして登録する

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE components PUBLIC "-//SEASAR//DTD S2Container 2.4//EN" 
	"http://www.seasar.org/dtd/components24.dtd">
<components>
  <include path="convention.dicon"/>
  <include path="aop.dicon"/>
  <include path="j2ee.dicon"/>
  <include path="s2jdbc.dicon"/>
  
  <!-- ↓↓↓ 追加部分 ↓↓↓ -->
  
  <include path="s2fisshplate.dicon"/>
    
  <component class="jp.co.smp.excel.fpao.SampleFpao" >
      <aspect>fisshplate.interceptor</aspect>
  </component>
  
  <!-- ↑↑↑ 追加部分 ↑↑↑ -->
  
  <component name="actionMessagesThrowsInterceptor" class="org.seasar.struts.interceptor.ActionMessagesThrowsInterceptor"/>
</components>

3.Excelテンプレートを作成する
ポイントは下記の通り。

  • ファイル名は「インターフェース名_メソッド名.xls」とする(SampleFpao_sampleTemplate.xls)
  • Excelテンプレート内では、DTOのプロパティは「data」という名前で参照できる
  • 日付や金額等の書式はExcelテンプレート上で設定しておく
  • Excelテンプレートファイルはインターフェースを同じパッケージに配置する


4.creator.diconにFisshplateCreatorを登録する

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE components PUBLIC "-//SEASAR//DTD S2Container 2.4//EN" 
	"http://www.seasar.org/dtd/components24.dtd">
<components>
	<include path="convention.dicon"/>
	<include path="customizer.dicon"/>
	<component class="org.seasar.framework.container.creator.ActionCreator"/>
	<component class="org.seasar.struts.creator.FormCreator"/>
	<component class="org.seasar.framework.container.creator.ServiceCreator"/>
	<component class="org.seasar.framework.container.creator.DtoCreator"/>
	<component class="org.seasar.framework.container.creator.InterceptorCreator"/>
	<component class="org.seasar.framework.container.creator.DaoCreator"/>
	
	<!-- ↓↓↓ 追加部分 ↓↓↓ -->

	<component class="org.seasar.fisshplate.creator.FisshplateCreator" />

	<!-- ↑↑↑ 追加部分 ↑↑↑ -->

</components>

※サーバ開始時にエラー「org.seasar.framework.container.TooManyRegistrationRuntimeException」が発生する場合は、この設定を行う前の状態に戻してみて下さい。

5.Excelファイルを出力する
IndexAction.java

package jp.co.smp.excel.action;

import java.io.FileOutputStream;
import java.util.Date;
import javax.annotation.Resource;
import jp.co.smp.excel.dto.SampleDto;
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;
	
    @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());
        dto.setTotal(5680);
		
        //Excelテンプレートにデータを埋め込む
        HSSFWorkbook wb = sampleFpao.sampleTemplate(dto);

        //ファイルに保存する
        try {

            FileOutputStream out = new FileOutputStream("C:\\temp\\sampleExcel" + System.currentTimeMillis() + ".xls");
            wb.write(out);
            out.close();

        } catch (Exception e) {}
  	
    	return null;
    }
}

index.jsp

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>Excel output</title>
</head>
<body>
	<s:form>
		<input type="submit" name="createExcel" value="Excel出力" />
	</s:form>
</body>
</html>

実行結果
フォルダ「C:\temp」に「sampleExcel13xxxxxxxxxxx.xls」が出力される。

<関連記事>
SeasarプロジェクトでExcelファイルを出力する方法【準備編】
SeasarプロジェクトでExcelファイルを出力する方法【出力編】
SeasarプロジェクトでExcelファイルを出力する方法【ダウンロード編】
SeasarプロジェクトでExcelファイルを出力する方法【明細編】

<お勧め書籍>