java pol报表导出_JXLS (Excel导入、导出工具使用)

本文介绍了JXLS库在Java中用于Excel导入导出的使用,对比了其他工具如POI和EasyPOI,并通过示例展示了如何创建模板、设置批注、处理合并单元格及自定义函数,简化Excel处理的复杂性。
摘要由CSDN通过智能技术生成

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

1:简介:java

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

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

比较:工具

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

2:maven依赖:ui

org.jxls

jxls

[2.6.0-SNAPSHOT,)

org.jxls

jxls-poi

[1.2.0-SNAPSHOT,)

org.jxls

jxls-jexcel

[1.0.8,)

org.jxls

jxls-reader

[2.0.5,)

2:下面先作一个简单导出的实现:编码

1: 建立model:lua

62a4ad368739c0e141718bd8ea86868b.png

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

8648e38d9bf46bbf302d0f9df931e6e8.png

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

3:工具类JxlsUtils.java

public classJxlsUtils{private static final String TEMPLATE_PATH="jxls-template";public static void exportExcel(InputStream is, OutputStream os, Map model) throwsIOException{

Context context= newContext();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 static void exportExcel(File xls, File out, Map model) throwsFileNotFoundException, IOException {

exportExcel(new FileInputStream(xls), newFileOutputStream(out), model);

}public static void exportExcel(String templateName, OutputStream os, Map model) throwsFileNotFoundException, IOException {

File template=getTemplate(templateName);if(template!=null){

exportExcel(newFileInputStream(template), os, model);

}

}//获取jxls模版文件

public staticFile getTemplate(String name){

String templatePath= JxlsUtils.class.getClassLoader().getResource(TEMPLATE_PATH).getPath();

File template= newFile(templatePath, name);if(template.exists()){returntemplate;

}return null;

}//日期格式化

publicString dateFmt(Date date, String fmt) {if (date == null) {return "";

}try{

SimpleDateFormat dateFmt= newSimpleDateFormat(fmt);returndateFmt.format(date);

}catch(Exception e) {

e.printStackTrace();

}return "";

}//if判断

public Object ifelse(booleanb, Object o1, Object o2) {return b ?o1 : o2;

}

}

上面注释中的自定义功能能够先注释到,咱们后面在讲

入口ObjectCollectionDemo.java

public classObjectCollectionDemo {static Logger logger = LoggerFactory.getLogger(ObjectCollectionDemo.class);public static void main(String[] args) throwsParseException, IOException {

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

List employees =generateSampleEmployeeData();

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

Map model=new HashMap();

model.put("employees", employees);

model.put("nowdate", newDate());

JxlsUtils.exportExcel("object_collection_template.xls", os, model);

os.close();

}public static List generateSampleEmployeeData() throwsParseException {

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) );returnemployees;

}

}

生成效果:

609761992301890b909d8ad5e5b15d19.png

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

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

1:模板中的批注:

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

18d8168e97672959192b1460e7395c9f.png

7aad6f6adf7bb0f6c510652085cde355.png

44ba983d08d481b817b42b850372ec9e.png

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 = "")

2ba4db10de37e33774c0fc92567b9588.png

1-3: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")

eg:

34944511ad1793641fc8f5c23329b06a.png

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 funcs = new HashMap();

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

evaluator.getJexlEngine().setFunctions(funcs);

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

Excel注释语法

jx:merge(

lastCell=“合并单元格范围”

[,cols=“合并的列数”]

[,rows=“合并的行数”]

[,minCols=“要合并的最小列数”]

[,minRows=“要合并的最小行数”]

)

注意:此命令只能用于还没有合并的单元格。若是合并单元格的合并单元格范围存在,则会发生异常。

博客源码:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值