云自無心水自閑

          天平山上白云泉,云自無心水自閑。何必奔沖山下去,更添波浪向人間!
          posts - 288, comments - 524, trackbacks - 0, articles - 6
            BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

          Struts2利用stream直接輸出Excel

          Posted on 2008-06-23 20:14 云自無心水自閑 閱讀(10781) 評論(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
          主站蜘蛛池模板: 锡林浩特市| 武宣县| 张北县| 邓州市| 隆子县| 闸北区| 山东省| 庆元县| 桐城市| 赣州市| 荆门市| 夹江县| 灵台县| 靖宇县| 桐城市| 平远县| 璧山县| 柳江县| 淮南市| 牙克石市| 阳原县| 东阳市| 南阳市| 城市| 文山县| 抚远县| 临沧市| 安庆市| 成都市| 固安县| 柳州市| 玉田县| 思南县| 孟村| 土默特右旗| 苗栗市| 神池县| 衢州市| 万安县| 松江区| 康保县|