`
sarin
  • 浏览: 1758044 次
  • 性别: Icon_minigender_1
  • 来自: 大连
博客专栏
E3b14d1f-4cc5-37dd-b820-b6af951740bc
Spring数据库访问系列...
浏览量:173792
C2083dc5-6474-39e2-993e-263652d27795
Android学习笔记
浏览量:368255
5f40a095-b33c-3e8e-8891-606fcf3b8d27
iBatis开发详解
浏览量:189386
B272a31d-e7bd-3eff-8cc4-c0624ee75fee
Objective-C学习...
浏览量:99957
社区版块
存档分类
最新评论

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.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中配置项目

    这部分的介绍就全部结束了。
  • 大小: 81.9 KB
  • 大小: 55.1 KB
  • 大小: 60.7 KB
21
1
分享到:
评论
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;

因为这里是在介绍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;

因为这里是在介绍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;

因为这里是在介绍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;
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  
一直在追着看
坚决要顶这样的帖子
支持博主

相关推荐

    Apache POI组件操作Excel,制作报表(三)

    在本篇博文中,我们将聚焦于如何使用Apache POI组件来操作Excel,制作报表。这一部分是系列教程的第三部分,前两部分可能涉及了基础的读写操作和数据处理,而本部分则会深入到更复杂的报表制作技巧。 首先,Apache ...

    Apache poi 操作 excel 文件压缩包

    在实际应用中,Apache POI 往往用于数据分析、报表生成、数据导入导出等场景,尤其在需要在服务器端生成或处理Excel文件时,它是Java开发者的重要工具。通过熟练掌握Apache POI,你可以提高Java应用程序与Excel交互...

    应用POI组件读写Excel文档

    本文将深入探讨如何使用POI组件来处理Excel文档,包括创建、填充数据、读取信息以及在实际应用中的使用场景。 1. **POI组件介绍** Apache POI是一个开源项目,最初由Glen Stampoultzis创建,后来成为Apache软件...

    Apache Poi Excel导出

    这篇博客“Apache Poi Excel导出”可能详细介绍了如何使用Apache POI库来生成Excel文件,特别适用于数据导出或报表生成等场景。 Apache POI API 包含多个关键组件,如HSSF(Horizontally Stored Format)用于处理旧...

    poi3.0.1操作excel

    Apache POI 是一个开源项目,专门用于处理Microsoft Office格式的文件,如Excel、Word和PowerPoint。在本案例中,我们将重点关注"poi3.0.1"版本如何操作Excel文件。这个版本的POI库提供了Java程序员处理Excel文档的...

    java 使用poi组件处理 excel word

    本文将深入探讨如何使用POI组件来处理Excel和Word文档,以及如何通过模板动态生成Excel表格。 一、Apache POI简介 Apache POI 是一个开源项目,它的主要功能是读取和写入Microsoft Office格式的文件,如.XLS(Excel...

    POI报表导出excel

    首先,我们需要了解Apache POI的核心组件:HSSFWorkbook(用于处理.xls文件)和XSSFWorkbook(用于处理.xlsx文件)。在这个场景中,由于是导出Excel文件,我们可能会用到HSSFWorkbook,因为3.6版本还不支持.xlsx格式...

    使用java Apache poi 根据word模板生成word报表.rar

    Apache POI是Java社区开发的一个库,主要用于读写Microsoft Office格式的文件,如Word(.doc/.docx)、Excel(.xls/.xlsx)等。在本项目中,“使用java Apache poi 根据word模板生成word报表.rar”是一个压缩包,...

    poi-3.8组件

    1. **组件结构**:Apache POI包含多个子项目,如HSSF(Horrible Spreadsheet Format)用于处理Excel的BIFF格式(.xls),XSSF(eXtensible Spreadsheet Format)用于处理Excel的XML格式(.xlsx),HWPF(Horrible ...

    poi-3.9 apache-poi-3.9 最新稳定版本

    5. 图表:Apache POI允许开发者创建和修改Excel中的图表,包括线图、柱状图、饼图等,通过`XSSFChart`接口和相关的图表组件类实现。 6. 公式处理:`HSSFFormulaEvaluator`和`XSSFFormulaEvaluator`类负责计算单元格...

    poi制作报表

    【poi制作报表】是关于Java开发中利用Apache POI库创建和操作Microsoft Excel报表的技术介绍。Apache POI是一个开源项目,主要目标是处理OLE2对象,尤其是与Microsoft Office相关的文件格式,如Excel(HSSF接口)和...

    Apache POI教程以及jar包

    Apache POI是Java社区中的一个流行库,它允许开发人员在不依赖Microsoft Office的情况下,用Java代码来操作和生成Excel(XLS和XLSX)、Word(DOC和DOCX)以及PowerPoint(PPT和PPTX)文档。POI项目始于2002年,旨在...

    poi操作excel表格导入和导出

    在“poi操作excel表格导入和导出”这个主题中,我们将深入探讨如何利用Apache POI进行Excel数据的处理,包括导入和导出。 一、Apache POI简介 Apache POI是一个开源项目,它提供了API来处理Microsoft Office格式的...

    Apache poi框架jar包

    Apache POI 是一个开源项目,由 Apache 软件基金会维护,主要用于处理 Microsoft Office 格式的文件,如 Word(.doc/.docx)、Excel(.xls/.xlsx)、PowerPoint(.ppt/.pptx)等。这个框架使得 Java 开发者能够方便...

    java excel 组件 poi3.1

    Java Excel组件Apache POI是一个强大的库,专门用于处理Microsoft Office格式的文件,特别是Excel工作簿(.xls)和较新的工作簿格式(.xlsx)。在标题提到的"poi3.1"版本中,该库已经相当成熟,为开发人员提供了丰富...

    poi操作excel全部jar包

    总的来说,Apache POI 是Java开发中处理Excel文件的强大工具,无论是在数据分析、报表生成还是自动化任务中,都能发挥重要作用。正确理解和使用Apache POI 的jar包,可以帮助开发者高效地进行Excel文件的处理工作。

    Apache Poi相关Jar包

    Apache POI的核心组件包括HSSF(Horrible Spreadsheet Format)和XSSF(XML Spreadsheet Format),分别用于处理老版本的Excel(.xls)和新版本的Excel(.xlsx)。此外,还有一组用于处理Word(HWPF和XWPF)和...

    Apache POI教程

    Apache POI 是一个Java库,专门用于操作Microsoft Office文件,特别是Excel、Word和PowerPoint文档。这个库由Apache软件基金会开发,它提供了丰富的API,使Java程序员能够创建、修改和展示MS Office文件。Apache POI...

    Apache Poi(java读写excel文件的api)

    Apache POI 是一个开源项目,由Apache软件基金会维护,它为Java开发者提供了一套API,使得他们能够处理Microsoft ...通过深入学习和实践,你可以利用Apache POI实现各种基于Excel的应用程序,如数据分析、报表生成等。

Global site tag (gtag.js) - Google Analytics