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

博客分类:

  • 探索实践
ExcelApacheSpringMVCServlet 

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

Xml代码  
  1. <context-param>
  2. <param-name>contextConfigLocation</param-name>
  3. <param-value>classpath:org/ourpioneer/spring/*.xml,classpath:org/ourpioneer/spring/*/*.xml</param-value>
  4. </context-param>
  5. <listener>
  6. <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
  7. </listener>

其次配置一个字符过滤器,使用Spring提供的就好,这样就不用过多考虑字符编码的问题了:

Xml代码  
  1. <filter>
  2. <filter-name>EncodingFilter</filter-name>
  3. <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
  4. <init-param>
  5. <param-name>encoding</param-name>
  6. <param-value>UTF-8</param-value>
  7. </init-param>
  8. <init-param>
  9. <param-name>forceEncoding</param-name>
  10. <param-value>true</param-value>
  11. </init-param>
  12. </filter>
  13. <filter-mapping>
  14. <filter-name>EncodingFilter</filter-name>
  15. <url-pattern>/*</url-pattern>
  16. </filter-mapping>

最后是Spring MVC的ServletDispatcher配置了:

Xml代码  
  1. <servlet>
  2. <servlet-name>board</servlet-name>
  3. <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
  4. <init-param>
  5. <param-name>contextConfigLocation</param-name>
  6. <param-value>/WEB-INF/Dispatcher-Servlet.xml</param-value>
  7. </init-param>
  8. </servlet>
  9. <servlet-mapping>
  10. <servlet-name>board</servlet-name>
  11. <url-pattern>*.do</url-pattern>
  12. </servlet-mapping>

我们配置了一个初始化文件,在Servlet加载时会加载这个配置文件,并使用*.do风格的映射地址。在这个初始配置文件中,主要配置了映射和拦截器等信息。内容如下:

Xml代码  
  1. <!-- 扩展命名拦截器 -->
  2. <bean id="extensionInterceptor"
  3. class="org.ourpioneer.excel.web.interceptor.ExtensionInterceptor"></bean>
  4. <!-- 控制器映射 -->
  5. <bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
  6. <property name="interceptors">
  7. <list>
  8. <ref bean="extensionInterceptor" />
  9. </list>
  10. </property>
  11. <property name="mappings">
  12. <props>
  13. <prop key="/excel.do">ExcelController</prop>
  14. </props>
  15. </property>
  16. </bean>

其中扩展名拦截器是对生成Excel文件后的扩展名进行处理的,这个后面会说,下面就是配置映射,这里我们只有一个测试,那么就写一个映射即可,最后使用这个地址来测试,配置好映射信息后,那么就要配置其中的每个映射,那么来看看ExcelController的配置:

Xml代码  
  1. <bean id="ExcelController" class="org.ourpioneer.excel.web.controller.ExcelController">
  2. <property name="reportService" ref="reportService" />
  3. <property name="reportView" ref="reportView" />
  4. lt;/bean>

这个也很简单,注入两个属性,一个service和一个view。为什么要用view,因为Spring MVC已经和POI进行了整合,这两个bean分别配置一下即可,这里不再说明了。详见附件中的完整源码。下面来看看控制器:

Java代码  
  1. package org.ourpioneer.excel.web.controller;
  2. import java.util.HashMap;
  3. import java.util.List;
  4. import javax.servlet.http.HttpServletRequest;
  5. import javax.servlet.http.HttpServletResponse;
  6. import org.ourpioneer.excel.bean.CruiseServiceLocation;
  7. import org.ourpioneer.excel.service.ReportService;
  8. import org.ourpioneer.excel.web.views.ReportView;
  9. import org.springframework.web.servlet.ModelAndView;
  10. import org.springframework.web.servlet.mvc.AbstractController;
  11. /**
  12. * Excel处理控制器
  13. *
  14. * @author Nanlei
  15. *
  16. */
  17. public class ExcelController extends AbstractController {
  18. private ReportView reportView;
  19. private ReportService reportService;
  20. public void setReportView(ReportView reportView) {
  21. this.reportView = reportView;
  22. }
  23. public void setReportService(ReportService reportService) {
  24. this.reportService = reportService;
  25. }
  26. @Override
  27. protected ModelAndView handleRequestInternal(HttpServletRequest request,
  28. HttpServletResponse response) throws Exception {
  29. HashMap model = new HashMap();
  30. List<CruiseServiceLocation> cslList = reportService
  31. .getCruiseLocationList();
  32. model.put("cruiseServiceLocationList", cslList);
  33. return new ModelAndView(reportView, model);
  34. }
  35. }

控制器扩展了AbstractController,覆盖了handleRequestInternal方法,这样就可以编写我们自定义的处理代码了。类开始是对service和view的注入,业务代码中从Service中获取了数据,然后放入model中,这个model是一个HashMap,也是Spring MVC中传递数据的纽带,使用方便。就像Struts2中的值栈一样,不过这个是显式使用,而值栈更像是隐式存在的数据桥梁。那么来看看Service:

