基于模板的excel导出

本文涉及的产品
全局流量管理 GTM,标准版 1个月
云解析 DNS,旗舰版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
简介:

产品中有很多模块需要导出excel功能,导出excel几乎都是把页面已经显示出来的数据列表导出为excel。但后台使用poi生成excel却要1个单元格1个单元格的去编写。每个模块都需要单独写导出excel的代码,导致代码里充斥了createRow,createCell,setCellValue的代码。但这不是要命的,要命的是当前台数据列表格式变了的时候,后台生成excel代码的修改非常麻烦,特别是当产品经理要求在excel中也要保留WEB样式的时候(背景色,字体色,宽度),就只能oh shit!

 

HTML直接另存为excel

  最开始想的解决办法是直接把数据列表的html代码另存为xls后缀的excel文件,这样是最方便,也最容易维护的方式。   可惜因为只是改了文件的后缀,所以当用excel打开的时候就会弹出"您尝试打开的文件格式与文件扩展名指定格式不一致。"的提示。最终放弃了该方法。  

 

基于模板引擎的excel数据导出
在一次跟朋友szyicol(http://www.cnblogs.com/szyicol/)聊天中,聊起该问题,他也碰见了类似的问题,目前也是每个模块都写单独的导出excel代码。但他说想使用xls模板+xml映射文件(类似与hibernate的映射文件)来做通用导出excel。经他提醒,我最终选择使用模板引擎生成html代码,然后把html代码通过poi生成为excel。这样开发人员以后导出excel只需要编写html模板就行。

 

选择html的原因

    选择通过html代码(而不是xml或者其他)生成excel的原因有下:

     1、html对于开发人员来可读性最强,可以说看到这段html代码就知道生成的excel会是什么样子。
   2、因导出的就是前台的数据列表,所以html代码几乎可以直接从前台页面中copy到模板中就可以了,维护也比较方便,不需要额外比较多的工作量。

 

HTML格式       

  为了易解析和增加可读性,要求生成的html代码只有table tr td标签,而且只能有1个table,类似下面的代码:

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
< table >
     < tr >
         < td  colspan="7" align="center">项目名称</ td >
     </ tr >
     < tr >
         < td  colspan="7" align="center">(导出时间:2010-08-01)</ td >
     </ tr >
     < tr  align="center" bgcolor="#9AB0AD">
         < td  width="150">记账人</ td >
         < td  width="100">日期</ td >
         < td  width="80">金额</ td >
     </ tr >
     < tr  bgcolor="#ABCDC1" color="#14645E">
         < td  color="#00000">x1</ td >
         < td >2010-08-01</ td >
         < td >100</ td >
     </ tr >
   < tr  bgcolor="#ABCDC1" color="#14645E">
         < td  color="#00000">x1</ td >
         < td >2010-08-01</ td >
         < td >100</ td >
     </ tr >
  </ table >

 

 

模板引擎   

  要根据一些数据生成上面的html代码,当然需要使用模板引擎,当然选择什么模板引擎就看自己了,我们选择了freemarker

 

html代码转excel
   对于html代码的解析,因为我们要求html代码只能有1个table,可以看出我们的html代码也是符合xml格式的,所以我们就使用xml库解析html代码。
通过xml解析循环所有tr,td标签,并调用对应的createRow,createCell就能生成excel了,这里不贴出所有代码,有兴趣的自己研究下,只说说poi的几个问题。

    1、合并单元格    

    当html中出现colspan的时候,就需要用到合并单元格,HSSFSheet.addMergedRegion 支持合并单元格    

   

  2、设置颜色    

    poi设置颜色比较麻烦,不能直接设置自定义的颜色值,默认只能使用内置的一些颜色。如果要使用自定义的颜色,需要先把内置的一些颜色替换成自定义颜色。建议先选出一些不常用的poi内置颜色(我们选了15个,应该够用了),当发现有自定义颜色的时候,就循环进行替换这些不常用的颜色。    

     具体可看:http://poi.apache.org/spreadsheet/quick-guide.html#CustomColors    

   

  3、设置宽度    

    这个在poi文档中没看到很详细的介绍,因为 HSSFSheet.setColumnWidth 方法,使用的并不是像素单位,也不知道是什么单位。经过尝试发现把像素宽度*40,导出的excel列宽刚好是像素宽度。  












本文转自BearRui(AK-47)博客园博客,原文链接:  http://www.cnblogs.com/BearsTaR/archive/2010/08/04/freemarker_excel_export.html  ,如需转载请自行联系原作者




相关文章
|
2月前
|
关系型数据库 MySQL Shell
不通过navicat工具怎么把查询数据导出到excel表中
不通过navicat工具怎么把查询数据导出到excel表中
36 0
|
18天前
|
SQL C# 数据库
EPPlus库的安装和使用 C# 中 Excel的导入和导出
本文介绍了如何使用EPPlus库在C#中实现Excel的导入和导出功能。首先,通过NuGet包管理器安装EPPlus库,然后提供了将DataGridView数据导出到Excel的步骤和代码示例,包括将DataGridView转换为DataTable和使用EPPlus将DataTable导出为Excel文件。接着,介绍了如何将Excel数据导入到数据库中,包括读取Excel文件、解析数据、执行SQL插入操作。
EPPlus库的安装和使用 C# 中 Excel的导入和导出
|
2天前
|
前端开发 JavaScript
💥【exceljs】纯前端如何实现Excel导出下载和上传解析?
本文介绍了用于处理Excel文件的库——ExcelJS,相较于SheetJS,ExcelJS支持更高级的样式自定义且易于使用。表格对比显示,ExcelJS在样式设置、内存效率及流式操作方面更具优势。主要适用于Node.js环境,也支持浏览器端使用。文中详细展示了如何利用ExcelJS实现前端的Excel导出下载和上传解析功能,并提供了示例代码。此外,还提供了在线调试的仓库链接和运行命令,方便读者实践。
|
27天前
|
存储 Java
java的Excel导出,数组与业务字典匹配并去掉最后一个逗号
java的Excel导出,数组与业务字典匹配并去掉最后一个逗号
38 2
|
2月前
|
前端开发 JavaScript
使用Vue+xlsx+xlsx-style实现导出自定义样式的Excel文件
本文介绍了在Vue项目中使用`xlsx`和`xlsx-style`(或`xlsx-style-vite`)库实现导出具有自定义样式的Excel文件的方法,并提供了详细的示例代码和操作效果截图。
433 1
使用Vue+xlsx+xlsx-style实现导出自定义样式的Excel文件
|
2月前
|
前端开发 Python
使用Python+openpyxl实现导出自定义样式的Excel文件
本文介绍了如何使用Python的openpyxl库导出具有自定义样式的Excel文件,包括设置字体、对齐方式、行列宽高、边框和填充等样式,并提供了完整的示例代码和运行效果截图。
61 1
使用Python+openpyxl实现导出自定义样式的Excel文件
|
2月前
|
SQL 分布式计算 DataWorks
DataWorks产品使用合集之如何直接导出excel文件
DataWorks作为一站式的数据开发与治理平台,提供了从数据采集、清洗、开发、调度、服务化、质量监控到安全管理的全套解决方案,帮助企业构建高效、规范、安全的大数据处理体系。以下是对DataWorks产品使用合集的概述,涵盖数据处理的各个环节。
|
2月前
|
JavaScript 前端开发 easyexcel
基于SpringBoot + EasyExcel + Vue + Blob实现导出Excel文件的前后端完整过程
本文展示了基于SpringBoot + EasyExcel + Vue + Blob实现导出Excel文件的完整过程,包括后端使用EasyExcel生成Excel文件流,前端通过Blob对象接收并触发下载的操作步骤和代码示例。
292 0
基于SpringBoot + EasyExcel + Vue + Blob实现导出Excel文件的前后端完整过程
|
2月前
|
数据管理 数据处理 数据库
分享一个导出数据到 Excel 的解决方案
分享一个导出数据到 Excel 的解决方案
|
2月前
|
SQL
SQL SERVER 查询表结构,导出到Excel 生成代码用
SQL SERVER 查询表结构,导出到Excel 生成代码用
39 0