- 浏览: 1746855 次
- 性别:
- 来自: 大连
博客专栏
-
Spring数据库访问系列...
浏览量:172722
-
Android学习笔记
浏览量:366360
-
iBatis开发详解
浏览量:188215
-
Objective-C学习...
浏览量:98592
最新评论
-
iLidy:
引用[/c
Hibernate持久化对象的生命周期详解 -
fengzigogo:
您好,有这个项目架构的源码下载地址吗?
一种Java Web应用开发框架的构建(基于Struts2+Spring+FreeMarker)之一 -
spring_springmvc:
可以参考最新的文档:如何在eclipse jee中检出项目并转 ...
用Maven构建Java Web开发环境(Jetty容器)之二 -
springdata_springmvc:
spring mvc demo教程源代码下载,地址:http: ...
Spring 3之MVC & Security简单整合开发(二) -
赵庆辉:
看帖回复是美德,楼主讲的很清晰明了,看了豁然开朗.
Java String对象的经典问题(new String())
上一篇我们介绍了如何制作复杂报表的分析和设计,本篇结合Spring MVC框架来说一下如何在Web层使用POI组件来动态生成报表供用户查看或下载。为什么选择Spring MVC框架,理由很简单,因为Spring的MVC框架对Excel视图的扩展使用的正是POI组件,那么使用Spring来整合就非常方便了,当然其它的框架都有自己的处理办法,这个可以具体咨询其对视图扩展支持的配置方法。
使用Spring对Excel的支持,需要扩展MVC的视图组件,就是要创建一个自定义的View,这个在后面会详细介绍,通过这个view,就可以将Excel报表展现出来了,非常方便。
基于Spring MVC的程序,那么首先要构建起来Spring MVC的环境,这个很简单,下面我们来看看如何搭建Spring MVC环境。我们使用Spring 3.0.5的库,但是配置方式不用注解,用传统的配置方式来说明。
使用Maven管理项目,引入必要的依赖,如下:
并建立如下的项目结构:
在web.xml描述符中,首先配置Spring配置文件的路径:
其次配置一个字符过滤器,使用Spring提供的就好,这样就不用过多考虑字符编码的问题了:
最后是Spring MVC的ServletDispatcher配置了:
我们配置了一个初始化文件,在Servlet加载时会加载这个配置文件,并使用*.do风格的映射地址。在这个初始配置文件中,主要配置了映射和拦截器等信息。内容如下:
其中扩展名拦截器是对生成Excel文件后的扩展名进行处理的,这个后面会说,下面就是配置映射,这里我们只有一个测试,那么就写一个映射即可,最后使用这个地址来测试,配置好映射信息后,那么就要配置其中的每个映射,那么来看看ExcelController的配置:
这个也很简单,注入两个属性,一个service和一个view。为什么要用view,因为Spring MVC已经和POI进行了整合,这两个bean分别配置一下即可,这里不再说明了。详见附件中的完整源码。下面来看看控制器:
控制器扩展了AbstractController,覆盖了handleRequestInternal方法,这样就可以编写我们自定义的处理代码了。类开始是对service和view的注入,业务代码中从Service中获取了数据,然后放入model中,这个model是一个HashMap,也是Spring MVC中传递数据的纽带,使用方便。就像Struts2中的值栈一样,不过这个是显式使用,而值栈更像是隐式存在的数据桥梁。那么来看看Service:
这是很简单的类了,数据是我们准备好的,实际应用中就可以操作数据库了,这都没是由什么难度。下面来看一下展示Excel的View:
中间的处理代码不贴出了,这和以前的都是一样的。主要来看这个视图的写法,因为要生成Excel,那么就扩展AbstractExcelView,覆盖其中的buildExcelDocument方法,它为我们提供了存储数据的model,创建Excel的POI API,还有请求和响应对象,这都是很熟悉的内容了。首先是从model对象中取出我们放置的数据列表,下面是用POI来制作报表,之前已经写过,都是一模一样的代码,就不贴出了。
至此,配置结束,就剩下一个问题了,触发该请求后,数据填充完毕要展示给用户看,可此时还没有配置文件类型的信息,要给用户合理的反馈,那么就需要对处理后的结果进行最后的处理,这就是前面提到的拦截器。
Spring的拦截器也相当简练,看看这个方法名就知道这是在流程处理结束之后的拦截器,而流程处理之前可以不配置,也就是拦截器可以配置成前后不同的处理方法,同时允许链接拦截器。它不像Struts2的拦截器,处理前通过1,2,3,处理后再通过3,2,1要走两次相同内容。更为高效。
在这里,我们可以拿到model对象从其中取出一些控制器传递过来的参数,当然这是根据需要使用的,之后获取到请求uri,来处理这个uri,是excel.do结尾的请求,我们要作为附件下载来体现,那么就要重新命名,然后设置响应对象,这也就是一般下载流程的最后一个步骤,很简单。
写完代码,在Maven中配置项目
这部分的介绍就全部结束了。
我的错 搞错了
因为这里是在介绍Spring MVC和Excel的整合下载
是我说的不清楚,我试过不用Spring的拦截器也能够实现导出EXCEL了。
这里的拦截器只是为了更改文件名所做的一些特殊操作
因为这里是在介绍Spring MVC和Excel的整合下载
是我说的不清楚,我试过不用Spring的拦截器也能够实现导出EXCEL了。
因为这里是在介绍Spring MVC和Excel的整合下载
感谢您的支持!
使用Spring对Excel的支持,需要扩展MVC的视图组件,就是要创建一个自定义的View,这个在后面会详细介绍,通过这个view,就可以将Excel报表展现出来了,非常方便。
基于Spring MVC的程序,那么首先要构建起来Spring MVC的环境,这个很简单,下面我们来看看如何搭建Spring MVC环境。我们使用Spring 3.0.5的库,但是配置方式不用注解,用传统的配置方式来说明。
使用Maven管理项目,引入必要的依赖,如下:
并建立如下的项目结构:
在web.xml描述符中,首先配置Spring配置文件的路径:
<context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:org/ourpioneer/spring/*.xml,classpath:org/ourpioneer/spring/*/*.xml</param-value> </context-param> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener>
其次配置一个字符过滤器,使用Spring提供的就好,这样就不用过多考虑字符编码的问题了:
<filter> <filter-name>EncodingFilter</filter-name> <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class> <init-param> <param-name>encoding</param-name> <param-value>UTF-8</param-value> </init-param> <init-param> <param-name>forceEncoding</param-name> <param-value>true</param-value> </init-param> </filter> <filter-mapping> <filter-name>EncodingFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
最后是Spring MVC的ServletDispatcher配置了:
<servlet> <servlet-name>board</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value>/WEB-INF/Dispatcher-Servlet.xml</param-value> </init-param> </servlet> <servlet-mapping> <servlet-name>board</servlet-name> <url-pattern>*.do</url-pattern> </servlet-mapping>
我们配置了一个初始化文件,在Servlet加载时会加载这个配置文件,并使用*.do风格的映射地址。在这个初始配置文件中,主要配置了映射和拦截器等信息。内容如下:
<!-- 扩展命名拦截器 --> <bean id="extensionInterceptor" class="org.ourpioneer.excel.web.interceptor.ExtensionInterceptor"></bean> <!-- 控制器映射 --> <bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping"> <property name="interceptors"> <list> <ref bean="extensionInterceptor" /> </list> </property> <property name="mappings"> <props> <prop key="/excel.do">ExcelController</prop> </props> </property> </bean>
其中扩展名拦截器是对生成Excel文件后的扩展名进行处理的,这个后面会说,下面就是配置映射,这里我们只有一个测试,那么就写一个映射即可,最后使用这个地址来测试,配置好映射信息后,那么就要配置其中的每个映射,那么来看看ExcelController的配置:
<bean id="ExcelController" class="org.ourpioneer.excel.web.controller.ExcelController"> <property name="reportService" ref="reportService" /> <property name="reportView" ref="reportView" /> </bean>
这个也很简单,注入两个属性,一个service和一个view。为什么要用view,因为Spring MVC已经和POI进行了整合,这两个bean分别配置一下即可,这里不再说明了。详见附件中的完整源码。下面来看看控制器:
package org.ourpioneer.excel.web.controller; import java.util.HashMap; import java.util.List; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.ourpioneer.excel.bean.CruiseServiceLocation; import org.ourpioneer.excel.service.ReportService; import org.ourpioneer.excel.web.views.ReportView; import org.springframework.web.servlet.ModelAndView; import org.springframework.web.servlet.mvc.AbstractController; /** * Excel处理控制器 * * @author Nanlei * */ public class ExcelController extends AbstractController { private ReportView reportView; private ReportService reportService; public void setReportView(ReportView reportView) { this.reportView = reportView; } public void setReportService(ReportService reportService) { this.reportService = reportService; } @Override protected ModelAndView handleRequestInternal(HttpServletRequest request, HttpServletResponse response) throws Exception { HashMap model = new HashMap(); List<CruiseServiceLocation> cslList = reportService .getCruiseLocationList(); model.put("cruiseServiceLocationList", cslList); return new ModelAndView(reportView, model); } }
控制器扩展了AbstractController,覆盖了handleRequestInternal方法,这样就可以编写我们自定义的处理代码了。类开始是对service和view的注入,业务代码中从Service中获取了数据,然后放入model中,这个model是一个HashMap,也是Spring MVC中传递数据的纽带,使用方便。就像Struts2中的值栈一样,不过这个是显式使用,而值栈更像是隐式存在的数据桥梁。那么来看看Service:
package org.ourpioneer.excel.service; import java.util.Arrays; import java.util.List; import org.ourpioneer.excel.bean.CruiseServiceLocation; /** * 报表数据业务类 * * @author Nanlei * */ public class ReportService { /** * 获取数据 * * @return */ public List<CruiseServiceLocation> getCruiseLocationList() { CruiseServiceLocation csl[] = new CruiseServiceLocation[21]; csl[0] = new CruiseServiceLocation("T001", "北京市", "北京总部", "bj", "清华大学", 20); ... csl[20] = new CruiseServiceLocation("", "", "", "", "", 0);// 合并算法捕捉最后一行有问题,增补一行无效数据,计算时去除 return Arrays.asList(csl); } }
这是很简单的类了,数据是我们准备好的,实际应用中就可以操作数据库了,这都没是由什么难度。下面来看一下展示Excel的View:
package org.ourpioneer.excel.web.views; /** * 报表的Excel视图 * * @author Nanlei * */ public class ReportView extends AbstractExcelView { @Override protected void buildExcelDocument(Map<String, Object> model, HSSFWorkbook workbook, HttpServletRequest request, HttpServletResponse response) throws Exception { // 从model中获取数据对象 List<CruiseServiceLocation> cruiseServiceLocationList = (List<CruiseServiceLocation>) model .get("cruiseServiceLocationList"); … } }
中间的处理代码不贴出了,这和以前的都是一样的。主要来看这个视图的写法,因为要生成Excel,那么就扩展AbstractExcelView,覆盖其中的buildExcelDocument方法,它为我们提供了存储数据的model,创建Excel的POI API,还有请求和响应对象,这都是很熟悉的内容了。首先是从model对象中取出我们放置的数据列表,下面是用POI来制作报表,之前已经写过,都是一模一样的代码,就不贴出了。
至此,配置结束,就剩下一个问题了,触发该请求后,数据填充完毕要展示给用户看,可此时还没有配置文件类型的信息,要给用户合理的反馈,那么就需要对处理后的结果进行最后的处理,这就是前面提到的拦截器。
package org.ourpioneer.excel.web.interceptor; import java.net.URLEncoder; import java.text.SimpleDateFormat; import java.util.Date; import java.util.Map; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.commons.lang.StringUtils; import org.springframework.web.servlet.ModelAndView; import org.springframework.web.servlet.handler.HandlerInterceptorAdapter; /** * 扩展名命名处理拦截器 * * @author Nanlei * */ public class ExtensionInterceptor extends HandlerInterceptorAdapter { /** * 用在流程处理之后 */ @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { // 获取Controller过来的Model对象 Map model = modelAndView.getModel(); // 获取请求URI String uri = request.getRequestURI(); // 生成文件的名称 String exportFileName = null; if (uri.endsWith("excel.do")) { String time = new SimpleDateFormat("yyyyMMddHHmmss") .format(new Date()); exportFileName = "报表" + time + ".xls"; } if (StringUtils.isNotEmpty(exportFileName)) { response.setHeader("Content-Disposition", "attachment; filename=" + URLEncoder.encode(exportFileName, "UTF-8")); } super.postHandle(request, response, handler, modelAndView); } }
Spring的拦截器也相当简练,看看这个方法名就知道这是在流程处理结束之后的拦截器,而流程处理之前可以不配置,也就是拦截器可以配置成前后不同的处理方法,同时允许链接拦截器。它不像Struts2的拦截器,处理前通过1,2,3,处理后再通过3,2,1要走两次相同内容。更为高效。
在这里,我们可以拿到model对象从其中取出一些控制器传递过来的参数,当然这是根据需要使用的,之后获取到请求uri,来处理这个uri,是excel.do结尾的请求,我们要作为附件下载来体现,那么就要重新命名,然后设置响应对象,这也就是一般下载流程的最后一个步骤,很简单。
写完代码,在Maven中配置项目
这部分的介绍就全部结束了。
评论
12 楼
dare_
2015-01-08
dare_ 写道
LZ的源码中缺少了SimpleUrlHandlerMapping这个类吧
我的错 搞错了
11 楼
dare_
2015-01-08
LZ的源码中缺少了SimpleUrlHandlerMapping这个类吧
10 楼
sarin
2013-04-11
myjoe 写道
sarin 写道
myjoe 写道
在control里面为什么不直接HttpServletResponse呢?
例如:
OutputStream toClient = new BufferedOutputStream(response
.getOutputStream());
String fileName = "workbook.xls";
response.setHeader("Content-Disposition", "attachment;filename="
+ URLEncoder.encode(fileName, "UTF-8"));
Workbook wb = new HSSFWorkbook();
Sheet sheet = wb.createSheet("new sheet");
wb.write(toClient);
toClient.flush();
toClient.close();
return null;
例如:
OutputStream toClient = new BufferedOutputStream(response
.getOutputStream());
String fileName = "workbook.xls";
response.setHeader("Content-Disposition", "attachment;filename="
+ URLEncoder.encode(fileName, "UTF-8"));
Workbook wb = new HSSFWorkbook();
Sheet sheet = wb.createSheet("new sheet");
wb.write(toClient);
toClient.flush();
toClient.close();
return null;
因为这里是在介绍Spring MVC和Excel的整合下载
是我说的不清楚,我试过不用Spring的拦截器也能够实现导出EXCEL了。
这里的拦截器只是为了更改文件名所做的一些特殊操作
9 楼
myjoe
2013-04-11
sarin 写道
myjoe 写道
在control里面为什么不直接HttpServletResponse呢?
例如:
OutputStream toClient = new BufferedOutputStream(response
.getOutputStream());
String fileName = "workbook.xls";
response.setHeader("Content-Disposition", "attachment;filename="
+ URLEncoder.encode(fileName, "UTF-8"));
Workbook wb = new HSSFWorkbook();
Sheet sheet = wb.createSheet("new sheet");
wb.write(toClient);
toClient.flush();
toClient.close();
return null;
例如:
OutputStream toClient = new BufferedOutputStream(response
.getOutputStream());
String fileName = "workbook.xls";
response.setHeader("Content-Disposition", "attachment;filename="
+ URLEncoder.encode(fileName, "UTF-8"));
Workbook wb = new HSSFWorkbook();
Sheet sheet = wb.createSheet("new sheet");
wb.write(toClient);
toClient.flush();
toClient.close();
return null;
因为这里是在介绍Spring MVC和Excel的整合下载
是我说的不清楚,我试过不用Spring的拦截器也能够实现导出EXCEL了。
8 楼
sarin
2013-04-07
myjoe 写道
在control里面为什么不直接HttpServletResponse呢?
例如:
OutputStream toClient = new BufferedOutputStream(response
.getOutputStream());
String fileName = "workbook.xls";
response.setHeader("Content-Disposition", "attachment;filename="
+ URLEncoder.encode(fileName, "UTF-8"));
Workbook wb = new HSSFWorkbook();
Sheet sheet = wb.createSheet("new sheet");
wb.write(toClient);
toClient.flush();
toClient.close();
return null;
例如:
OutputStream toClient = new BufferedOutputStream(response
.getOutputStream());
String fileName = "workbook.xls";
response.setHeader("Content-Disposition", "attachment;filename="
+ URLEncoder.encode(fileName, "UTF-8"));
Workbook wb = new HSSFWorkbook();
Sheet sheet = wb.createSheet("new sheet");
wb.write(toClient);
toClient.flush();
toClient.close();
return null;
因为这里是在介绍Spring MVC和Excel的整合下载
7 楼
myjoe
2013-04-07
在control里面为什么不直接HttpServletResponse呢?
例如:
OutputStream toClient = new BufferedOutputStream(response
.getOutputStream());
String fileName = "workbook.xls";
response.setHeader("Content-Disposition", "attachment;filename="
+ URLEncoder.encode(fileName, "UTF-8"));
Workbook wb = new HSSFWorkbook();
Sheet sheet = wb.createSheet("new sheet");
wb.write(toClient);
toClient.flush();
toClient.close();
return null;
例如:
OutputStream toClient = new BufferedOutputStream(response
.getOutputStream());
String fileName = "workbook.xls";
response.setHeader("Content-Disposition", "attachment;filename="
+ URLEncoder.encode(fileName, "UTF-8"));
Workbook wb = new HSSFWorkbook();
Sheet sheet = wb.createSheet("new sheet");
wb.write(toClient);
toClient.flush();
toClient.close();
return null;
6 楼
whlxjq520
2011-10-20
多谢楼主,刚好再找这方面的资料。到网上找了半天poi的中文api未果,看了这个我觉得不再需要api了。
5 楼
三尺之尚
2011-05-23
感谢博主的详细分解,转载了,十分感谢
4 楼
dir_murong
2011-01-11
以前做项目也用过 不过没有lz这么细致 学习了
3 楼
jeho0815
2011-01-06
的确不错,我看了这个感觉对我帮助不小,谢谢!
2 楼
sarin
2011-01-05
leepengyu 写道
一直在追着看
坚决要顶这样的帖子
支持博主
坚决要顶这样的帖子
支持博主
感谢您的支持!
1 楼
leepengyu
2011-01-05
一直在追着看
坚决要顶这样的帖子
支持博主
坚决要顶这样的帖子
支持博主
发表评论
-
HTML5/CSS3翻转动画(二)
2011-12-31 11:28 9508上一篇我们制作了两行文字的翻转效果,他们是同步进行的, ... -
HTML5/CSS3翻转动画(一)
2011-12-30 13:43 17584翻转动画效果,就是将页面的元素(文字,图片)加入围绕坐 ... -
HTML5/CSS3清爽后台番外篇-添加锁屏效果
2011-10-29 12:34 10202锁屏效果,也就是将屏幕置于模态,不允许用户触发任何动作 ... -
基于HTML5/CSS3的清爽后台管理页面(二)
2011-10-02 09:11 12927本文接上一篇继续来介绍企业级开发中后台管理页面的制作。 ... -
基于HTML5/CSS3的清爽后台管理页面(一)
2011-10-01 21:36 20427后台管理系统是企业级开发中必不可少的组成部分,一般来说 ... -
HTML5绘制饼图实例(二)
2011-08-15 21:16 11134本文接上一讲继续 ... -
HTML5绘制饼图实例(二)
2011-08-15 20:48 8本文接上一讲继续来说明 我们继续来制作饼图示例 ... -
HTML5绘制饼图实例(一)
2011-08-14 15:28 12176HTML5引入Canvas元素 ... -
我的视频教程《中小企业OA系统》
2011-07-29 22:27 7680经过5个月的制作,和华章合作的《中小企业OA系统》Ja ... -
从一道Neusoft题中想到的Java日志API
2011-03-05 09:45 6877先来看看这一季度 ... -
Apache POI组件操作Excel,制作报表(三)
2010-12-27 23:26 13168上一篇介绍了POI组件操作Excel时如何对单元格和行 ... -
Apache POI组件操作Excel,制作报表(二)
2010-12-19 16:04 18179本文接上一篇继续探究POI组件的使用。 现在来看 ... -
Apache POI组件操作Excel,制作报表(一)
2010-12-16 22:25 42133Apache的POI组件是Jav ... -
使用JACKSON解析JSON(HttpClient 3处理请求)
2010-11-24 18:50 27358在上一篇中,我们 ... -
使用XStream解析XML(使用HttpClient 4发送请求)
2010-11-07 12:55 9514本文意在简单说明XStream解析XML,配合Http ... -
从一道Neusoft题中想到的IO和Comparator
2010-09-23 10:36 2774Neusoft内部定期举 ... -
Spring支持的Quartz程序调度
2010-09-05 21:45 9589开发时有时会有这样一种需求,定期计算某些数据或者执行某 ... -
Servlet 3(用Java生成GET/POST请求)
2010-08-29 10:59 14551Servlet是SUN指定的Java服务器端编程规范, ... -
使用Fusion Charts制作报表(dom4j生成XML)
2010-07-13 13:03 16692首次看到Fusion Charts是在Bug Free ... -
使用Javabean作为数据源的JasperReport报表(通过WebService/RMI调用数据)
2010-06-18 09:46 7024本文接http://sarin.iteye.com/b ...
相关推荐
NULL 博文链接:https://zjkilly.iteye.com/blog/870334
应用POI组件操作Excel
apache POI,文件读写 ,excel 对于使用apache poi 解析微软excel的一些文件
Apache poi 操作 excel 文件压缩包,亲测可用
Apache POI Excel操作 需要的文档,.介绍,相关jar包,maven中的配置等,比较全面
应用poi组件操作excel,实现excel表导入到数据库中。
使用Apache POI的3.16版实现,Excel模板填充数据导出Excel报表
apache poi 读取 Excel 的 jar 包 博文链接:https://wxinpeng.iteye.com/blog/231895
java poi操作excel的实战文档介绍java poi操作excel的实战文档介绍
自己花了几天时间写的基于Apache POI的Java 读取excel文件,功能还是比较齐全
WI TWO 淘宝分享Java调用POI组件操作excel
apache软件基金 poi组件 轻松实现,生成excel报表
Apache POI导入和导出Excel文件
Apache Poi Excel导出 博文链接:https://zhiminsun.iteye.com/blog/1883347
Poi强大的操作技术方便了我们开发,Apache POI导入数据到Excel电子表格
Apache POI For Java Excel.doc
POI工具包可用来读写Excel,在java开发中可用来创建、导出信息到excel表格中,还可读取excel中的信息使用到应用程序中。
Apache poi 根据word模板生成word报表 替换 循环列表 图片,代码调试过了,修改相应的图片位置,word模板路径即可运行
poi excel poi excel poi excel poi excel poi excel poi excel poi excel poi excel