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

前回は「Fisshplate」を使用して、Excelファイルの出力を行った。

ただ、出力先にローカルフォルダを指定していたため、Webシステムを実際に運用した場合、サーバのローカルフォルダに出力されてしまい、ユーザは見ることが出来ない。

サーバの出力先にリンクを張った画面を用意する方法もあるが、この方法はセキュリティ的に問題があるのでお勧めできない。また、この方法はサーバ上に作成された古いファイルを、何かしらのタイミングで削除してやる手間も増える。

なので、作成したExcelファイルは、サーバ上には出力せず、直接ダウンロードして貰うことが好ましい。
今回は、その方法を紹介する。

方法としては簡単で、「OutputStream」にExcelファイルを書き込めば、ダウンロードが開始される。

ポイントとしては、「OutputStream」は「HttpServletResponse」より取得するので、自動バインディングされる様にすることである。

前回からの修正箇所は下記の通り

package jp.co.smp.excel.action;

import java.io.IOException;
import java.io.OutputStream;
import java.util.Date;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletResponse;
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;
	
    @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());
    	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) {}
		
    	// ファイル名を設定
    	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;
    }
}

<実行結果>

Excel出力】ボタンを押すと、保存ダイアログが表示される。

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

<お勧め書籍>