一、Excel之初识jxls

                                        一、初识jxls


Jxls是基于Poi导出Excel的模板式封装,较之直接使用Poi来一路create的方式,它更使得一般(小批量数据)的导出Excel变得非常简单和易于维护。至于使用它的优缺点请查找我关于它1.0版本相关的文章,这里主要讲述Jxls2.x(此刻最新的版本为2.4.3)的版本,关于此特地将一些常用的知识点和特色的功能点进行了“浅浅”的整理,共计十几篇文章,你值得拥有。它的官网地址为:http://jxls.sourceforge.net ,对应的demo下载地址为:https://bitbucket.org/leonate/jxls-demo (demo中所有的示例均采用了try-with的写法,这个也值得拥有),特别注意了,它的API就自己去看吧,本章节讲述的前提是你大概上已经看过它的API了,了解到一些概念、标签、语法等。另外一个重点是即时是有了Jxls2也不要放弃使用原生Poi,有的复杂报表两者结合才更加完美;还有就是用于(超)大数据量的导出时还得是Poi好使,毕竟有flushRows。

我们先来道一下Jxl2能做哪些事儿吧,可能这才是你最关注的东西,如:列表数据循环嵌套显示、Excel公式计算、动态表格、单元格合并、自定义函数、自定义表达式、SQL模板报表、插入超链接、插入图片、数据分组、IF-ELSE逻辑判断、按模板填充数据等等等,这些也都是我感觉革新的地方,也是我后文中要进行一一详细阐述的知识点。

Jxls2与1的版本有着巨大的版本差异,抛弃了在Excel模板中<jx:tag/>标签的使用方式,改为直接在单元格中插入批注的方式来声明表达式,并且以前的版本只是单纯的进行逻辑、数据上的处理(还有基于Excel中模板自身公式的支持),对于稍微复杂的实现必须交由后台的Poi进行二次处理。Jxls2的版本增强了逻辑判断处理,如:可支持else逻辑;可实现复杂的单元格逻辑,如:将单元格设置为超链接处理、设置为图片处理等等。Jxls2支持Poi与JExcel两个Java解析Excel的实现,默认采用commons-jxel表达式引擎(用户可以替换)来动态运算。

Jxls2解析模板时有3种方式,分别是直接从模板的备注标记中解析、xml配置中解析、Java后台创建的方式解析,本篇所有章节中全部使用在模板的备注标记中解析的方式(沿用1.0时的习惯,另外实际应用部署后,如需调整Excel显示的样式效果可直接通过调整Excel模板文件的方式来,也无需重启相关服务器)。

了解Jxls2需要有一个区域的概念“Area”,这个区域定义了模板中所需要解析的动态区域,即所有的表达式处理都要包括在内,且这个区域的声明只能为Excel单元格的A1格子内。本片文章主要介绍一下什么是Jxls2、它能帮我们干些什么和一个Hello示例。至于这个Hello程序,我将代码写至最简化(一上来就接触到别人封装好的程序不利于大家对于它的原有实现的了解),并加上相关的解释来说明。

Java代码参考为:

package cn.chendd.examples;



import java.io.File;

import java.io.FileOutputStream;

import java.io.InputStream;

import java.io.OutputStream;



import org.jxls.common.Context;

import org.jxls.util.JxlsHelper;



/**

 * Hello 入门体验

 * @author chendd

 */

public class SimpleHelloJxls {



   public static void main(String[] args) throws Exception {

      //模板文件

      InputStream is = SimpleHelloJxls.class.getClass().getResourceAsStream("/cn/chendd/examples/templates/simpleHello.xls");

      Context context = new Context();

      //设置参数变量

      context.putVar("name", "chendd");

      OutputStream os = new FileOutputStream(new File("d:\\test\\out_simpleHello.xls"));

      //载入模板、处理导出

      JxlsHelper.getInstance().processTemplate(is , os , context);

      //释放资源

      os.flush();

      os.close();

      is.close();

      //备注,如果从一个简单的示例入手,这个就再简单不过了

     

   }

  

}

代码说明

可以看出以上代码较为简单,构造一个InputStream输入流读入一个xls的模板文件,定义一个变量name,且值为chendd,最后再处理模板和填充数据,最后将模板写出。

模板参考为:

blob.png

模板说明

在A1单元格处定义了一个批注(位于Excel菜单栏—审阅处),这里需要特别注意一下,故意在A1处设置了单元格合并,实际上这个区域还是属于A1格子。在开始接触时也是讲jx:area(lastCell=”A1”)写成了D1是不对的,实际上还得是合并单元格的A1位置(运行结果处有解释);另外Excel模板文件的Sheet名称为“Hello”。另外${xx}是jxel表达式的解析引擎规范,表示这里引入了name的参数解析。

运行示例为:

blob.png

运行说明

我们选中这个合并后的单元格区域发现实际上它是A1格子,${name}是对于后台声明变量(putVar)参数的解析,比较简单,不多赘述。

链接地址:有时间改进记录

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
jxls是一个开源的Java工具,可以根据Excel模板文件生成Excel文件。jxls支持复杂的Excel模板,可以在模板中包含多个工作表、多个单元格样式、公式等。 下面是使用jxls导出Excel的步骤: 1. 创建Excel模板文件,可以使用Excel或者其他电子表格软件创建,也可以使用jxls提供的Excel模板文件样例。 2. 在Java代码中使用jxls API读取Excel模板文件,并将要填充到Excel文件中的数据传递给jxls。 3. 在Excel模板文件中,使用jxls提供的标记语言标记待填充的单元格或区域。 4. 使用jxls API将填充好数据的Excel文件输出到指定位置。 下面是一个简单的示例: 1. 创建Excel模板文件,假设文件名为template.xlsx,包含两个工作表Sheet1和Sheet2,每个工作表中包含一个表格,表格中包含两个单元格A1和B1,A1单元格中填充姓名,B1单元格中填充年龄。 2. 在Java代码中,使用jxls API读取Excel模板文件,准备要填充到Excel文件中的数据: ```java InputStream is = new FileInputStream(new File("template.xlsx")); OutputStream os = new FileOutputStream(new File("output.xlsx")); Map<String, Object> model = new HashMap<String, Object>(); List<Person> persons = new ArrayList<Person>(); persons.add(new Person("Alice", 25)); persons.add(new Person("Bob", 30)); model.put("persons", persons); ``` 3. 在Excel模板文件中,使用jxls提供的标记语言标记待填充的单元格或区域。在A1单元格中插入${person.name},在B1单元格中插入${person.age},表示在Excel文件中填充persons集合中的每个Person对象的name和age属性。 4. 使用jxls API将填充好数据的Excel文件输出到指定位置: ```java XLSTransformer transformer = new XLSTransformer(); Workbook workbook = transformer.transformXLS(is, model); workbook.write(os); os.flush(); os.close(); is.close(); ``` 这样,就可以根据复杂模板导出Excel文件了。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值