jxls是一个简单的、轻量级的excel导出库,使用特定的标记在excel模板文件中来定义输出格式和布局。java中成熟的excel导出工具有pol、jxl,但他们都是使用java代码的方式来导出excel,编码效率很低且不方便维护。

另外,jxls2.3的运行效率也相当不错,经过测试,在禁用日志输出的情况下,导出excel单表66535条记录仅仅3000毫秒,与poi几乎没什么大的差距。

demo工程源码下载:https://files.cnblogs.com/files/klguang/jxls-demo.zip

springboot-demo下载:https://files.cnblogs.com/files/klguang/jxls-springboot.zip

excel模板示例:

Excel模板标记在jxls中的作用分为三部分:

bean属性标记

XLS Area定义标记

XLS Command表示标记

bean属性标记

jxls使用 Apache JEXL表达式语言来解析定义在excel模板中的表达式。JEXL与JSTL相似,并对JSTL进行了扩展。eg:

${department.chief.age} //属性可以是无限深度

${utils:dateFmt(date,"yyyy-MM-dd")} //自定义工具函数

XLS Area定义标记

XLS Area 是JxlsPlus中的一个重要概念,它代表excel模板中需要被解析的矩形区域,由A1到最后一个单元格表示,有利于加快解析速度。

XLS Area 使用excel注释标注表示,它需要被定义在excel 模板的第一个单元格(A1):

jx:area(lastCell = "")

这个标记定义了excel模板需要被解析的矩形区域为:A1到。

XLS Command表示标记

XLS Command 使用excel注释标注表示,命令格式如下:

jx:(attr1='val1' attr2='val2' ... attrN='valN' lastCell= areas=["", "

... ""])

是库自带的命名或是用户自定义并注册到XlsCommentAreaBuilder的命令。

each 命令是最常用的XLS命令,形如:

jx:each(items="employees" var="employee" lastCell="D4")

each 可以有如下一些属性:

items 上下文中集合的变量名;

var 在遍历集合的时候每一条记录的变量名;

area 该XLS Command的解析区域;

direction 数据在excel中填充的方向,默认(DOWN)向下;

select 其值为一个表达式,用来过滤数据。

jexl自定义工具函数

如果你需要自定jexl来处理数据,你可以从Transformer对象获取JexlEngine引用,并对其配置。

下面的例子实现了将一个自定义jexl函数注册到utils命名空间下:

JxlsHelper jxlsHelper = JxlsHelper.getInstance();

Transformer transformer = jxlsHelper.createTransformer(is, os);

JexlExpressionEvaluator evaluator = (JexlExpressionEvaluator)transformer.getTransformationConfig().getExpressionEvaluator();

Map funcs = new HashMap();

funcs.put("utils", new JxlsUtils()); //添加自定义功能

evaluator.getJexlEngine().setFunctions(funcs);

demo

工程目录:

Employee.java

public class Employee {

private String name;

private Date birthDate;

private BigDecimal payment;

private BigDecimal bonus;

// getter and setter

}

建立excel模板:

工具类JxlsUtils.java

public class JxlsUtils {

public static void exportExcel(InputStream is, OutputStream os, Map model) throws IOException {

Context context = new Context();

if (model != null) {

for (String key : model.keySet()) {

context.putVar(key, model.get(key));

}

}

JxlsHelper jxlsHelper = JxlsHelper.getInstance();

Transformer transformer = jxlsHelper.createTransformer(is, os);

JexlExpressionEvaluator evaluator = (JexlExpressionEvaluator) transformer.getTransformationConfig()

.getExpressionEvaluator();

Map funcs = new HashMap();

funcs.put("utils", new JxlsUtils()); // 添加自定义功能

evaluator.getJexlEngine().setFunctions(funcs);

jxlsHelper.processTemplate(context, transformer);

}

// 日期格式化

public String dateFmt(Date date, String fmt) {

if (date == null) {

return "";

}

try {

SimpleDateFormat dateFmt = new SimpleDateFormat(fmt);

return dateFmt.format(date);

} catch (Exception e) {

e.printStackTrace();

}

return "";

}

// if判断

public Object ifelse(boolean b, Object o1, Object o2) {

return b ? o1 : o2;

}

}

入口ObjectCollectionDemo.java

public class ObjectCollectionDemoXlsx {

static Logger logger = LoggerFactory.getLogger(ObjectCollectionDemoXlsx.class);

public static void main(String[] args) throws ParseException, IOException {

logger.info("Running Object Collection demo");

List employees = generateSampleEmployeeData();

OutputStream os = new FileOutputStream("target/object_collection_output.xlsx");

Map model=new HashMap();

model.put("employees", employees);

model.put("nowdate", new Date());

InputStream inputStream = ObjectCollectionDemoXlsx.class.getClassLoader()

.getResourceAsStream("jxls-template/object_collection_template.xlsx");

JxlsUtils.exportExcel(inputStream, os, model);

os.close();

}

public static List generateSampleEmployeeData() throws ParseException {

List employees = new ArrayList();

SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MMM-dd", Locale.US);

employees.add( new Employee("Elsa", dateFormat.parse("1970-Jul-10"), 1500, 0.15) );

employees.add( new Employee("Oleg", dateFormat.parse("1973-Apr-30"), 2300, 0.25) );

employees.add( new Employee("Neil", dateFormat.parse("1975-Oct-05"), 2500, 0.00) );

employees.add( new Employee("Maria", dateFormat.parse("1978-Jan-07"), 1700, 0.15) );

employees.add( new Employee("John", dateFormat.parse("1969-May-30"), 2800, 0.20) );

return employees;

}

}

