<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>杰克，快跑！ &#187; 浏览器</title>
	<atom:link href="http://blog.jackrun.com/archives/tag/%e6%b5%8f%e8%a7%88%e5%99%a8/feed" rel="self" type="application/rss+xml" />
	<link>http://blog.jackrun.com</link>
	<description>busy to live or busy to die</description>
	<lastBuildDate>Thu, 05 Aug 2010 05:58:59 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>用POI输出Excel流到浏览器</title>
		<link>http://blog.jackrun.com/archives/161.html</link>
		<comments>http://blog.jackrun.com/archives/161.html#comments</comments>
		<pubDate>Tue, 17 Oct 2006 09:29:45 +0000</pubDate>
		<dc:creator>Peltason</dc:creator>
				<category><![CDATA[软件开发]]></category>
		<category><![CDATA[excel]]></category>
		<category><![CDATA[POI]]></category>
		<category><![CDATA[浏览器]]></category>

		<guid isPermaLink="false">http://www.jackrun.com/?p=161</guid>
		<description><![CDATA[作者：东区一匹狼
时间：2006-10-17
最近用户要求添加功能把数据导出成Excel的.xls到用户的PC，由于导出的Excel数据对于服务端没有用处，不需要在服务端保留，如果在服务端硬盘生成文件，然后在让用户下载，这样就需要定时清理服务端数据，自己查了一下POI和WebWork的资料，实现了该功能，直接把POI生成的Excel 流输出到浏览器，让用户下载，关闭窗口就消失，不在服务端留痕迹，写出来大家分享一下。
用过WebWork的人应该知道，在Webwork的Action中，execute()方法最后返回的是一个Result对象，如 return SUCCESS 。在这里我们需要实现WebWork的Result接口，定义自己的一个输出Excel的Result。前提是你需要下载POI包，代码如下：

package com.test.excel;
import com.opensymphony.xwork.Result;
import com.opensymphony.xwork.ActionInvocation;
import com.opensymphony.webwork.ServletActionContext;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import javax.servlet.http.HttpServletResponse;
import java.io.OutputStream;
public class ExcelResult implements Result{
private HSSFWorkbook workbook;
private String filename;
private String contenttype;
public void execute(ActionInvocation invocation) throws Exception {
if (contenttype == null)
contenttype = &#8220;application/msexcel&#8221;
if (workbook == null)
workbook = (HSSFWorkbook) invocation.getStack().findValue(&#8220;workbook&#8221;);
HttpServletResponse response = ServletActionContext.getResponse();
response.reset() ;
response.setContentType(contenttype);
response.setHeader(&#8220;Content-Disposition&#8221;, &#8220;attachment;Filename=&#8221; + filename + &#8220;.xls&#8221;);
OutputStream os = response.getOutputStream();
workbook.write(os);
os.flush();
os.close();
}
public void setWorkbook(HSSFWorkbook workbook) {
this.workbook [...]]]></description>
			<content:encoded><![CDATA[<p>作者：东区一匹狼</p>
<p>时间：2006-10-17</p>
<p>最近用户要求添加功能把数据导出成Excel的.xls到用户的PC，由于导出的Excel数据对于服务端没有用处，不需要在服务端保留，如果在服务端硬盘生成文件，然后在让用户下载，这样就需要定时清理服务端数据，自己查了一下POI和WebWork的资料，实现了该功能，直接把POI生成的Excel 流输出到浏览器，让用户下载，关闭窗口就消失，不在服务端留痕迹，写出来大家分享一下。</p>
<p>用过WebWork的人应该知道，在Webwork的Action中，execute()方法最后返回的是一个Result对象，如 return SUCCESS 。在这里我们需要实现WebWork的Result接口，定义自己的一个输出Excel的Result。前提是你需要下载POI包，代码如下：</p>
<p><span id="more-161"></span></p>
<p>package com.test.excel;</p>
<p>import com.opensymphony.xwork.Result;</p>
<p>import com.opensymphony.xwork.ActionInvocation;</p>
<p>import com.opensymphony.webwork.ServletActionContext;</p>
<p>import org.apache.poi.hssf.usermodel.HSSFWorkbook;</p>
<p>import javax.servlet.http.HttpServletResponse;</p>
<p>import java.io.OutputStream;</p>
<p>public class ExcelResult implements Result{</p>
<p>private HSSFWorkbook workbook;</p>
<p>private String filename;</p>
<p>private String contenttype;</p>
<p>public void execute(ActionInvocation invocation) throws Exception {</p>
<p>if (contenttype == null)</p>
<p>contenttype = &#8220;application/msexcel&#8221;</p>
<p>if (workbook == null)</p>
<p>workbook = (HSSFWorkbook) invocation.getStack().findValue(&#8220;workbook&#8221;);</p>
<p>HttpServletResponse response = ServletActionContext.getResponse();</p>
<p>response.reset() ;</p>
<p>response.setContentType(contenttype);</p>
<p>response.setHeader(&#8220;Content-Disposition&#8221;, &#8220;attachment;Filename=&#8221; + filename + &#8220;.xls&#8221;);</p>
<p>OutputStream os = response.getOutputStream();</p>
<p>workbook.write(os);</p>
<p>os.flush();</p>
<p>os.close();</p>
<p>}</p>
<p>public void setWorkbook(HSSFWorkbook workbook) {</p>
<p>this.workbook = workbook;</p>
<p>}</p>
<p>public void setFilename(String filename) {</p>
<p>this.filename = filename;</p>
<p>}</p>
<p>public void setContenttype(String contenttype) {</p>
<p>this.contenttype = contenttype;</p>
<p>}</p>
<p>}</p>
<p>可以看到，在execute()方法中通过参数invocation的 invocation.getStack().findValue(&#8220;workbook&#8221;)得到action中的workbook对象，当然，在你的 action中，对生成好的workbook要有get()方法，在后面的代码中会看到。然后workbook.write到response对象就可以了，在这之前，你需要设置html的头部，见上面的代码。</p>
<p>OK，写完上面自定义的Result，我们就可以写Action了，代码如下：</p>
<p>package test.action;</p>
<p>import org.apache.poi.hssf.usermodel.HSSFCell;</p>
<p>import org.apache.poi.hssf.usermodel.HSSFRow;</p>
<p>import org.apache.poi.hssf.usermodel.HSSFSheet;</p>
<p>import org.apache.poi.hssf.usermodel.HSSFWorkbook;</p>
<p>import com.opensymphony.xwork.ActionSupport;</p>
<p>public class ExcelTest extends ActionSupport {</p>
<p>private HSSFWorkbook workbook;</p>
<p>public String execute() throws Exception {</p>
<p>workbook = outputExcelFile();</p>
<p>return SUCCESS;</p>
<p>}</p>
<p>private HSSFWorkbook outputExcelFile() {</p>
<p>try {</p>
<p>HSSFWorkbook workbook = new HSSFWorkbook();</p>
<p>HSSFSheet sheet = workbook.createSheet();</p>
<p>workbook.setSheetName(0, &#8220;测试输出Excel&#8221;, HSSFWorkbook.ENCODING_UTF_16);</p>
<p>HSSFRow row = sheet.createRow((short) 0);</p>
<p>HSSFCell cell = row.createCell((short) 0);</p>
<p>cell.setCellType(HSSFCell.CELL_TYPE_STRING);</p>
<p>cell.setEncoding(HSSFCell.ENCODING_UTF_16);</p>
<p>cell.setCellValue(&#8220;标题1&#8243;);</p>
<p>cell = row.createCell((short) 1);</p>
<p>cell.setCellType(HSSFCell.CELL_TYPE_STRING);</p>
<p>cell.setEncoding(HSSFCell.ENCODING_UTF_16);</p>
<p>cell.setCellValue(&#8220;标题2&#8243;);</p>
<p>cell = row.createCell((short) 2);</p>
<p>cell.setCellType(HSSFCell.CELL_TYPE_STRING);</p>
<p>cell.setEncoding(HSSFCell.ENCODING_UTF_16);</p>
<p>cell.setCellValue(&#8220;标题3&#8243;);</p>
<p>cell = row.createCell((short) 3);</p>
<p>cell.setCellType(HSSFCell.CELL_TYPE_STRING);</p>
<p>cell.setEncoding(HSSFCell.ENCODING_UTF_16);</p>
<p>cell.setCellValue(&#8220;标题4&#8243;);</p>
<p>row = sheet.createRow(1);</p>
<p>cell = row.createCell((short) 0);</p>
<p>cell.setCellType(HSSFCell.CELL_TYPE_STRING);</p>
<p>cell.setEncoding(HSSFCell.ENCODING_UTF_16);</p>
<p>cell.setCellValue(&#8220;内容1&#8243;);</p>
<p>cell = row.createCell((short) 1);</p>
<p>cell.setCellType(HSSFCell.CELL_TYPE_STRING);</p>
<p>cell.setEncoding(HSSFCell.ENCODING_UTF_16);</p>
<p>cell.setCellValue(&#8220;内容2&#8243;);</p>
<p>cell = row.createCell((short) 2);</p>
<p>cell.setCellType(HSSFCell.CELL_TYPE_STRING);</p>
<p>cell.setEncoding(HSSFCell.ENCODING_UTF_16);</p>
<p>cell.setCellValue(&#8220;内容3&#8243;);</p>
<p>cell = row.createCell((short) 3);</p>
<p>cell.setCellType(HSSFCell.CELL_TYPE_STRING);</p>
<p>cell.setEncoding(HSSFCell.ENCODING_UTF_16);</p>
<p>cell.setCellValue(&#8220;内容4&#8243;);</p>
<p>return workbook;</p>
<p>} catch (Exception e) {</p>
<p>e.printStackTrace();</p>
<p>return null;</p>
<p>}</p>
<p>}</p>
<p>public HSSFWorkbook getWorkbook() {</p>
<p>return workbook;</p>
<p>}</p>
<p>}</p>
<p>然后在xwork.xml里面配置result类型</p>
<p>&lt;!&#8211; 定义结果类型 &#8211;&gt;</p>
<p>&lt;result-types&gt;</p>
<p>&lt;result-type name=&#8221;dispatcher&#8221; class=&#8221;com.opensymphony.webwork.dispatcher.ServletDispatcherResult&#8221; default=&#8221;true&#8221;/&gt;</p>
<p>&lt;result-type name=&#8221;redirect&#8221; class=&#8221;com.opensymphony.webwork.dispatcher.ServletRedirectResult&#8221;/&gt;</p>
<p>&lt;result-type name=&#8221;velocity&#8221; class=&#8221;com.opensymphony.webwork.dispatcher.VelocityResult&#8221;/&gt;</p>
<p>&lt;result-type name=&#8221;chain&#8221; class=&#8221;com.opensymphony.xwork.ActionChainResult&#8221;/&gt;</p>
<p>&lt;result-type name=&#8221;xslt&#8221; class=&#8221;com.opensymphony.webwork.views.xslt.XSLTResult&#8221;/&gt;</p>
<p>&lt;result-type name=&#8221;jasper&#8221; class=&#8221;com.opensymphony.webwork.views.jasperreports.JasperReportsResult&#8221;/&gt;</p>
<p>&lt;result-type name=&#8221;freemarker&#8221; class=&#8221;com.opensymphony.webwork.views.freemarker.FreemarkerResult&#8221;/&gt;</p>
<p>&lt;result-type name=&#8221;httpheader&#8221; class=&#8221;com.opensymphony.webwork.dispatcher.HttpHeaderResult&#8221;/&gt;</p>
<p>&lt;result-type name=&#8221;stream&#8221; class=&#8221;com.opensymphony.webwork.dispatcher.StreamResult&#8221;/&gt;</p>
<p>&lt;result-type name=&#8221;plaintext&#8221; class=&#8221;com.opensymphony.webwork.dispatcher.PlainTextResult&#8221; /&gt;</p>
<p>&lt;result-type name=&#8221;excel&#8221; class=&#8221;com.test.excel&#8221;/&gt;</p>
<p>&lt;/result-types&gt;</p>
<p>定义action</p>
<p>&lt;action name=&#8221;output_excel&#8221; class=&#8221;test.action.ExcelTest.ExcelResult&#8221;&gt;</p>
<p>&lt;result name=&#8221;success&#8221; type=&#8221;excel&#8221;&gt;</p>
<p>&lt;param name=&#8221;filename&#8221;&gt;ExcelTest&lt;/param&gt;</p>
<p>&lt;/result&gt;</p>
<p>&lt;/action&gt;</p>
<p>大功告成！</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.jackrun.com/archives/161.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
