BearRui(AK-47)
花开有时,错过了一日便错过了一季,就象人生错过了相遇,就不再找寻到美丽的相聚
随笔- 39  文章- 2  评论- 1288 
博客园  首页  新随笔  联系  管理  订阅 订阅
基于模板的excel导出

  产品中有很多模块需要导出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列宽刚好是像素宽度。  

[作者]:BearRui(AK-47)
[博客]: http://www.cnblogs.com/BearsTaR/
[声明]:本博所有文章版权归作者所有(除特殊说明以外),转载请注明出处.
绿色通道:好文要顶关注我收藏该文与我联系
posted on 2010-08-04 08:45 BearRui(AK-47) 阅读(4515) 评论(48) 编辑 收藏
发表评论
1945392
 回复 引用 查看   
#1楼 2010-08-04 09:14 | minttang      
您尝试打开的文件格式与文件扩展名指定格式不一致?
完全没有注意,感觉这样是最方便的,一直在用客户也没说过什么

 回复 引用 查看   
#2楼 2010-08-04 09:15 | 不能飚车      
留个记号,这种事情工作中经常遇到
 回复 引用 查看   
#3楼 2010-08-04 09:22 | 卡恩和巴拉克粉丝      
没看到你是如何具体实现的(无代码,无截图)
 回复 引用 查看   
#4楼[楼主] 2010-08-04 09:24 | BearRui(AK-47)      
引用minttang:
您尝试打开的文件格式与文件扩展名指定格式不一致?
完全没有注意,感觉这样是最方便的,一直在用客户也没说过什么


你可以自己试试,我是用excel2007打开就会有这个问题,不知道2003有没有。

 回复 引用 查看   
#5楼[楼主] 2010-08-04 09:28 | BearRui(AK-47)      
引用卡恩和巴拉克粉丝:没看到你是如何具体实现的(无代码,无截图)


这里主要是说下我实现的思路,根据这个思路写绝对可以实现,我写的文章都是自己已经实现了才写出来的。

因之前很多文章把整个代码贴出来,感觉也不太好,毕竟没经过公司的同意。所以以后会尽量少发后端代码,前端代码还无所谓。

如果对具体的实现有疑问的话,可以随时进行交流,^_^

 回复 引用 查看   
#6楼[楼主] 2010-08-04 09:35 | BearRui(AK-47)      
@不能飚车
呵呵,确实很多地方用到excel导出。

 回复 引用 查看   
#7楼 2010-08-04 09:38 | 笨笨的记忆天堂      
不发公司代码,写个小demo啦。。无图无真相。。。^_^
 回复 引用 查看   
#8楼[楼主] 2010-08-04 09:53 | BearRui(AK-47)      
@笨笨的记忆天堂
呵呵,我写出了原理,大家看看应该就知道怎么实现了。我写这个并不是为了证明我已经实现,而只是把我实现的想法写出来与大家分享,至于大家相不相信这是真的,我不是很在乎。

不过你的建议很不错,下次再写博文的时候,有时间还是弄个demo,^_^

 回复 引用 查看   
#9楼 2010-08-04 09:55 | mmyijia.com~      
是一种思路
 回复 引用 查看   
#10楼[楼主] 2010-08-04 09:58 | BearRui(AK-47)      
引用mmyijia.com~:是一种思路


呵呵,确实是...

 回复 引用 查看   
#11楼 2010-08-04 10:08 | 囧月      
我怎么找不到路过的按钮呢。。。
 回复 引用 查看   
#12楼[楼主] 2010-08-04 10:12 | BearRui(AK-47)      
引用囧月:我怎么找不到路过的按钮呢。。。


之前做了个快捷评论的按钮,感觉做的还不错,结果变成了大家刷评论的玩具。可以看看我最高评论的文章,都是大家刷的评论。看的就晕,所以就取消了该按钮了。

 回复 引用 查看   
#13楼 2010-08-04 10:24 | 老羽      
想法不错,但是常用的EXCEL报表并不是这么简单;比如,列表,公式,汇总等。
 回复 引用 查看   
#14楼 2010-08-04 10:25 | Galactica      
我还以为啥模板呢,就简单的导个表格而已.
 回复 引用 查看   
#15楼[楼主] 2010-08-04 10:32 | BearRui(AK-47)      
引用老羽:想法不错,但是常用的EXCEL报表并不是这么简单;比如,列表,公式,汇总等。


