1、带你一起拥有Jxls2
Jxls2admin 发布于:2018-04-04 14:09:16
阅读:loading
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程序,我将代码写至最简化(一上来就接触到别人封装好的程序不利于大家对于它的原有实现的了解),并加上相关的解释来说明。
参考代码
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,最后再处理模板和填充数据,最后将模板写出。
模板介绍
模板说明
在A1单元格处定义了一个批注(位于Excel菜单栏—审阅处),这里需要特别注意一下,故意在A1处设置了单元格合并,实际上这个区域还是属于A1格子。在开始接触时也是讲jx:area(lastCell=”A1”)写成了D1是不对的,实际上还得是合并单元格的A1位置(运行结果处有解释);另外Excel模板文件的Sheet名称为“Hello”。另外${xx}是jxel表达式的解析引擎规范,表示这里引入了name的参数解析。
运行结果
运行说明
我们选中这个合并后的单元格区域发现实际上它是A1格子,${name}是对于后台声明变量(putVar)参数的解析,比较简单,不多赘述。
相关下载
官网demo-maven工程下载.zip(非原始工程,已由maven进行编译后的,可直接使用eclipse导入工作空间的)
out_simpleHello.xls 示例输出文件下载
本示例代码会在后文中提供。
点赞