e代劍客——溫柔一刀

          生活就像海洋,只有意志堅(jiān)強(qiáng)的人,才能到達(dá)彼岸

             :: 首頁(yè) :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
            76 隨筆 :: 7 文章 :: 215 評(píng)論 :: 0 Trackbacks
          HTML頁(yè)面并不總是向用戶顯示數(shù)據(jù)輸出的最好方式,有時(shí)候需要生成不可改變的文件打印,PDF可能是種不錯(cuò)的選擇。

          Spring支持從數(shù)據(jù)動(dòng)態(tài)生成PDF或Excel文件

          下面這個(gè)簡(jiǎn)單實(shí)現(xiàn)的例子實(shí)現(xiàn)了spring輸出PDF和Excel文件,為了使用Excel電子表格,你需要在你的classpath中加入poi-2.5.1.jar庫(kù)文件,而對(duì)PDF文件,則需要iText.jar文件。它們都包含在Spring的主發(fā)布包中。

          下面是測(cè)試項(xiàng)目代碼:


          1、控制器配置代碼
          <?xml?version="1.0"?encoding="UTF-8"?>
          <!DOCTYPE?beans?PUBLIC?"-//SPRING//DTD?BEAN//EN"?"http://www.springframework.org/dtd/spring-beans.dtd">

          <beans>
          ????
          <bean?id="beanNameViewResolver"
          ????????class
          ="org.springframework.web.servlet.view.BeanNameViewResolver"?/>

          ????
          <bean?id="viewController"?class="com.zhupan.spring.ViewController"?/>
          ????
          <bean?id="urlMapping"
          ????????class
          ="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
          ????????
          <property?name="mappings">
          ????????????
          <props>
          ????????????????
          <prop?key="/view*.shtml">viewController</prop>
          ????????????
          </props>
          ????????
          </property>
          ????
          </bean>
          </beans>

          ?3、用于Excel視圖的視圖子類化
          為了在生成輸出文檔的過(guò)程中實(shí)現(xiàn)定制的行為,我們將繼承合適的抽象類。對(duì)于Excel,這包括提供一個(gè) org.springframework.web.servlet.view.document.AbstractExcelView的子類,并實(shí)現(xiàn) buildExcelDocument方法。
          package?com.zhupan.view;

          import?java.util.Date;
          import?java.util.Map;
          import?javax.servlet.http.HttpServletRequest;
          import?javax.servlet.http.HttpServletResponse;

          import?org.apache.poi.hssf.usermodel.HSSFCell;
          import?org.apache.poi.hssf.usermodel.HSSFCellStyle;
          import?org.apache.poi.hssf.usermodel.HSSFDataFormat;
          import?org.apache.poi.hssf.usermodel.HSSFRow;
          import?org.apache.poi.hssf.usermodel.HSSFSheet;
          import?org.apache.poi.hssf.usermodel.HSSFWorkbook;
          import?org.springframework.web.servlet.view.document.AbstractExcelView;


          public?class?ViewExcel?extends?AbstractExcelView?{

          ??
          public?void?buildExcelDocument(
          ?????????????Map?model,?HSSFWorkbook?workbook,
          ?????????????HttpServletRequest?request,?HttpServletResponse?response)
          ????
          throws?Exception?{
          ??
          ???????HSSFSheet?sheet?
          =?workbook.createSheet("list");
          ???????sheet.setDefaultColumnWidth((
          short)?12);
          ???????
          ???????
          ???????HSSFCell?cell?
          =?getCell(sheet,?0,?0);
          ???????setText(cell,?
          "Spring?Excel?test");
          ??
          ???????HSSFCellStyle?dateStyle?
          =?workbook.createCellStyle();
          ???????dateStyle.setDataFormat(HSSFDataFormat.getBuiltinFormat(
          "m/d/yy"));
          ???????cell?
          =?getCell(sheet,?1,?0);
          ???????cell.setCellValue(
          new?Date());
          ???????cell.setCellStyle(dateStyle);
          ???????getCell(sheet,?
          2,?0).setCellValue(458);
          ??
          ???????HSSFRow?sheetRow?
          =?sheet.createRow(3);
          ???????
          for?(short?i?=?0;?i?<?10;?i++)?{
          ?????????????sheetRow.createCell(i).setCellValue(i?
          *?10);
          ???????}


          ??}

          ??
          }


          4、用于PDF視圖的視圖子類化
          需要象下面一樣繼承org.springframework.web.servlet.view.document.AbstractPdfView,并實(shí)現(xiàn)buildPdfDocument()方法。
          package?com.zhupan.view;

          import?java.util.List;
          import?java.util.Map;

          import?javax.servlet.http.HttpServletRequest;
          import?javax.servlet.http.HttpServletResponse;

          import?org.springframework.web.servlet.view.document.AbstractPdfView;

          import?com.lowagie.text.Document;
          import?com.lowagie.text.Paragraph;
          import?com.lowagie.text.pdf.PdfWriter;

          public?class?ViewPDF?extends?AbstractPdfView?{
          ????
          public?void?buildPdfDocument(Map?model,?Document?document,
          ????????????PdfWriter?writer,?HttpServletRequest?request,
          ????????????HttpServletResponse?response)?
          throws?Exception?{

          ????????List?list?
          =?(List)?model.get("list");

          ????????
          for?(int?i?=?0;?i?<?list.size();?i++)
          ????????????document.add(
          new?Paragraph((String)?list.get(i)));
          ????}


          }

          5、其他文件
          1)控制器ViewController
          package?com.zhupan.spring;

          import?java.util.ArrayList;
          import?java.util.HashMap;
          import?java.util.List;
          import?java.util.Map;

          import?javax.servlet.http.HttpServletRequest;
          import?javax.servlet.http.HttpServletResponse;

          import?org.springframework.web.servlet.ModelAndView;
          import?org.springframework.web.servlet.mvc.multiaction.MultiActionController;

          import?com.zhupan.view.ViewExcel;
          import?com.zhupan.view.ViewPDF;


          public?class?ViewController?extends?MultiActionController{
          ?????
          ?????
          public?ModelAndView?viewPDF(HttpServletRequest?request,?HttpServletResponse?response)?throws?Exception?{
          ???????List?list?
          =?new?ArrayList();
          ???????Map?model
          =new?HashMap();
          ???????list.add(
          "test1");
          ???????list.add(
          "test2");
          ???????model.put(
          "list",list);
          ???????ViewPDF?viewPDF
          =new?ViewPDF();
          ???????
          return?new?ModelAndView(viewPDF,model);
          ??}

          ?????
          ??????
          public?ModelAndView?viewExcel(HttpServletRequest?request,?HttpServletResponse?response)?throws?Exception?{
          ????????????List?list?
          =?new?ArrayList();
          ????????Map?model
          =new?HashMap();
          ????????list.add(
          "test1");
          ????????list.add(
          "test2");
          ????????model.put(
          "list",list);
          ????????ViewExcel?viewExcel
          =new?ViewExcel();
          ????????
          return?new?ModelAndView(viewExcel,model);
          ??????}

          }
          2)web.xml
          <?xml?version="1.0"?encoding="UTF-8"?>
          <web-app?version="2.4"?xmlns="http://java.sun.com/xml/ns/j2ee"
          ????xmlns:xsi
          ="http://www.w3.org/2001/XMLSchema-instance"
          ????xsi:schemaLocation
          ="http://java.sun.com/xml/ns/j2ee?
          ????http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"
          >

          ????
          <display-name>springPDFTest</display-name>
          ????
          <servlet>
          ????????
          <servlet-name>springPDFTest</servlet-name>
          ????????
          <servlet-class>
          ????????????org.springframework.web.servlet.DispatcherServlet
          ????????
          </servlet-class>
          ????????
          <load-on-startup>1</load-on-startup>
          ????
          </servlet>

          ????
          <servlet-mapping>
          ????????
          <servlet-name>springPDFTest</servlet-name>
          ????????
          <url-pattern>*.shtml</url-pattern>
          ????
          </servlet-mapping>

          ????
          <welcome-file-list>
          ????????
          <welcome-file>index.jsp</welcome-file>
          ????
          </welcome-file-list>

          </web-app>

          3)index.jsp
          <%@?page?contentType="text/html;?charset=gb2312"%>

          <a?href="viewPDF.shtml">PDF視圖打開?</a>
          <br>
          <a?href="viewExcel.shtml">Excel視圖打開</a>
          posted on 2006-10-04 12:11 溫柔一刀 閱讀(7323) 評(píng)論(7)  編輯  收藏 所屬分類: 開源框架

          評(píng)論

          # re: spring 生成Excel和PDF文件 2006-10-15 17:06 曲靜波
          有個(gè)問(wèn)題,如果不用spring的controller或改成struts的action或servlet可以使用viewPdf 和 viewExcel嗎?  回復(fù)  更多評(píng)論
            

          # re: spring 生成Excel和PDF文件 2006-10-16 08:52 溫柔一刀
          @曲靜波
          直接是不可以的
          因?yàn)樗鼈兌糴xtends AbstractPdfView
          而AbstractPdfView是spring提供的
          org.springframework.web.servlet.view.document.AbstractExcelView
          如果要用的話就得把spring的包導(dǎo)入項(xiàng)目  回復(fù)  更多評(píng)論
            

          # re: spring 生成Excel和PDF文件 2007-04-04 15:12 yangaries
          我把它部署在Eclipse中,為什么單擊“Excel視圖打開”后提示“Servlet springPDFTest is not available”呢?
            回復(fù)  更多評(píng)論
            

          # re: spring 生成Excel和PDF文件 2007-04-04 16:40 yangaries
          解決了,jar包放錯(cuò)地方了,呵呵。
          能解釋一下在位置文件中控制是怎樣傳遞的么?  回復(fù)  更多評(píng)論
            

          # re: spring 生成Excel和PDF文件[未登錄](méi) 2008-10-21 17:55 michael
          請(qǐng)問(wèn)樓上的,我也遇到同樣的問(wèn)題了,你能不能告訴我詳細(xì)點(diǎn)的解決方案呢  回復(fù)  更多評(píng)論
            

          # re: spring 生成Excel和PDF文件[未登錄](méi) 2008-10-21 17:59 michael
          17:05:32,125 INFO [STDOUT] 2008-10-21 17:05:32,109 [main] ERROR org.springframe
          work.web.servlet.DispatcherServlet - Context initialization failed
          org.springframework.beans.factory.BeanDefinitionStoreException: IOException pars
          ing XML document from ServletContext resource [/WEB-INF/springPDFTest-servlet.xm
          l]; nested exception is java.io.FileNotFoundException: Could not open ServletCon
          text resource [/WEB-INF/springPDFTest-servlet.xml]
          Caused by:
          java.io.FileNotFoundException: Could not open ServletContext resource [/WEB-INF/
          springPDFTest-servlet.xml]
          ------------------------------
          這個(gè)是JBOSS的錯(cuò)誤信息  回復(fù)  更多評(píng)論
            

          # re: spring 生成Excel和PDF文件 2010-03-10 16:07 XT
          在 使用 Excel視圖打開 的時(shí)候有中文亂碼問(wèn)題,
          搞了半天都沒(méi)解決 ,樓主,再麻煩一下  回復(fù)  更多評(píng)論
            

          聯(lián)系偶 zhupanjava@gmail.com 溫柔一刀
          主站蜘蛛池模板: 长宁区| 茂名市| 建始县| 札达县| 石阡县| 遵义县| 兖州市| 调兵山市| 罗江县| 云林县| 五河县| 长汀县| 葫芦岛市| 古丈县| 鲁甸县| 屯门区| 嘉兴市| 延边| 昌都县| 定陶县| 洛宁县| 故城县| 寻甸| 兴业县| 公主岭市| 庄浪县| 仲巴县| 肥东县| 彝良县| 徐汇区| 雅江县| 磐石市| 雷波县| 镇宁| 德惠市| 宁都县| 民权县| 北碚区| 南丹县| 禄丰县| 迭部县|