对,确实如此,因为我们暂时不需要这些复杂的功能,如果需要这些功能,我觉的只要是POI支持的就很容易弄上去。

 回复 引用 查看   
#16楼[楼主] 2010-08-04 10:32 | BearRui(AK-47)      
@Galactica

确实简单,^_^

 回复 引用 查看   
#17楼 2010-08-04 11:05 | szyicol      
@老羽

你在windows mobile上不搞这个的吧!

 回复 引用 查看   
#18楼 2010-08-04 11:06 | szyicol      
能在博文提到我,蛮开心的,哈哈!!

 回复 引用 查看   
#19楼 2010-08-04 11:06 | 卡恩和巴拉克粉丝      
因为我只看到了 用html模板能实现到处EXCEL,至于如何实现的,根本没讲。

我不知道这个跟 通过EXCEL模板导出EXCEL有何区别

 回复 引用 查看   
#20楼[楼主] 2010-08-04 11:09 | BearRui(AK-47)      
引用szyicol:能在博文提到我,蛮开心的,哈哈!!


呵呵,以后多多交流。

 回复 引用 查看   
#21楼[楼主] 2010-08-04 11:11 | BearRui(AK-47)      
引用卡恩和巴拉克粉丝:
因为我只看到了 用html模板能实现到处EXCEL,至于如何实现的,根本没讲。

我不知道这个跟 通过EXCEL模板导出EXCEL有何区别


其实是讲了,只不过没贴代码,是用文字说的,通过xml解析循环所有tr,td标签,并调用POI对应的createRow,createCell就能生成excel了。
因为循环使用POI生成excel估计大家都会,就一句带过。在生成的过程中我碰见了3个相对有点小麻烦的地方我也单独说了。

 回复 引用 查看   
#22楼 2010-08-04 11:15 | 老羽      
其实,如果经常用到EXCEL,应该是企业级的应用系统。那么用AcitveX组件是最好的,更合理的利用客户端资源,直接在客户端填充Excel,服务端仅仅提供数据源而已。

实际上,OA中用到Office是最多的,基本都是用的ActiveX组件,比如金格的产品

 回复 引用 查看   
#23楼[楼主] 2010-08-04 11:19 | BearRui(AK-47)      
@老羽
企业级应用导出excel确实很多,而且也很复杂。但想我们这种理财,记账的网站,也有很多导出,导入excel的需求。用户需要自己备份或者导出查看数据。只是我们的excel一般不会很复杂,所以一般很少用公式之类的东西。

 回复 引用 查看   
#24楼 2010-08-04 11:26 | 老羽      
引用szyicol:
@老羽

你在windows mobile上不搞这个的吧!


服务端代码也经常写。

而且我觉得如果要做Excel模板,最好是直接编辑好Excel模板,然后再另存为(html)格式,然后在这个基础上加工,这样更好。

 回复 引用 查看   
#25楼[楼主] 2010-08-04 11:30 | BearRui(AK-47)      
引用老羽:
服务端代码也经常写。

而且我觉得如果要做Excel模板,最好是直接编辑好Excel模板,然后再另存为(html)格式,然后在这个基础上加工,这样更好。

szyicol 今天还发了1个博文给我看,这个博文就是先编辑Excel模板,然后直接根据这个Excel模板导出。我主要是觉的开发人员很熟悉html,而且可以直接从jsp中copy代码,所以就选择了直接使用html,而没有用excel的模板。不过用excel的模板应该能实现更加复杂一些的excel功能。

 回复 引用 查看   
#26楼 2010-08-04 11:39 | 老羽      

szyicol 今天还发了1个博文给我看,这个博文就是先编辑Excel模板,然后直接根据这个Excel模板导出。我主要是觉的开发人员很熟悉html,而且可以直接从jsp中copy代码,所以就选择了直接使用html,而没有用excel的模板。不过用excel的模板应该能实现更加复杂一些的excel功能。

我和yicol是老朋友,老同事。请加我qq:274103592,多交流。

 回复 引用 查看   
#27楼[楼主] 2010-08-04 12:15 | BearRui(AK-47)      
@老羽
刚吃饭回来,呵呵,已加。

 回复 引用 查看   
