日期:2014-05-16  浏览次数:21039 次

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的配置:

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;
	}
	@Over