SpringBoot快速集成快速集成jxls-poi(自定义模板自定义模板,支持本地文件导出支持本地文件导出,在线文件导出在线文件导出)
主要介绍了SpringBoot快速集成jxls-poi(自定义模板,支持本地文件导出,在线文件导出),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的
朋友们下面随着小编来一起学习学习吧
在项目持续集成的过程中,有时候需要实现报表导出和文档导出,类似于excel中这种文档的导出,在要求不高的情况下,有人可能会考虑直接导出csv文件来简化导出过程。但是导出xlsx文件,其实过程
相对更复杂。解决方案就是使用poi的jar包。使用源生的poi来操作表格,代码冗余,处理复杂,同时poi的相关联的依赖还会存在版本兼容问题。所以直接使用poi来实现表格导出,维护成本大,不易于拓
展。
我们需要学会站在巨人的肩膀上解决问题,jxls-poi这个就很好解决这个excel表格导出的多样化的问题。类似jsp和thymealf的模板定义,使得表格导出变得简单可控。
不多BB上代码
1.引入关键依赖包引入关键依赖包
<!-- jxls-api依赖 -->
<dependency>
<groupId>org.jxls</groupId>
<artifactId>jxls-poi</artifactId>
<version>1.0.15</version>
</dependency>
<dependency>
<groupId>org.jxls</groupId>
<artifactId>jxls</artifactId>
<version>2.4.6</version>
</dependency>
这里只需要两个依赖便操作excel表格了。
2.定义模板文件定义模板文件
新建一个excel文件,后缀名为.xlsx,在resources目录下新增一个jxls的文件夹,把模板文件放在这个文件夹下,便于后续的spring-boot的集成。
3.导出工具类导出工具类
/**
* @author machenike
*/
public class ExcelUtils {
/***
* excel导出到response
* @param fileName 导出文件名
* @param templateFile 模板文件地址
* @param params 数据集合
* @param response response
*/
public static void exportExcel(String fileName, InputStream templateFile, Map<String, Object> params,
HttpServletResponse response) throws IOException {
response.reset();
response.setHeader("Accept-Ranges", "bytes");
OutputStream os = null;
response.setHeader("Content-disposition", String.format("attachment; filename=\"%s\"", fileName));
response.setContentType("application/octet-stream;charset=UTF-8");
try {
os = response.getOutputStream();
exportExcel(templateFile, params, os);
} catch (IOException e) {
throw e;
}
}
/**
* 导出excel到输出流中
* @param templateFile 模板文件
* @param params 传入参数
* @param os 输出流
* @throws IOException
*/
public static void exportExcel(InputStream templateFile, Map<String, Object> params, OutputStream os) throws IOException {
try {
Context context = new Context();
Set<String> keySet = params.keySet();
for (String key : keySet) {
//设置参数变量
context.putVar(key, params.get(key));
}
Map<String, Object> myFunction = new HashMap<>();
myFunction.put("fun", new ExcelUtils());
// 启动新的jxls-api 加载自定义方法
Transformer trans = TransformerFactory.createTransformer(templateFile, os);
JexlExpressionEvaluator evaluator = (JexlExpressionEvaluator) trans.getTransformationConfig().getExpressionEvaluator();
evaluator.getJexlEngine().setFunctions(myFunction);
// 载入模板、处理导出
AreaBuilder areaBuilder = new XlsCommentAreaBuilder(trans);
List<Area> areaList = areaBuilder.build();
areaList.get(0).applyAt(new CellRef("sheet1!A1"), context);
trans.write();
} catch (IOException e) {
throw e;
} finally {
try {
if (os != null) {
os.flush();
os.close();
}
if (templateFile != null) {
templateFile.close();
}
} catch (IOException e) {
throw e;
}
}
}
/**
* 格式化时间
*/
public Object formatDate(Date date) {
if (date != null) {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String dateStr = sdf.format(date);
return dateStr;
}
return "--";