xfce4下terminal和xorg-x11-7.3的冲突问题 解决Freebsd中安装mod_python3出错
Aug 29

前几天给财物做一个支付的统计报表,要求生成固定格式的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");
    }

下面是模板文件。
Jxls template
生成的结果:


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


25 Responses to “推荐一个开源软件Jxls”

  1. 蛋白质 Says:

    我想用SVN下载源代码,可不知道用户名密码啊,能告诉我吗?想学习下啊

  2. 莫多(somebody) Says:

    $ svn checkout https://jxls.svn.sourceforge.net/svnroot/jxls/tags/jxls-0.9.5 jxls

    在这里。

  3. 蛋白质 Says:

    不是,误会了,呵呵,朋友,是那个MYBLOG里面
    http://myblog.googlecode.com/svn/trunk/
    用这个网,用SVN下载到ECLIPSE里面,好象要用户名和密码的。
    朋友好象刚才就在搞代码吧?呵呵,突然一下,SRC都不见了。呵

  4. 莫多(somebody) Says:

    汗。。:)

    你check 这个地址是不需要用户名和密码的。
    http://myblog.googlecode.com/svn/trunk/myblog/
    你看你是不是用的https 不是 http 

  5. 蛋白质 Says:

    哦,是的,应该是我的方法错误,现在好了,谢谢你。

  6. 柠檬园主 Says:

    我去找。NET版的去。。。。。呵呵。
    我现在在弄的一个ERP是弄个报表太TMD麻烦了。
    最烦的还是他们是WIN2000的服务器,连EXCEL里带个宏功能都不行。。。。

  7. 莫多(somebody) Says:

    是啊。有了这个玩意儿。做excel报表方便多了。

  8. 柠檬园主 Says:

    我找了一个。NET下的MYXLS似乎挺好用的。
    还有一个CODEPROJECT上面的,忘了名字了。
    明天专门测试一下看看。

  9. susan Says:

    今天读到这篇文章,对照我的有二个疑问请教,1、jxls中可以引用java类的方法对list中的数据进行处理吗(比如list的domain有个数据是calender类型,我在excel中想显示成“YYYY-MM-DD”)?2、jxls中可以进行国际化吗(例如list的domain有个数据是menu类型我可以取到它的name是“gender.male”,如何取到它在国际化文件中的值“男”呢)?

  10. 莫多(somebody) Says:

    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.

  11. susan Says:

    恩,谢谢!

  12. 小鹿飞飞 Says:

    请问你有源码吗?我现在急需用这个。在网上找半天都是些概念。麻烦你方便的话发到我的邮箱里好吗?谢谢了!!!

  13. 小鹿飞飞 Says:

    我的邮箱:guofr8686@163.com

  14. 莫多(somebody) Says:

    to:小鹿飞飞 

    源代码就是中间那一段啊。

    还有就是xls模板文件了。这个在office里生成一个就可以了。

  15. zz Says:

    如果order.setmonth("12458.11");在excel是以文本显示数字的,这时不方便统计month之和,怎么在excel显示成有千分位分隔符的数字类型呢

  16. 莫多(somebody) Says:

    to:zz

    你不要设置成 字符串。用 long, double, BigDecimal都可以。

    至于格式。我也不清楚。你可以查查 jxls & poi 的文档。

  17. zz Says:

    order.setmonth(rs.getFloat("month"))  把month设置为float类型,写进excel的时候也还是字符串呀。

  18. 莫多(somebody) Says:

    为啥?

    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)

  19. zz Says:

    用jxls是直接放map,filePath。就直接写到excel了。没有用到poi设置cell格式的呀。 

  20. 莫多(somebody) Says:

    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那出来的就是数字类型。

  21. zz Says:

    嗯嗯嗯嗯嗯。。晓得了,多谢指教。。

  22. 莫多(somebody) Says:

    提醒一下。如果你不确定的时候不要去想当然。

    找找源代码。确认一下只会有好处的。

    最后感谢支持本Blog.

  23. zz Says:

    恩。。会认真想的。3q

  24. handsome761121 Says:

    请问,能生成Excel2007的 .xlsx 文件吗?

  25. 莫多(somebody) Says:

    最新的poi已经支持 OOXML了。不过jxls项目还没有提供新版本的poi支持。所以现在应该还不支持的。
    你可以去jxls的官网上看看,看最新的代码有没有支持。

Leave a Reply

Identifying Code