一、背景:某工厂需要查看指定年度的设备维护计划,一般需要把全年72个周,每个周做哪些维护工作排班排出以及工时统计出来,在正式生成维护工单之前,需要先确认下。维护计划大概是某一周要执行哪些维护项,大概长下面这个样子,根据客户提供的资料提取Excel模板。

由于需要展示全年大约72周的排班信息(导致Excel列数较多),且维护项大约有几百项(导致Excel行数较多),综合意见,PC端提供在线预览(实现简单确认)和下载两个功能,来满足客户正式生成设备维护工单前,设备维护计划确认工作。

二、思路:一般来说poi可以提供诸如excel、word等大部分功能,但由于较低层,且实现表头固定时,编码较多。因此本次采用EasyPoi的模板功能,即表头信息放置到模板中,通过程序提供业务数据然后通过EasyPoi渲染模板得到最后结果,本次开发重点利用EasyPoi以下功能:

  1. Excel模板功能,实现利用业务数据渲染EXCEL模板功能
  2. Excel的HTML预览,实现在线预览功能
  3. 提供easypoi view,提供更加符合SpringMVC风格的实现,实现EXCEL下载功能。

本次使用的Excel模具如下,可以看到需要准备的数据有四处:维护项列表、每周的起止时间、某一维护项在哪一周执行、某周工时累计。此四种数据都需要编写业务逻辑代码获取业务数据,不再本次展示当中

三、下面开始动手实战:

1、在pom.xml文件中引入如下配置,由于本次没有用到注解或其它功能,只需要引入下面两个依赖,依赖版本请结合你项目中spring版本进行选择:

<dependency><groupId>cn.afterturn</groupId><artifactId>easypoi-base</artifactId><version>3.3.0</version>
</dependency>
<dependency><groupId>cn.afterturn</groupId><artifactId>easypoi-web</artifactId><version>3.3.0</version>
</dependency>

2、在配置spring元素扫描时,追加对cn.afterturn.easypoi.view包的扫描。具体需要找到项目中context:component-scan 元素所在的配置文件,将cn.afterturn.easypoi.view追加到base-package值当中,注意:多个包之间用英文逗号分隔。

<context:component-scan base-package="cn.afterturn.easypoi.view"/>

3、编写RequestMapping方法,具体思路参见方法注释,通过path传递是在线预览还是下载,根据不同的action执行不同的处理。获取设备维护计划预览模板数据实现由于涉及业务就不做展示了,具体参照EasyPoi的模板部分说明即可:

/*** * @param action 动作,onlinePreview(预览) download(下载)* @param yearly 年份* @param modelMap easypoi需要* @param request* @param response* @throws IOException*/
@RequestMapping("/{action}")
public void confirmMaintenancePlan(@PathVariable("action") String action, @RequestParam("yearly") String yearly, ModelMap modelMap, HttpServletRequest request, HttpServletResponse response) throws IOException {// 一般Excel模板统一放置到某文件夹中,该文件夹路径通过配置参数统一获取TemplateExportParams templateExportParams = new TemplateExportParams(configService.getPoiTemplatePath() + "devMaintenancePlanPreviewTemplate.xlsx");templateExportParams.setColForEach(true);// 获取设备维护计划预览模板数据Map<String, Object> devMaintenancePlanPreviewTemplateData = deviceMaintenanceManager.generateDevMaintenancePlanPreviewTemplateData(yearly);if ("onlinePreview".equals(action)) {// 在线预览Workbook workbook = ExcelExportUtil.exportExcel(templateExportParams, devMaintenancePlanPreviewTemplateData);ExcelToHtmlParams excelToHtmlParams = new ExcelToHtmlParams(workbook);response.setHeader("Content-Type", "text/html;charset=utf-8");response.getOutputStream().write(ExcelXorHtmlUtil.excelToHtml(excelToHtmlParams).getBytes());} else {// 下载// 设置下载到本地的Excel文件名modelMap.put(TemplateExcelConstants.FILE_NAME, yearly + "年度设备维护计划");// 设置模板导出参数modelMap.put(TemplateExcelConstants.PARAMS, templateExportParams);// 设置模板需要的业务数据modelMap.put(TemplateExcelConstants.MAP_DATA, devMaintenancePlanPreviewTemplateData);// 固定格式PoiBaseView.render(modelMap, request, response, TemplateExcelConstants.EASYPOI_TEMPLATE_EXCEL_VIEW);}
}

4、前端调用示例代码如下,一般来说预览需要在新的tab页预览,下载的话在当前页执行就行,示例代码只保留调用Controller的逻辑,其它结合自己业务处理即可:

window.open('../devplanmain/' + vm.overviewParam.action + '?yearly=' + yearNum, vm.overviewParam.action == 'onlinePreview' ? '_blank' : '');

5、预览结果在文章开头处已做展示,下面直接展示下载的Excel部分内容:

注意:

  1. 实现过程中建议按照Excel模板渲染、Excel预览、Excel下载三步,一步步进行,不要混为一谈,一旦发生问题会发蒙。分开走的好处是缩小问题范围便于解决。
  2. 不要把Excel模板渲染看的多么高端,它只是把服务器端已处理完毕的数据,按照设定显示到对应位置,比如我上面的黑色圆点,这些圆点都是在服务端计算出来,然后已字符串的形式写好的,渲染只是原样输出。
  3. 不建议在Excel模板中使用Excel函数。比如上述的工时累计有人可能说利用公式结合生产/非生产*人次是可以计算出来的,但实际是在服务端计算好,拿到页面直接渲染的,并不是利用函数计算的。再比如上面的每周的起止时间以及每周都有哪些维护需要做,都是在服务器端就已经完成标识的。