#28楼 2010-08-04 12:57 | airwolf2026      
引用minttang:
您尝试打开的文件格式与文件扩展名指定格式不一致?
完全没有注意,感觉这样是最方便的,一直在用客户也没说过什么

===========
这个应该是写excel内容的时候,关闭最后的流的时候的问题吧?

以前写excel导出经常遇到这样的

 回复 引用 查看   
#29楼[楼主] 2010-08-04 13:14 | BearRui(AK-47)      
@airwolf2026

这个应该就是格式不对,excel报的错吧。

 回复 引用 查看   
#30楼 2010-08-04 15:37 | minttang      
试过了,office 2003和2007下打开html转的excel都没有问题。应当是你写的代码的问题。
 回复 引用 查看   
#31楼[楼主] 2010-08-04 16:14 | BearRui(AK-47)      
引用minttang:试过了,office 2003和2007下打开html转的excel都没有问题。应当是你写的代码的问题。


请问可否发一份你转成功的excel给我,xiongxingok#gmail.com,谢谢

 回复 引用 查看   
#32楼 2010-08-04 16:38 | steven hu      
直接html改扩展名,office2003不会提示,2007是要提示的。
 回复 引用 查看   
#33楼[楼主] 2010-08-04 16:42 | BearRui(AK-47)      
@steven hu
我这里也是2007会提示,而且现在用户大部分是2007了,所以放弃了。

其实直接html该扩展名,还有个问题就是不能作为excel导入。

 回复 引用 查看   
#34楼 2010-08-04 17:06 | steven hu      
@BearRui(AK-47)
不能导入的,只要这个excel另存为一下就可以了。
虽然麻烦了一点。

 回复 引用 查看   
#35楼[楼主] 2010-08-04 17:14 | BearRui(AK-47)      
@steven hu
不能导入是小问题,因为我们很多excel导出后不需要再导入。最主要是弹出"您尝试打开的文件格式与文件扩展名指定格式不一致",这个提示,产品经理不允许,~_~

 回复 引用 查看   
#36楼[楼主] 2010-08-04 17:15 | BearRui(AK-47)      
怎么那么多广告,删除了又来。
 回复 引用 查看   
#37楼 2010-08-04 20:49 | 希洛      
好多第3方控件都有导出EXCEL的功能,直接用就行了。比如DevExpress
 回复 引用 查看   
#38楼[楼主] 2010-08-04 21:06 | BearRui(AK-47)      
@希洛
那需要你的产品刚好使用了这些控件,不可能因为需要到处excel功能,采取使用这些控件吧。

我记的DevExpress只是winform中的吧。

 回复 引用 查看   
#39楼 2010-08-04 21:57 | szyicol      
@BearRui(AK-47)

DevExpress中Web的也有,不过真的不建议用这套,我开发用的电脑都用起来卡,别说客户的了!!

 回复 引用 查看   
#40楼[楼主] 2010-08-04 22:04 | BearRui(AK-47)      
引用szyicol:
@BearRui(AK-47)

DevExpress中Web的也有,不过真的不建议用这套,我开发用的电脑都用起来卡,别说客户的了!!


呵呵,一般带来效率提高的东西,基本上都会带来性能上的损耗。

 回复 引用 查看   
#41楼 2010-08-04 23:01 | 好俊的功夫啊      
能不能放出源码?
 回复 引用 查看   
#42楼[楼主] 2010-08-04 23:16 | BearRui(AK-47)      
@好俊的功夫啊
不好意思,代码不好全部贴出来,因为是公司的产品,没经过允许。做DEMO目前也没时间,如果你有啥疑问,可以留言,我们交流交流。

 回复 引用 查看   
#43楼 2010-08-05 13:35 | Kevin Yang      
这个思路没有源代码demo的话,还真看不出优势在哪喔~
以前老外有一个思路,就是使用某个excel文件作为模板,设置好各种样式,然后往里头填充数据,那个思路相比你这个要好很多,毕竟excel相对编辑html来说要容易好多。

 回复 引用 查看   
#44楼[楼主] 2010-08-05 13:48 | BearRui(AK-47)      
引用Kevin Yang:
这个思路没有源代码demo的话,还真看不出优势在哪喔~
以前老外有一个思路,就是使用某个excel文件作为模板,设置好各种样式,然后往里头填充数据,那个思路相比你这个要好很多,毕竟excel相对编辑html来说要容易好多。


