要使用jxls首先我们要了解它是什么?为什么要使用他,对比其他的一些导入导出工具他的优势是什么,下面简单的介绍一下:
jxls是一个简单的、轻量级的excel导出库,使用特定的标记在excel模板文件中来定义输出格式和布局。java中成熟的excel导出工具备pol、jxl,但他们都是使用java代码的方式来导出excel,编码效率很低且不方便维护。maven
还可使用一些工具很轻松的实现模板导出。这些工具如今还在维护,并且作得比较好的国内的有easyPOI,国外的就是这个JXLS了。
比较:
项目中有不少复杂的报表(大量单元格合并和单元格样式),easyPOI处理合并单元格时候容易出现残损的状况,poi代码维护成本高。
通过以上的介绍相信大家对于JXLS有一定的了解了,接下来讲一下需要用这个工具就先要导入依赖。
<dependency>
<groupId>org.jxls</groupId>
<artifactId>jxls-poi</artifactId>
<version>2.8.0</version>
</dependency>
通过上面的介绍我们只是知道JXLS是一个简单的、轻量级的excel导出库,但是还不知道应该如何使用,
导出需要使用模板,我们要先用office建立一个xlsx的模板(切记:新建excel工作表要使用xlsx格式,不要使用xls格式,因为使用xls导出的时候xlsx表格数据有可能会有问题)
建立好xlsx工作表了就根据实际需求在xlsx表格把需要的导出的数据画出来就可以了,就一个导出模板,赋值就要使用表达式了,表达式可以查看官网,JXLS官网地址
如何写表达式,在工作表中右键插入批注,office中添加批注快捷键(Shit + F2)
XLS Area 是JxlsPlus中的一个重要概念,它表明excel模板中须要被解析的矩形区域,由A1到最后一个单元格表示,有利于加快解析速度。
XLS Area 使用excel注释标注表示,它须要被定义在excel 模板的第一个单元格(A1)
jx:area(lastCell = “
”)
命令如下:
jx:each(items=“employees” var=“employee” lastCell=“D4”)
items 上下文中集合的变量名;
var 在遍历集合的时候每一条记录的变量名;
area 该XLS Command的解析区域;
direction 数据在excel中填充的方向,默认(DOWN)向下;
select 其值为一个表达式,用来过滤数据
横向遍历显示list的数据:
jx:each(items=“data” var=“dat” lastCell=“A3” direction=“RIGHT”)
Excel注释语法
jx:merge( lastCell =“合并单元格范围” [,cols =“合并的列数”] [,rows =“合并的行数”] [,minCols =“要合并的最小列数”] [,minRows = “要合并的最小行数”] )
注意:此命令只能用于还没有合并的单元格。若是合并单元格的合并单元格范围存在,则会发生异常。
下面做一个JXLS导出栗子
/**
* 导出测试
* @param query
* @param response
* @return
* @throws IOException
*/
@PostMapping("export")
public Result<Object> apiExport(@RequestBody ExportVo query ,HttpServletResponse response) throws IOException{
Result<Object> result = new Result<Object>();
UserInfo userInfo = AppRealm.getCurrentUser();
if (Common.isNull(userInfo)) {
result.setCode(BussErrorCode.LOGIN_TIMEOUT).setReason("登录超时或未登录");
return result;
}
PageHelper.startPage(query.getPageNumber(), 99999);
List<ExportVo> list = service.getList(query); //实现类自行写sql查询
try {
response.setContentType("application/vnd.ms-excel");
response.setHeader("Content-disposition", "attachment;filename="+new String(("测试导出信息_"+ new SimpleDateFormat("yyyy-MM-dd").format(new Date()).toString() +".xlsx").getBytes(), "iso-8859-1"));
ServletOutputStream out = response.getOutputStream();
HashMap<String, Object> data = new HashMap<>();
data.put("list", list);
ExcelWriter.write(this.getClass().getClassLoader().getResourceAsStream("template/template-test.xlsx"), out, data);
} catch (Exception e) {
log.warning(e.getMessage());
}
return null;
}
package com.cy.xgsm.util;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Map;
import org.jxls.common.Context;
import org.jxls.util.JxlsHelper;
/**
* 通过模板导出Excel的工具
* @author Dylan
*
*/
public class ExcelWriter {
/**
* 根据模板输出Excel文件
* @param templateInputStream 模板输入流
* @param out 要写入的流,一般为文件流或网络流
* @param vars 上下文变量
* @throws IOException
*/
public static void write(InputStream templateInputStream, OutputStream out, Map<String, ? super Object> vars) throws IOException {
Context context = new Context(vars);
JxlsHelper.getInstance().processTemplate(templateInputStream, out, context);
}
/**
* 根据模板输出Excel文件
* @param templateFile 模板文件
* @param out 要写入的流,一般为文件流或网络流
* @param vars 上下文变量
* @throws FileNotFoundException
* @throws IOException
*/
public static void write(File templateFile, OutputStream out, Map<String, ? super Object> vars) throws FileNotFoundException, IOException {
try (InputStream templateInputStream = new FileInputStream(templateFile)) {
write(templateInputStream, out, vars);
}
}
/**
* 根据模板输出Excel文件
* @param templateFileName 模板文件全名,包含路径
* @param out 要写入的流,一般为文件流或网络流
* @param vars 上下文变量
* @throws FileNotFoundException
* @throws IOException
*/
public static void write(String templateFileName, OutputStream out, Map<String, ? super Object> vars) throws FileNotFoundException, IOException {
try (InputStream templateInputStream = new FileInputStream(templateFileName)) {
write(templateInputStream, out, vars);
}
}
}