Java代码  
  1. package org.ourpioneer.excel.service;
  2. import java.util.Arrays;
  3. import java.util.List;
  4. import org.ourpioneer.excel.bean.CruiseServiceLocation;
  5. /**
  6. * 报表数据业务类
  7. *
  8. * @author Nanlei
  9. *
  10. */
  11. public class ReportService {
  12. /**
  13. * 获取数据
  14. *
  15. * @return
  16. */
  17. public List<CruiseServiceLocation> getCruiseLocationList() {
  18. CruiseServiceLocation csl[] = new CruiseServiceLocation[21];
  19. csl[0] = new CruiseServiceLocation("T001", "北京市", "北京总部", "bj", "清华大学",
  20. 20);
  21. ...
  22. csl[20] = new CruiseServiceLocation("", "", "", "", "", 0);// 合并算法捕捉最后一行有问题,增补一行无效数据,计算时去除
  23. return Arrays.asList(csl);
  24. }
  25. }

这是很简单的类了,数据是我们准备好的,实际应用中就可以操作数据库了,这都没是由什么难度。下面来看一下展示Excel的View:

Java代码  
  1. package org.ourpioneer.excel.web.views;
  2. /**
  3. * 报表的Excel视图
  4. *
  5. * @author Nanlei
  6. *
  7. */
  8. public class ReportView extends AbstractExcelView {
  9. @Override
  10. protected void buildExcelDocument(Map<String, Object> model,
  11. HSSFWorkbook workbook, HttpServletRequest request,
  12. HttpServletResponse response) throws Exception {
  13. // 从model中获取数据对象
  14. List<CruiseServiceLocation> cruiseServiceLocationList = (List<CruiseServiceLocation>) model
  15. .get("cruiseServiceLocationList");
  16. }
  17. }

中间的处理代码不贴出了,这和以前的都是一样的。主要来看这个视图的写法,因为要生成Excel,那么就扩展AbstractExcelView,覆盖其中的buildExcelDocument方法,它为我们提供了存储数据的model,创建Excel的POI API,还有请求和响应对象,这都是很熟悉的内容了。首先是从model对象中取出我们放置的数据列表,下面是用POI来制作报表,之前已经写过,都是一模一样的代码,就不贴出了。 
    至此,配置结束,就剩下一个问题了,触发该请求后,数据填充完毕要展示给用户看,可此时还没有配置文件类型的信息,要给用户合理的反馈,那么就需要对处理后的结果进行最后的处理,这就是前面提到的拦截器。

Java代码  
  1. package org.ourpioneer.excel.web.interceptor;
  2. import java.net.URLEncoder;
  3. import java.text.SimpleDateFormat;
  4. import java.util.Date;
  5. import java.util.Map;
  6. import javax.servlet.http.HttpServletRequest;
  7. import javax.servlet.http.HttpServletResponse;
  8. import org.apache.commons.lang.StringUtils;
  9. import org.springframework.web.servlet.ModelAndView;
  10. import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;
  11. /**
  12. * 扩展名命名处理拦截器
  13. *
  14. * @author Nanlei
  15. *
  16. */
  17. public class ExtensionInterceptor extends HandlerInterceptorAdapter {
  18. /**
  19. * 用在流程处理之后
  20. */
  21. @Override
  22. public void postHandle(HttpServletRequest request,
  23. HttpServletResponse response, Object handler,
  24. ModelAndView modelAndView) throws Exception {
  25. // 获取Controller过来的Model对象
  26. Map model = modelAndView.getModel();
  27. // 获取请求URI
  28. String uri = request.getRequestURI();
  29. // 生成文件的名称
  30. String exportFileName = null;
  31. if (uri.endsWith("excel.do")) {
  32. String time = new SimpleDateFormat("yyyyMMddHHmmss")
  33. .format(new Date());
  34. exportFileName = "报表" + time + ".xls";
  35. }
  36. if (StringUtils.isNotEmpty(exportFileName)) {
  37. response.setHeader("Content-Disposition", "attachment; filename="
  38. + URLEncoder.encode(exportFileName, "UTF-8"));
  39. }
  40. super.postHandle(request, response, handler, modelAndView);
  41. }
  42. }

Spring的拦截器也相当简练,看看这个方法名就知道这是在流程处理结束之后的拦截器,而流程处理之前可以不配置,也就是拦截器可以配置成前后不同的处理方法,同时允许链接拦截器。它不像Struts2的拦截器,处理前通过1,2,3,处理后再通过3,2,1要走两次相同内容。更为高效。 
    在这里,我们可以拿到model对象从其中取出一些控制器传递过来的参数,当然这是根据需要使用的,之后获取到请求uri,来处理这个uri,是excel.do结尾的请求,我们要作为附件下载来体现,那么就要重新命名,然后设置响应对象,这也就是一般下载流程的最后一个步骤,很简单。 
    写完代码,在Maven中配置项目 
 
    这部分的介绍就全部结束了。

  • excel.rar (30.6 KB)
  • 下载次数: 308
  • 查看图片附件