生成效果:

java jxls_jxls2.3-简明教程相关推荐

  1. [转]Java NIO通俗易懂简明教程

    Java NIO(New IO)是从Java 1.4版本开始引入的一个新的IO API,可以替代标准的Java IO API.本系列教程将有助于你学习和理解Java NIO. Java NIO提供了与 ...

  2. java程序设计简明教程张晓龙_Java网络编程简明教程

    Java网络编程简明教程 网络编程 计算机网络相关概念 计算机网络是两台或更多的计算机组成的网络,同一网络内的任意两台计算机可以直接通信,所有计算机必须遵循同一种网络协议. 互联网 互联网是连接计算机 ...

  3. Java手机游戏开发简明教程 (SunJava开发者认证程序员 郎锐)

    原文发布时间为:2008-07-30 -- 来源于本人的百度文章 [由搬家工具导入] Java手机游戏开发实例简明教程 (SunJava开发者认证程序员 郎锐) 一.手机游戏编写基础 1.手机游戏设计 ...

  4. java 大学简明教程_Simply-Java 《JAVA大学简明教程:实例程序设计》例子及习题源代码 - 下载 - 搜珍网...

    JAVA大学简明教程:实例程序设计/附书源代码/Tutorial01/MovingShapes/BoundedShape.class JAVA大学简明教程:实例程序设计/附书源代码/Tutorial0 ...

  5. 一周极客热文:Java 8简明教程

    该教程将带领你一步一步地认识这门语言Java 8的新特性.通过简单明了的代码示例,你将会学习到如何使用默认接口方法,Lambda表达式,方法引用和重复注解.看完这篇教程后,你还将对最新推出的API有一 ...

  6. java程序设计简明教程答案张晓龙_java2简明教程部分课后复习题答案

    JAVA2 简明教程习题答案 第二章 课堂习题 : public class Main { public static void main(String[] args) { //initializat ...

  7. 视频教程-MyBatis简明教程-Java

    MyBatis简明教程 就职于国内知名在线互联网旅游公司,10+互联网开发经验,精通前后端开发 刘志强 ¥29.00 立即订阅 扫码下载「CSDN程序员学院APP」,1000+技术好课免费看 APP订 ...

  8. Realm Java 简明教程(1)

    Realm Java 简明教程 Realm 是一个轻量的android版本的数据存储库 Realm 是一个轻量的android版本的数据存储库,快速简洁的操作方式,使得其优势得以凸显,我们来看下一个实 ...

  9. Java Web 简明教程

    点此查看 所有教程.项目.源码导航 1. 前言 本教程用于介绍Java Web开发入门的方方面面,包括开发环境.工具.网页.Java.数据库等. 本教程写于2016年底,一些内容相对比较陈旧了,新版的 ...

  10. CGIC简明教程(转摘)

    CGIC简明教程 本系列的目的是演示如何使用C语言的CGI库"CGIC"完成Web开发的各种要求. *********************************     基础 ...

最新文章

  1. 真实!拖垮中小技术团队的 11 宗罪
  2. python3.5.3安装完后什么样子_python3.5安装python3-tk详解
  3. 数据库查询 添加伪列
  4. java inputstream 回退_系统学习 Java IO (十)----回退流 PushbackInputStream
  5. Mybatis 一对多 结果集映射 简单入门 易懂
  6. 【TensorFlow-windows】keras接口——卷积核可视化
  7. android qq红包,Android实现QQ抢红包插件
  8. sql server累计求和函数_SQL基础--SQL高级功能
  9. 创建二级索引_Mysql创建索引
  10. linux 串口最高速率,Uart 16c950 linux速度高于B4000000(4Mbps)
  11. cmd 命令 之 dir 之 强化使用
  12. FPGA实现VGA显示(二)——————color_bar显示及方框移动(参考开拓者FPGA开发指南)
  13. ruby 安装和使用
  14. 指针操作数组c语言,C语言入门教程-用指针操作数组
  15. Markdown合并表格单元格
  16. gitlab本地配置_Gitlab的安装及基本使用(一)
  17. 异构群体机器人协作任务分配(群体智能论文学习)
  18. 论文投稿指南——中文核心期刊推荐(计算机技术2)
  19. 【经典题】跟着凡人玩转C语言之快速排序算法
  20. 套料软件XSperNEST

热门文章

  1. 四川大学本科教务系统 - 一键评教
  2. Google SPDY介绍
  3. 《打开量化投资的黑箱》
  4. ha rose server安装 sql_ROSE HA V8.9+Win2008+SQL2008双机配置详细指南(图文)
  5. 离合器膜片弹簧的优化设计matlab,汽车离合器膜片弹簧结构优化设计(本科毕业论文设计)...
  6. 【seaborn】(五)联合分布图
  7. typedef用法详解
  8. 基于Multisim14的弱信号放大电路的设计与仿真
  9. java mail pom_集成JavaMail
  10. A7芯片 IOS降级 跳过ID | ipad Mini2降级 10.3.3