以上,完了!

基于SpringMVC+EasyPoi,采用Excel模板方式实现Excel在线预览和导出(2021版)相关推荐

  1. html怎么转换到百度,类似百度文库在线预览文档flash版(支持word、excel、ppt、pdf)+在线预览文档html版...

    类似百度文库在线预览文档flash版(支持word.excel.ppt.pdf)+在线预览文档html版 (1).将文档转换为html,只支持支持office文档 (2).将文档转换为flash,实现 ...

  2. ❤️强烈推荐!Word、Excel、PPT、PDF在线预览解决方案

    大家好,我是锋哥: 平时大伙开发项目的时候,经常遇到业务需求Word.Excel.PPT.PDF在线预览功能: 市面上这方面的解决方案也有一些,不做过多评价.今天主要推荐的是一个特定提前下的永久免费解 ...

  3. [Asp.net]常见word,excel,ppt,pdf在线预览方案,有图有真相,总有一款适合你!...

    [Asp.net]常见word,excel,ppt,pdf在线预览方案,有图有真相,总有一款适合你! 引言 之前项目需要,查找了office文档在线预览的解决方案,顺便记录一下,方便以后查询. 方案一 ...

  4. nopi word to html,C# 基于NPOI+Office COM组件 实现20行代码在线预览文档(word,excel,pdf,txt,png)...

    由于项目需要,需要一个在线预览office的功能,小编一开始使用的是微软提供的方法,简单快捷,但是不符合小编开发需求, 就另外用了:将文件转换成html文件然后预览html文件的方法.对微软提供的方法 ...

  5. 文档在线预览(四)使用js前端实现word、excel、pdf、ppt 在线预览

    文章目录 实现方案 一.docx文件实现前端预览 1.docx-preview 2.Mammoth 二.PDF文件实现前端预览 1.pdf.js 2.pdfobject.js 3.vue-pdf 4. ...

  6. word、excel、ppt 办公文件 在线预览

    如果想要免费的,可以用 openoffice,实现原理就是: 通过第三方工具openoffice,将word.excel.ppt.txt等文件转换为pdf文件流:当然如果装了Adobe Reader ...

  7. 快速实现word、excel、ppt、txt等办公文件在线预览功能(Java版)

    点击关注公众号,实用技术文章及时了解 来源:blog.csdn.net/weixin_40986713/ article/details/109527294 java实现办公文件在线预览功能是一个大家 ...

  8. 【aspose】 word/excel转pdf,实现在线预览文件功能

    项目场景: 需求描述:上传附件后,可实现在线预览,这里就会存在一个问题,很多附件的类型是没法在线预览的,点击就会下载.除pdf/jpg/jpeg等,于是技术方案定,将word/excel等类型的文件转 ...

  9. asp.net实现word、excel、ppt、pdf在线预览

    引言 之前项目需要,查找了office文档在线预览的解决方案,顺便记录一下,方便以后查询. 方案一 直接在浏览器中打开Office文档在页面上的链接.会弹出如下窗口: 优点:主流浏览器都支持. 缺点: ...

最新文章

  1. python django框架 比php_ThinkPHP, Django这两个框架孰优孰略,忽略语言本身?
  2. qt android oci数据库,QT mysql SQLite 数据库支持
  3. 【C++】 C++虚函数表详细分析(上)
  4. Linux 关闭与重启
  5. Hadoop之Hadoop数据压缩
  6. 空指针异常NullPointerException解决
  7. uilabel自动换行
  8. python读取word内容存入数据库、并求simhash_介绍一个基于simhash作海量文章排重的库:simhashpy...
  9. oracle查询表的意思,Oracle表的查询(一)
  10. 孙鑫MFC笔记之十二--网络编程
  11. winform(C#)拖拽实现获得文件路径
  12. GRAPH ATTENTION NETWORKS 学习翻译
  13. IdentityServer4之Client Credentials(客户端凭据许可)
  14. Arcgis空间自相关Moran I(莫兰指数)
  15. [论文评析]人体脉搏波速与血压之间关系探索新突破
  16. oracle创建用户ORA-01045:user lacks CREATE SESSION privilege;logon denied..的问题
  17. serverlet增删改查项目代码
  18. windows无法连接到某个wifi_Win7系统提示Windows无法连接到无线网络如何解决?
  19. matlab画运动轨迹,Matlab画小球沿轨迹运动
  20. 大拇指全程报导苹果发布会2014.9.9

热门文章

  1. CSS链接四种状态注意顺序、UI伪类选择器的顺序
  2. HTML中的节点及其作用
  3. [转]JavaScript事件(Event)
  4. 我在项目中用到的vue FullCalendar的内置函数以及配置项
  5. checkbox全选和反选功能
  6. JS-元素的样式操作-文本内容-位置
  7. JavaScript学习笔记(二)--流程控制语句
  8. wangeditor 不识别html_前端知识(一)认识HTML
  9. C++环境的配置( windows)
  10. zabbix 自定义监控项 获取nginx监控状态