惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

MongoDB | Blog
MongoDB | Blog
B
Blog RSS Feed
MyScale Blog
MyScale Blog
M
MIT News - Artificial intelligence
H
Hackread – Cybersecurity News, Data Breaches, AI and More
J
Java Code Geeks
U
Unit 42
Blog — PlanetScale
Blog — PlanetScale
L
LangChain Blog
C
Check Point Blog
WordPress大学
WordPress大学
Last Week in AI
Last Week in AI
人人都是产品经理
人人都是产品经理
T
Tailwind CSS Blog
Vercel News
Vercel News
腾讯CDC
GbyAI
GbyAI
有赞技术团队
有赞技术团队
S
SegmentFault 最新的问题
H
Help Net Security
博客园 - 三生石上(FineUI控件)
D
DataBreaches.Net
Microsoft Security Blog
Microsoft Security Blog
小众软件
小众软件

博客园 - BearRui(AK-47)

产生唯一随机码的方法分析。 URL中允许携带sessionid带来的安全隐患。 JS 实现完美include - BearRui(AK-47) - 博客园 实现if elseif else的jsp标签。 - BearRui(AK-47) 记一复杂页面的前端优化(2) - 其他优化 - BearRui(AK-47) 记一复杂页面的前端优化(1) - 不一样的延迟加载 名站技术分析 — tudou网首页下列菜单的弹出效果 LESS 让css也支持变量,运算符,include,嵌套规则等等 CSS技巧 — 不使用图片实现圆角、阴影、渐变等功能 名站技术分析 — facebook奇特的页面加载技术 了解CSS的查找匹配原理,让CSS更简洁、高效 让ajax更加友好,实时显示后台处理进度。 - BearRui(AK-47) - 博客园 [翻译] IE7,IE8 BUG导致CSS下载二次。 - BearRui(AK-47) 名站技术分析 - 浅谈tudou.com首页图片延迟加载的效果 - BearRui(AK-47) 高性能WEB开发(11) - flush让页面分块,逐步呈现 WEB高性能开发(10) - 疯狂的HTML压缩 该如何加载google-analytics(或其他第三方)的JS web高性能开发系列随笔 管理好程序中的DLL - BearRui(AK-47) - 博客园
基于模板的excel导出
BearRui(AK-47) · 2010-08-04 · via 博客园 - BearRui(AK-47)

  产品中有很多模块需要导出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,类似下面的代码:

<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列宽刚好是像素宽度。