@原文引入:http://sarin.iteye.com/blog/859163

转载于:https://www.cnblogs.com/meimao5211/p/3239581.html

Apache POI组件操作Excel,制作报表(四)相关推荐

  1. 软件测试|Python操作Excel制作报表,不要太方便

    前言 今天我们介绍的是Python操作Excel制作报表,我们需要用到的库是openpyxl,我们主要使用的功能有下列几个功能 插入与查询数据 分类数据统计 数据可视化 字体颜色修改 基本操作 表格初 ...

  2. 用Python自动化操作Excel制作报表,真的是太方便啦!!!

    今天小编来介绍一下如何用Python来操作Excel文件,当中需要用到的模块叫做openpyxl,其中我们会涉及到一些基本常规的操作,例如有 插入与查询数据 分类统计数据 数据的可视化 字体颜色的更改 ...

  3. 用 Python 自动化操作 Excel 制作报表,真的是太方便啦!!!

    作者 | 俊欣 来源 | 关于数据分析与可视化 今天小编来介绍一下如何用Python来操作Excel文件,当中需要用到的模块叫做openpyxl,其中我们会涉及到一些基本常规的操作,例如有 插入与查询 ...

  4. 使用JXL组件操作Excel和导出文件

    使用JXL组件操作Excel和导出文件 原文链接:http://tianweili.github.io/blog/2015/01/29/use-jxl-produce-excel/ 前言:这段时间参与 ...

  5. Apache POI和EasyExcel 第二集:Apache POI的基本Excel写入(分为03版的xls和07版的xlsx)

    Apache POI和EasyExcel 第二集:Apache POI的基本Excel写入(分为03版的xls和07版的xlsx) 一.导入依赖 老样子使用Maven,比较方便,一个dependenc ...

  6. 狂神——通过POI来操作Excel

    1.首先execl有两个版本,分别是03版和07版. 通过鼠标右键即可观看(以xls,xlsx结尾) 2.需要引入的依赖 <!--03--><dependency><gr ...

  7. JAVA操作excel生成报表

    JAVA操作excel生成报表 列标题根据选择的项目动态生成 1 模板文件 2 返回结果集 需要在结果集中对返回的数据进行处理,需要返回所在行数据以及所处项目,从而确定所处单元格的位置. 3将报表统计 ...

  8. 【狂神说Java】poi的操作excel

    目录 一.狂神视频地址 二.基本思想 xls和xlsx的区别 三.Maven配置 四.相关代码 1.写操作 1.1Java操作xls文件 1.2Java操作xlsx文件 1.3写大量数据对比与优化 2 ...

  9. 基于POI框架操作Excel文件

    前言 Apache POI是Apache软件基金会的开放源码函式库,POI提供API给Java程序对Microsoft Office格式档案读和写的功能.POI的结构如下: HSSF - 提供读写Mi ...

最新文章

  1. 【C++】【三】单向链表
  2. WPF的消息机制(二)- WPF内部的5个窗口之隐藏消息窗口
  3. 怎么看懂别人写的单片机项目代码?
  4. 算法-----两数之和 II - 输入有序数组
  5. 以太坊Oracle系列一: Human Oracle
  6. 错误ORA-04091: table is mutating, trigger/function may not see it的原因以及解决办法
  7. 函数的嵌套,名称空间和作用域
  8. ES6——扩展运算符/三点运算符(...)
  9. jlabel字怎么变化_不懂书法“疏密”变化,你的造诣只能是初学者
  10. 3D数学基础 简要归纳
  11. 资料分析-增长率 比重 平均数 倍数等
  12. 神经网络物联网未来发展趋势怎么样
  13. jensen不等式(jensen不等式对于凹函数)
  14. 这16个数据可视化案例,惊艳了全球数据行业
  15. 同比增长率,环比增长速度、环比发展速度
  16. Java 多线程设计模式
  17. 【Unity】U3D ARPG游戏制作实例(一)EasyTouch5完整示例
  18. Win7: Logoff被用户Lock的屏幕
  19. 关于windows XP下北洋BTP-2200E打印设置问题
  20. 知乎里怎么看个人简介_怎么写简历中的自我评价?

热门文章

  1. 小白学习使用gitee问题产生汇总(持续更新)
  2. java 类继承命名_Java 语言的类间的继承关系是( )。_学小易找答案
  3. 输入6个学生的5门成绩c语言数组,C语言数组指针的小例子.pdf
  4. 怎么用Linux命令查看BIOS信息,LINUX下怎样获取主板的信息用到什么命令
  5. 3d 多相机分流_徕卡电影四摄的华为Mate30 Pro到底有多猛?开箱了解一下!
  6. 4-3 面向复用的设计模式
  7. Numpy Cookbook by Eric
  8. 几道比较难的SQL题
  9. 遗传算法求解旅行商问题
  10. LVGL(2)Visual Studio模拟器使用