Apache POI组件操作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" />
- lt;/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中配置项目
这部分的介绍就全部结束了。
Apache POI组件操作Excel,制作报表(四)的更多相关文章
- Apache POI组件操作Excel,制作报表(三)
Apache POI组件操作Excel,制作报表(三) 博客分类: 探索实践 ExcelApache算法Office单元测试 上一篇介绍了POI组件操作Excel时如何对单元格和行进行设置, ...
- Apache POI组件操作Excel,制作报表(二)
本文接上一篇继续探究POI组件的使用. 现在来看看Excel的基本设置问题,以2007为例,先从工作簿来说,设置列宽,因为生成表格列应该固定,而行是遍历生成的,所以可以在工作簿级别来设置列宽, ...
- Apache POI组件操作Excel,制作报表(一)
Apache的POI组件是Java操作Microsoft Office办公套件的强大API,其中对Word,Excel和PowperPoint都有支持,当然使用较多的还是Excel,因为Word和Po ...
- java用org.apache.poi包操作excel
一.POI简介 Jakarta POI 是apache的子项目,目标是处理ole2对象.它提供了一组操纵Windows文档的Java API 目前比较成熟的是HSSF接口,处理MS Excel(97- ...
- C#操作Excel开发报表系列整理(转)
C#操作Excel进行报表开发系列共写了七篇,也已经有很久没有新东西了,现在整理一下,方便以后查阅,如果有写新的,会同时更新.需要注意的是因为Office的版本不同,实际的代码可能会有所不同,但是都是 ...
- C#操作Excel开发报表系列整理
C#操作Excel进行报表开发系列共写了八篇,也已经有很久没有新东西了,现在整理一下,方便以后查阅,如果有写新的,会同时更新.需要注意的是因为Office的版本不同,实际的代码可能会有所不同,但是都是 ...
- 使用JXL组件操作Excel和导出文件
这段时间参与的项目要求做几张Excel报表,由于项目框架使用了jxl组件,所以把jxl组件的详细用法归纳总结一下.本文主要讲述了以下内容: JXL及相关工具简介 如何安装JXL JXL的基本操作 创建 ...
- 导入org.apache.poi.xssf 读取excel
POI 操作 excel 用XSSF 方式时,如果不能自动导入 org.apache.poi.xssf 对应jar 包,则可以Apache 官网进行下载,自行导入. step1: 访问 http:/ ...
- Apache POI 实现对 Excel 文件读写
1. Apache POI 简介 Apache POI是Apache软件基金会的开放源码函式库. 提供API给Java应用程序对Microsoft Office格式档案读和写的功能. 老外起名字总是很 ...
随机推荐
- Python 单向队列Queue模块详解
Python 单向队列Queue模块详解 单向队列Queue,先进先出 '''A multi-producer, multi-consumer queue.''' try: import thread ...
- NYOJ-613//HDU-1176-免费馅饼,数字三角形的兄弟~~
免费馅饼 时间限制:1000 ms | 内存限制:65535 KB 难度:3 描述 都说天上不会掉馅饼,但有一天gameboy正走在回家的小径上,忽然天上掉下大把大把的馅饼.说来gameboy的人 ...
- 【BZOJ3295】动态逆序对(BIT套动态加点线段树)
题意:对于序列A,它的逆序对数定义为满足i<j,且Ai>Aj的数对(i,j)的个数. 给1到n的一个排列,按照某种顺序依次删除m个元素,你的任务是在每次删除一个元素之前统计整个序列的逆序对 ...
- 10.1——pair,map,set,multimap,multiset
map和set只允许相同的键出现一次,而multimap和multiset则允许出现多次. 1. 引言——pair类型: pair需要添加头文件utility头文件 make_pair<v1,v ...
- 12.3——类作用域,构造函数,友元,static类成员
类作用域: (1)成员函数在类外定义时,因为函数体还有形参列表都出现在成员名之后,都是在类作用域内定义,所以不用加域作用符 来引用其他的成员. (2)函数的返回值不一定需要在类的作用域中,但是若是返回 ...
- msp430入门编程42
msp430中C语言的软件工程--事件触发程序结构
- Django的form,model自定制
一.Form组件原理: django框架提供了一个form类,来处理web开发中的表单相关事项.众所周知,form最常做的是对用户输入的内容进行验证,为此django的forms类提供了全面的内容验证 ...
- React学习及实例开发(一)——开始
本文基于React v16.4.1 初学react,有理解不对的地方,欢迎批评指正^_^ 一.构建一个新项目 1.命令行运行如下命令,构建一个新的react项目 npm install -g crea ...
- ZOJ 3471 【状态压缩DP】
题意: 有n种化学物质,他们彼此反应会有一种消失并释放出能量. 给出矩阵,第i行j列代表i和j反应j消失释放的能量. 求最大释放多少能量. 思路: 状态压缩DP,我是这么想的. 利用二进制0代表该物质 ...
- json三种类型小笔记
JSON基本语法与图例 Object(对象类型)用{ }包含一系列无序的key–Value键值对表示,其中Key和Value之间用冒号分割,每个key-value之间用逗号分割. Array(数组类型 ...