前几天给财物做一个支付的统计报表,要求生成固定格式的excel 文件。当然就想到用apache poi了。
http://poi.apache.org/
不过你得一个先生成一个workbook,然后create一个sheet,再添加一个row,最后再添加cell,然后你就可以往cell里写数据了。代码那个多啊。真是丑得没法看。
后来找到这个jxls项目。
http://jxls.sourceforge.net/
真不错。其实jxls就是类似Freemarker的模板引擎。你只要提供一个.xls的模板(template),模板里写一些标签。然后把数据放到Map里让jxls填充一下就ok了。这样就根本不用poi的api去调xls的样式颜色啊。这个都是太麻烦了。
@Test
public void testTemplate() throws Exception {
List<CsvOrder> orders = new ArrayList<CsvOrder>();
CsvOrder order = new CsvOrder();
order.setDate("2008年8月28日");
order.setIncome(new BigDecimal(2000));
order.setTradeNo("200808280118");
order.setTrader("德比软件");
orders.add(order);
Map<String, Object> map = new HashMap<String, Object>();
map.put("orders", orders);
XLSTransformer transformer = new XLSTransformer();
transformer.transformXLS("src/test/resources/template.xls", map, "/home/rory/Desktop/workbook.xls");
}
下面是模板文件。

生成的结果:

不过听说比较多bug。我现在用来还没有遇到。你觉得方便就用吧。:)
Aug 29
Trackback:opensource-software-jxls

Sunday, August 31, 2008, 11:13:11 PM (CST)
我想用SVN下载源代码,可不知道用户名密码啊,能告诉我吗?想学习下啊
Sunday, August 31, 2008, 11:24:49 PM (CST)
$ svn checkout https://jxls.svn.sourceforge.net/svnroot/jxls/tags/jxls-0.9.5 jxls
在这里。
Sunday, August 31, 2008, 11:33:58 PM (CST)
不是,误会了,呵呵,朋友,是那个MYBLOG里面
http://myblog.googlecode.com/svn/trunk/
用这个网,用SVN下载到ECLIPSE里面,好象要用户名和密码的。
朋友好象刚才就在搞代码吧?呵呵,突然一下,SRC都不见了。呵
Sunday, August 31, 2008, 11:40:50 PM (CST)
汗。。:)
你check 这个地址是不需要用户名和密码的。
http://myblog.googlecode.com/svn/trunk/myblog/
你看你是不是用的https 不是 http
Monday, September 01, 2008, 12:13:49 AM (CST)
哦,是的,应该是我的方法错误,现在好了,谢谢你。
Tuesday, January 06, 2009, 02:26:20 PM (CST)
我去找。NET版的去。。。。。呵呵。
我现在在弄的一个ERP是弄个报表太TMD麻烦了。
最烦的还是他们是WIN2000的服务器,连EXCEL里带个宏功能都不行。。。。
Tuesday, January 06, 2009, 02:30:54 PM (CST)
是啊。有了这个玩意儿。做excel报表方便多了。
Tuesday, January 06, 2009, 04:09:09 PM (CST)
我找了一个。NET下的MYXLS似乎挺好用的。
还有一个CODEPROJECT上面的,忘了名字了。
明天专门测试一下看看。
Friday, February 20, 2009, 05:25:34 PM (CST)
今天读到这篇文章,对照我的有二个疑问请教,1、jxls中可以引用java类的方法对list中的数据进行处理吗(比如list的domain有个数据是calender类型,我在excel中想显示成“YYYY-MM-DD”)?2、jxls中可以进行国际化吗(例如list的domain有个数据是menu类型我可以取到它的name是“gender.male”,如何取到它在国际化文件中的值“男”呢)?
Friday, February 20, 2009, 06:03:20 PM (CST)
to:susan
第一个问题jxls的文档上有说明的。就是把SimpleDateFormat放到context中传给jxls就可以了。
SimpleDateFormat timeFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm");
map.put("timeFormat", timeFormat);
然后在xls模板文件中
${timeFormat(bean.date)}
对于第二个问题。我觉得可以包装一下你的menu.把取到的domain的menu先包装成domain.menu.name="男" 再传给jxls.
Thursday, February 26, 2009, 10:07:32 AM (CST)
恩,谢谢!
Thursday, August 27, 2009, 03:18:14 PM (CST)
请问你有源码吗?我现在急需用这个。在网上找半天都是些概念。麻烦你方便的话发到我的邮箱里好吗?谢谢了!!!
Thursday, August 27, 2009, 03:18:44 PM (CST)
我的邮箱:guofr8686@163.com
Thursday, August 27, 2009, 03:32:04 PM (CST)
to:小鹿飞飞
源代码就是中间那一段啊。
还有就是xls模板文件了。这个在office里生成一个就可以了。
Wednesday, September 09, 2009, 03:59:46 PM (CST)
如果order.setmonth("12458.11");在excel是以文本显示数字的,这时不方便统计month之和,怎么在excel显示成有千分位分隔符的数字类型呢
Wednesday, September 09, 2009, 04:02:45 PM (CST)
to:zz
你不要设置成 字符串。用 long, double, BigDecimal都可以。
至于格式。我也不清楚。你可以查查 jxls & poi 的文档。
Wednesday, September 09, 2009, 04:11:50 PM (CST)
order.setmonth(rs.getFloat("month")) 把month设置为float类型,写进excel的时候也还是字符串呀。
Wednesday, September 09, 2009, 04:18:37 PM (CST)
为啥?
poi里的Cell Type里 明明是有Number的啊?
http://poi.apache.org/apidocs/org/apache/poi/ss/usermodel/Cell.html
static int CELL_TYPE_BLANK
Blank Cell type (3)
static int CELL_TYPE_BOOLEAN
Boolean Cell type (4)
static int CELL_TYPE_ERROR
Error Cell type (5)
static int CELL_TYPE_FORMULA
Formula Cell type (2)
static int CELL_TYPE_NUMERIC
Numeric Cell type (0)
static int CELL_TYPE_STRING
String Cell type (1)
Wednesday, September 09, 2009, 04:31:41 PM (CST)
用jxls是直接放map,filePath。就直接写到excel了。没有用到poi设置cell格式的呀。
Wednesday, September 09, 2009, 04:54:02 PM (CST)
zz: jxls底层用的就是poi. 而且jxls没有像你说的那样想当然的把Map中的类型都转成string的。如果你map中放的是Number. 那jxls会把这个cell的Type设置成poi 中的Number.
请看源代码。
https://jxls.svn.sourceforge.net/svnroot/jxls/tags/jxls-0.9.8/jxls-core/src/main/java/net/sf/jxls/transformer/CellTransformer.java
所以我上面说的是对了。你只要放的是Number那出来的就是数字类型。
Wednesday, September 09, 2009, 04:56:34 PM (CST)
嗯嗯嗯嗯嗯。。晓得了,多谢指教。。
Wednesday, September 09, 2009, 05:00:44 PM (CST)
提醒一下。如果你不确定的时候不要去想当然。
找找源代码。确认一下只会有好处的。
最后感谢支持本Blog.
Wednesday, September 09, 2009, 05:02:25 PM (CST)
恩。。会认真想的。3q
Monday, February 01, 2010, 03:18:00 PM (CST)
请问,能生成Excel2007的 .xlsx 文件吗?
Monday, February 01, 2010, 04:32:57 PM (CST)
最新的poi已经支持 OOXML了。不过jxls项目还没有提供新版本的poi支持。所以现在应该还不支持的。
你可以去jxls的官网上看看,看最新的代码有没有支持。