云自无心水自闲

天平山上白云泉,云自无心水自闲。何必奔冲山下去,更添波浪向人间!
posts - 288, comments - 524, trackbacks - 0, articles - 6
  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

Struts2利用stream直接输出Excel

Posted on 2008-06-23 20:14 云自无心水自闲 阅读(10761) 评论(15)  编辑  收藏 所属分类: Java心得体会Struts2

 

在利用网页展示查询结果,经常会遇到要求导出成Excel的需求。采用这种方法可以定制输出的格式和内容(还不支持合并单元格和公式),生成真正的Excel格式(不是csv)的Excel。
一、struts.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
    "http://struts.apache.org/dtds/struts-2.0.dtd">
  
<struts>

    <constant name="struts.i18n.encoding" value="UTF-8"/>

    <package name="demo" extends="struts-default">
        <action name="excel" method="execute" class="demo.ExcelAction">
                <result name="excel" type="stream">
                    <param name="contentType">application/vnd.ms-excel</param>    <!-- 注意这里的ContentType -->
                    <param name="inputName">excelStream</param>                   <!-- 这里需要和Action里的变量名一致 -->
                    <param name="contentDisposition">filename="standard.xls"</param>
                    <param name="bufferSize">1024</param>
                </result>
        </action>
    </package>
</struts>

二、Struts2的 Action

package demo;
public class ExcelAction {
    private InputStream excelStream; // 需要生成getter和setter

    public String execute() throws Exception {
        StringBuffer excelBuf = new StringBuffer();
        excelBuf.append("BookName").append("\t").append("Year").append("\t").append("author").append("\n");
        excelBuf.append("Thinking in Java").append("\t").append("2001").append("\t").append("Eckel").append("\n");
        excelBuf.append("Spring in action").append("\t").append("2005").append("\t").append("Rod").append("\n");
        String excelString = excelBuf.toString();
        logger.debug("result excel String: " + excelString);
        excelStream = new ByteArrayInputStream(excelString.getBytes(), 0, excelString.length());
        return "excel";
    }

    // getter and setter
    ...
}

三、Jsp页面

<%@ taglib prefix="s" uri="/struts-tags"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
 <head>
  <s:head />
 </head>

 <body>

    <s:form action="" method="post">
       <s:submit key="button.submit"/>
    </s:form>
 </body>
</html>




评论

# re: Struts2利用stream直接输出Excel  回复  更多评论   

2008-06-23 21:54 by DVD比价
是非常实用的,还有XML的输出。

# re: Struts2利用stream直接输出Excel  回复  更多评论   

2008-06-25 18:08 by 雨奏
@云自无心水自闲
挑一下刺:你这样输出的实际上是一个Tab和回车符分隔的纯文本文件哦。尽管能够输出数据,但无法输出格式(比如使用指定的字体)

# re: Struts2利用stream直接输出Excel[未登录]  回复  更多评论   

2008-09-23 16:04 by yang
为什么我在控制台上打出了数据,却没有输出到 Excel 呢?

# re: Struts2利用stream直接输出Excel  回复  更多评论   

2008-09-23 21:02 by usherlight
@yang
可能是你的struts.xml没有配置好,能贴一下你的配置吗?

# re: Struts2利用stream直接输出Excel  回复  更多评论   

2008-09-23 21:04 by usherlight
@雨奏
如果要真正输出Excel,恐怕要使用POI之类的了。
目前这样的解决方法,能够在客户端将数据填充到Excel软件中,基本上可以满足初步的要求了。

# re: Struts2利用stream直接输出Excel[未登录]  回复  更多评论   

2008-09-25 10:47 by yang
我的struts.xml:
<action name="admin_stat" class="statAction">
<result name="excel" type="stream">
<param name="contentType">application/vnd.ms-excel</param>
<param name="inputName">excelStream</param>
<param name="contentDisposition">filename="stat.xls"</param>
<param name="bufferSize">1024</param><!-- 10485760=10M -->
</result>
</action>

输出到控制台上的 excelString 能清晰地看到数据

# re: Struts2利用stream直接输出Excel[未登录]  回复  更多评论   

2008-09-25 10:50 by yang
LZ: 能留个联系方式吗?

# re: Struts2利用stream直接输出Excel  回复  更多评论   

2008-09-26 10:43 by usherlight
@yang

usherlight@sina.com
如果方便的话,可以看一下你的action源码吗?

# re: Struts2利用stream直接输出Excel[未登录]  回复  更多评论   

2008-09-26 12:36 by yang
已经发到你的邮箱,我在CSDN加你了

# re: Struts2利用stream直接输出Excel  回复  更多评论   

2009-01-14 10:28 by zgk83200
LZ,我使用了 你的这个方法出了一些奇怪的问题!
我控制台的输出是:
用户编号 用户名 请假日期 开始时间 时间长度 请假类别
zhaojiangmin 赵江民 2009-01-05 08:00:00 3 婚嫁
3 李四 2008-12-04 12:00:00 6 事假
N2000 郭晶晶 2008-12-01 08:00:00 12 病假
abc 成龙 2008-12-01 08:00:00 1 病假
abc 成龙 2008-12-25 08:00:00 1 事假
3 李四 2008-12-02 08:00:00 1 病假
2 张三 2008-12-10 08:00:00 1 病假
2 张三 2008-12-01 08:00:00 12 病假
2 张三 2008-12-18 12:00:00 12 病假


但是 ,我的excel 缺少 最后1行的 最后2个字段的 数据

# re: Struts2利用stream直接输出Excel  回复  更多评论   

2009-01-16 06:34 by usherlight
奇怪,你查查最后一行最后2个字段数据的分隔符是不是TAB?

# re: Struts2利用stream直接输出Excel  回复  更多评论   

2009-06-23 15:17 by linda
我也和你遇到了相同的问题,总是到最后一点打印不出来,原因是我构造流时,
excelStream = new ByteArrayInputStream(excelString.getBytes(), 0,
excelString.length);
换成:
excelStream = new ByteArrayInputStream(excelString.getBytes(), 0,
excelString.getBytes().length);
就好了,
留在这里供以后出错的人来参考。

# re: Struts2利用stream直接输出Excel  回复  更多评论   

2009-06-23 20:19 by usherlight
@linda
谢谢!

# re: Struts2利用stream直接输出Excel  回复  更多评论   

2011-07-20 14:36 by leongpow
LZ,加个QQ吧。。

1047180392

# re: Struts2利用stream直接输出Excel  回复  更多评论   

2016-04-25 17:53 by sad
dsaasdsadsadd as

只有注册用户登录后才能发表评论。


网站导航: