JXLS (Excel导入、导出工具使用)

1:简介:

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

还可以使用一些工具很轻松的实现模板导出。这些工具现在还在维护,而且做得比较好的国内的有easyPOI,国外的就是这个JXLS了。

比较:

项目中有很多复杂的报表(大量单元格合并和单元格样式),easyPOI处理合并单元格时候容易出现残损的情况,poi代码维护成本高。

2:maven依赖:

<dependency>
<groupId>org.jxls</groupId>
<artifactId>jxls</artifactId>
<version>[2.6.0-SNAPSHOT,)</version>
</dependency>
<dependency>
<groupId>org.jxls</groupId>
<artifactId>jxls-poi</artifactId>
<version>[1.2.0-SNAPSHOT,)</version>
</dependency>
<dependency>
<groupId>org.jxls</groupId>
<artifactId>jxls-jexcel</artifactId>
<version>[1.0.8,)</version>
</dependency>
<dependency>
<groupId>org.jxls</groupId>
<artifactId>jxls-reader</artifactId>
<version>[2.0.5,)</version>
</dependency>

2:下面先做一个简单导出的实现:

1: 创建model:

 2:先用office创建一个xlsx的模板

可以看到这里有一些cell 的文本批注,office中添加批注快捷键(Shit + F2),批注中的类容这里先不做解释,下面会讲到

3:工具类JxlsUtils.java

public class JxlsUtils{

    private static final String TEMPLATE_PATH="jxls-template";

    public static void exportExcel(InputStream is, OutputStream os, Map<String, Object> 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<String, Object> funcs = new HashMap<String, Object>();
// funcs.put("utils", new JxlsUtils()); //添加自定义功能
// evaluator.getJexlEngine().setFunctions(funcs);
jxlsHelper.processTemplate(context, transformer);
} public static void exportExcel(File xls, File out, Map<String, Object> model) throws FileNotFoundException, IOException {
exportExcel(new FileInputStream(xls), new FileOutputStream(out), model);
} public static void exportExcel(String templateName, OutputStream os, Map<String, Object> model) throws FileNotFoundException, IOException {
File template = getTemplate(templateName);
if(template!=null){
exportExcel(new FileInputStream(template), os, model);
}
} //获取jxls模版文件 public static File getTemplate(String name){
String templatePath = JxlsUtils.class.getClassLoader().getResource(TEMPLATE_PATH).getPath();
File template = new File(templatePath, name);
if(template.exists()){
return template;
}
return null;
} // 日期格式化
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 ObjectCollectionDemo {
static Logger logger = LoggerFactory.getLogger(ObjectCollectionDemo.class); public static void main(String[] args) throws ParseException, IOException {
logger.info("Running Object Collection demo"); List<Employee> employees = generateSampleEmployeeData();
OutputStream os = new FileOutputStream("target/object_collection_output.xls");
Map<String , Object> model=new HashMap<String , Object>();
model.put("employees", employees);
model.put("nowdate", new Date());
JxlsUtils.exportExcel("object_collection_template.xls", os, model);
os.close();
} public static List<Employee> generateSampleEmployeeData() throws ParseException {
List<Employee> employees = new ArrayList<Employee>();
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;
}
}

生成效果:

好的,这样就很轻松的导出了是不是很简单


3:下面讲一下导出的细节,注意事项:

1:模板中的批注:

注意如果模板中对单元格加了批注,但是没有批注信息的话可能会报错:

1-1:bean属性标记

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

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

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

1-2:XLS Area定义标记

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

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

jx:area(lastCell = "<AREA_LAST_CELL>")

1-3:XLS Command表示标记

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

jx:<command_name>(attr1='val1' attr2='val2' ... attrN='valN' lastCell=<last_cell> areas=["<command_area1>", "<command_area2",
... "<command_areaN>"])

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

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

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

eg:

each 可以有如下一些属性:

  • items 上下文中集合的变量名;
  • var 在遍历集合的时候每一条记录的变量名;
  • area 该XLS Command的解析区域;
  • direction 数据在excel中填充的方向,默认(DOWN)向下;
  • select 其值为一个表达式,用来过滤数据

横向遍历显示list的数据:

 jx:each(items="data" var="dat" lastCell="A3" direction="RIGHT")

 1-4:jexl自定义工具函数:

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

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

JxlsHelper jxlsHelper = JxlsHelper.getInstance();
Transformer transformer = jxlsHelper.createTransformer(is, os);
JexlExpressionEvaluator evaluator = (JexlExpressionEvaluator)transformer.getTransformationConfig().getExpressionEvaluator();
Map<String, Object> funcs = new HashMap<String, Object>();
funcs.put("utils", new JxlsUtils()); //添加自定义功能
evaluator.getJexlEngine().setFunctions(funcs);

 1-5:单元格合并命令:

Excel注释语法

