JXLS导出Excel表格实战教程

超级好用Excel导出工具之JXLS

  • 简介
    • 引入JXLS maven依赖
    • XLS Area定义标记
    • each 命令是最经常使用的XLS命令
    • 单元格合并命令
    • JXLS导出实战
    • 模板导出Excel的工具
    • JXLS导出模板示例及表达式

简介

要使用jxls首先我们要了解它是什么?为什么要使用他,对比其他的一些导入导出工具他的优势是什么,下面简单的介绍一下:
jxls是一个简单的、轻量级的excel导出库,使用特定的标记在excel模板文件中来定义输出格式和布局。java中成熟的excel导出工具备pol、jxl,但他们都是使用java代码的方式来导出excel,编码效率很低且不方便维护。maven
还可使用一些工具很轻松的实现模板导出。这些工具如今还在维护,并且作得比较好的国内的有easyPOI,国外的就是这个JXLS了。
比较:
项目中有不少复杂的报表(大量单元格合并和单元格样式),easyPOI处理合并单元格时候容易出现残损的状况,poi代码维护成本高。
通过以上的介绍相信大家对于JXLS有一定的了解了,接下来讲一下需要用这个工具就先要导入依赖。

引入JXLS maven依赖

<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定义标记

XLS Area 是JxlsPlus中的一个重要概念,它表明excel模板中须要被解析的矩形区域,由A1到最后一个单元格表示,有利于加快解析速度。
XLS Area 使用excel注释标注表示,它须要被定义在excel 模板的第一个单元格(A1)

jx:area(lastCell = “”)

JXLS导出Excel表格实战教程_第1张图片

each 命令是最经常使用的XLS命令

命令如下:

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导出实战

下面做一个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;		
	}

模板导出Excel的工具

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

}

JXLS导出模板示例及表达式

JXLS导出Excel表格实战教程_第2张图片
JXLS导出Excel表格实战教程_第3张图片

JXLS导出Excel表格实战教程_第4张图片
如果觉得有帮助的话,各位小伙伴可以帮忙点个赞,关注一下收藏下,支持下啦!

你可能感兴趣的:(JXLS,java,spring,spring,boot)