日期:2014-05-17  浏览次数:21009 次

Apache POI组件操作Excel,制作报表(四)
    上一篇我们介绍了如何制作复杂报表的分析和设计,本篇结合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配置文件的路径:
	<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.ou