jx:merge(
lastCell =“合并单元格范围”
[,cols =“合并的列数”]
[,rows =“合并的行数”]
[,minCols =“要合并的最小列数”]
[,minRows = “要合并的最小行数”]

注意:此命令只能用于尚未合并的单元格。如果合并单元格的合并单元格范围存在,则会发生异常。

官方文档:http://jxls.sourceforge.net/reference/excel_markup.html

官方文档打不开?下个加速器就可以了:http://www.youxia66.com/

参考博客:https://www.cnblogs.com/klguang/p/6425422.html

博客源码:

demo工程源码下载http://files.cnblogs.com/files/klguang/jxlsdemo.zip

JXLS (Excel导入、导出工具使用)的更多相关文章

  1. 一个基于POI的通用excel导入导出工具类的简单实现及使用方法

    前言: 最近PM来了一个需求,简单来说就是在录入数据时一条一条插入到系统显得非常麻烦,让我实现一个直接通过excel导入的方法一次性录入所有数据.网上关于excel导入导出的例子很多,但大多相互借鉴. ...

  2. Octopus——excel导入导出工具

    Octopus Octopus是一个简易的Excel导入导出工具.目前主要就两个功能: 导入:将excel中一行数据转换为指定的java对象,并通过指定的正则表达式检查合法性. 导出:按照给定的xml ...

  3. java简易excel导入导出工具(封装POI)

    Octopus 如何导入excel 如何导出excel github项目地址 Octopus Octopus 是一个简单的java excel导入导出工具. 如何导入excel 下面是一个excel文 ...

  4. Java基础学习总结(49)——Excel导入导出工具类

    在项目的pom文件中引入 <dependency> <groupId>net.sourceforge.jexcelapi</groupId> <artifac ...

  5. Excel导入导出工具(简单、好用且轻量级的海量Excel文件导入导出解决方案.)

    Excel导入导出工具(简单.好用且轻量级的海量Excel文件导入导出解决方案.) 置顶 2019-09-07 16:47:10 $9420 阅读数 261更多 分类专栏: java   版权声明:本 ...

  6. java中excel导入\导出工具类

    1.导入工具 package com.linrain.jcs.test; import jxl.Cell; import jxl.Sheet; import jxl.Workbook; import ...

  7. Excel导入导出工具——POI XSSF的使用

    工具简介 POI是Apache提供的一款用于处理Microsoft Office的插件,它可以读写Excel.Word.PowerPoint.Visio等格式的文件. 其中XSSF是poi对Excel ...

  8. java Excel导入导出工具类

    本文章,导入导出依赖提前定义好的模板 package com.shareworx.yjwy.utils; import java.io.File; import java.io.FileInputSt ...

  9. 【原创】POI操作Excel导入导出工具类ExcelUtil

    关于本类线程安全性的解释: 多数工具方法不涉及共享变量问题,至于添加合并单元格方法addMergeArea,使用ThreadLocal变量存储合并数据,ThreadLocal内部借用Thread.Th ...

  10. 有史以来功能最全,使用最简单的excel导入/导出工具

    Github地址:https://github.com/xuanbg/Utility. 还有其他一些福利,请各位园友自取. 构造方法 1.用于导出Excel文件 NpoiHelper(ExcelVer ...

随机推荐

  1. [BZOJ3451]Normal(点分治+FFT)

    [BZOJ3451]Normal(点分治+FFT) 题面 给你一棵 n个点的树,对这棵树进行随机点分治,每次随机一个点作为分治中心.定义消耗时间为每层分治的子树大小之和,求消耗时间的期望. 分析 根据 ...

  2. POJ 3410 Split convex polygon(凸包)

    题意是逆时针方向给你两个多边形,问你这两个多边形通过旋转和平移能否拼成一个凸包. 首先可以想到的便是枚举边,肯定是有一对长度相同的边贴合,那么我们就可以n2枚举所有边对,接下来就是旋转点对,那么假设多 ...

  3. so easy(并查集+unordered_map)

    There are nn points in an array with index from 11 to nn, and there are two operations to those poin ...

  4. CSP-S全国模拟赛第二场 【nan】

    A.count 本场比赛最难的题... 隔板法组合数容斥 xjb 搞搞就好了 //by Judge #include<cstdio> #include<iostream> #d ...

  5. Hive内部表,外部表和分区表

    外部表和内部表的区别 内部表也称之为managed_table: 默认存储在/user/hive/warehouse下,也可以通过location指定: 删除表事,会删除表数据以及元数据: 外部表称之 ...

  6. IDEA tomcat热部署方法

    项目开发过程中,我们一般希望在修改完代码之后不重启项目即可提现出修改的结果,那么热部署项目就显得十分必要了.在idea中将项目热部署至tomcat中的方法如下: 首先打开tomcat配置界面,在ser ...

  7. 关于jsp 获得当前绝对路径的方法

    方法1) request.getRequestURL(); 方法2)  request.getScheme()+"://"+request.getServerName()+&quo ...

  8. Linux学习--第六天--软件包

    yum在线管理 管理的是rpm包,光盘里面都有 /etc/yum.repos.d下面有四个文件,对应网络yum源,光盘yum源等.如果需要用到哪个源,将其他三个源的enabled设置为0即可. |源配 ...

  9. 洛谷 P2704 [NOI2001]炮兵阵地 (状态压缩DP+优化)

    题目描述 司令部的将军们打算在NM的网格地图上部署他们的炮兵部队.一个NM的地图由N行M列组成,地图的每一格可能是山地(用"H" 表示),也可能是平原(用"P" ...

  10. Pycharm中Matplotlib图像不在弹出独立的显示窗口

    File | Settings | Tools | Python Scientific | Show plots in toolwindow 如图, 取消勾选此时,在执行就会在独立的窗口中弹出Matp ...