如果导出的excel很复杂(比如嵌入图片,公式等),确实你说的用excel文件做模板比较好。如果比较简单的excel我个人觉得用excel做模板方而增加复杂度。

 回复 引用 查看   
#45楼 2010-08-06 00:26 | nicholas.sun      
直接用EXCEL做个模板,写个通用库
我以前写过一个,还可以分组小计,
还有以EXCEL为模板,可以复制表头表尾等内容,复制列格式等等优点
所以个人认为没必要搞个其它模板,去解析它,再生成个EXCEL出来!

 回复 引用 查看   
#46楼[楼主] 2010-08-06 00:28 | BearRui(AK-47)      
@nicholas.sun
恩,很多人都建议直接使用excel模板,而不要用其他的,看来是的研究研究直接用excel做模板的便捷性了。

 回复 引用 查看   
#47楼 2010-10-28 16:23 | 菜鸟包子      
AK,我最近也做的那个就是导出EXCEL的。
不需要用HTML编辑EXCEL模板,我觉得这样更麻烦了,直接自己做个EXCEL文件当成模板就好了,可以设置好格式和合并单元格情况,毕竟自己写HTML转换支持的格式肯定有限。

我就写了一个导出EXCEL的基类,支持先打开一个EXCEL,然后向里面插入文字,图片等· 先打开自己定义好的模板,生成好数据,最后再保存到需要的位置就OK了。

 回复 引用 查看   
#48楼[楼主] 2010-10-28 16:44 | BearRui(AK-47)      
@菜鸟包子
这种方式是可以,而且如果需要很复杂的excel,用html就比较难实现。用excel做模板比较好。但是用excel做模板不是很通用了,因为跟位置绑定死了。

刷新评论列表  刷新页面  返回页首
发表评论

昵称: [登录] [注册]

主页:

邮箱:(仅博主可见)

验证码: 验证码 看不清,换一个

评论内容:

  登录  注册

[使用Ctrl+Enter键快速提交评论]

0 1791399 EAqTGbDcOEA=
首页博问闪存新闻园子招聘知识库
最新IT新闻:
· 太空首次发现固体富勒烯
· 苹果第三名创始人:当年离开苹果因前景不明
· 报告称Android广告印象份额同比增长504%
· 百度高管称正调研东南亚市场 未来或建分公司
· 东芝索尼获得日本国有银行逾十亿美元贷款
» 更多新闻...
最新知识库文章:
· 编程的艺术:漂亮的代码和漂亮的软件
· GIT分支管理是一门艺术
· 编程:是一门艺术
· 编程是一门艺术吗?
· 对Java初学者的忠告
» 更多知识库文章...

China-pub 2011秋季教材巡展
China-Pub 计算机绝版图书按需印刷服务

抓虾
google reader
鲜果
哪吒
QQ邮箱
http://wap.feedsky.com/BearRui
昵称:BearRui(AK-47)
园龄:5年10个月
荣誉:推荐博客
粉丝:127
关注:3

搜索

 

最新随笔

  • 1. 产生唯一随机码的方法分析。
  • 2. URL中允许携带sessionid带来的安全隐患。
  • 3. JS 实现完美include
  • 4. 基于模板的excel导出
  • 5. 实现if elseif else的jsp标签。
  • 6. 记一复杂页面的前端优化(2) - 其他优化
  • 7. 记一复杂页面的前端优化(1) - 不一样的延迟加载
  • 8. 名站技术分析 — tudou网首页下列菜单的弹出效果
  • 9. LESS 让css也支持变量,运算符,include,嵌套规则等等
  • 10. CSS技巧 — 不使用图片实现圆角、阴影、渐变等功能

随笔分类(38)

  • .NET(11)
  • CSS(3)
  • JAVA(2)
  • javascript(4)
  • Life(5)
  • WEB(4)
  • 高性能WEB开发(5)
  • 浏览器(1)
  • 名站技术分析(3)

随笔档案(39)

  • 2010年10月 (1)
  • 2010年8月 (3)
  • 2010年7月 (5)
  • 2010年6月 (4)
  • 2010年5月 (6)
  • 2006年6月 (4)
  • 2006年5月 (7)
  • 2006年4月 (9)

积分与排名

  • 积分 - 178246
  • 排名 - 484

最新评论

阅读排行榜

评论排行榜

推荐排行榜

Copyright ©2012 BearRui(AK-47)