jxls根据模板导出Excel(二)
说明:本文是jxls根据模板导出Excel直接下载。
使用版本:jxls V2.10.0
excel模板版本:.xlsx格式
jxls官网地址:https://jxls.sourceforge.net/index.html
1、pom引用
<dependency>
<groupId>org.jxls</groupId>
<artifactId>jxls</artifactId>
<version>2.10.0</version>
</dependency>
<dependency>
<groupId>org.jxls</groupId>
<artifactId>jxls-poi</artifactId>
<version>2.10.0</version>
</dependency>
<dependency>
<groupId>org.jxls</groupId>
<artifactId>jxls-jexcel</artifactId>
<version>1.0.8</version>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-jexl</artifactId>
<version>2.1.1</version>
</dependency>
2、Controller调用方法
@PostMapping("/export")
public AjaxResult export(HttpServletResponse response, Data data) throws IOException {
String fileName = "test.xlsx";
Map<String, Object> model = dataService.getExportData(data,fileName);//拼接需要导出的内容
response.addHeader("Content-Disposition", "attachment; filename=\"" + fileName + "\"");
return JxlsUtils.exportExcelWithOS(response.getOutputStream(),fileName, model);
}
3、拼接数据
public Map<String, Object> getExportData(Data data,String fileName) {
Map<String, Object> model = new HashMap<String, Object>(); // 绑定数据
try {
//可绑定单个参数,Excel模板中单元格直接用${test1}获取
model.put("test1", "ttt");
//可绑定list,使用${item.参数名}获取,需在列表首个单元格中增加批注
List<Data1> taskItems = new ArrayList<Data1>();//Data1为某个数据类
for (int i=0;i<5;i++) {
Data1 d=new Data1;
//d.setA("111");
taskItems.add(d);
}
model.put("taskItems", taskItems);
}catch (Exception ex){
logger.error(ex.getMessage());
System.out.println(ex.getMessage());
}
return model;
}
4、Excel导出方法
import org.apache.commons.jexl3.JexlBuilder;
import org.apache.commons.jexl3.JexlEngine;
import org.jxls.builder.xls.XlsCommentAreaBuilder;
import org.jxls.common.Context;
import org.jxls.expression.JexlExpressionEvaluator;
import org.jxls.transform.Transformer;
import org.jxls.transform.poi.PoiTransformer;
import org.jxls.util.JxlsHelper;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.*;
import java.util.HashMap;
import java.util.Map;
public class JxlsUtils {
static{
}
/**
* 根据模板生成文件,直接下载
* @param os 流数据
* @param templateFileName 模板文件名称
* @param model 填充数据
* @throws IOException
*/
public static AjaxResult exportExcelWithOS(OutputStream os , String templateFileName, Map<String, Object> model) throws IOException{
// 获取模板文件
InputStream is = new FileInputStream(new File(模板文件路径地址 + templateFileName));
try {
// 输出
Context context = PoiTransformer.createInitialContext();
if (model != null) {
for (String key : model.keySet()) {
context.putVar(key, model.get(key));
}
}
JxlsHelper.getInstance().setUseFastFormulaProcessor(false).setEvaluateFormulas(true).processTemplate(is, os, context);
}
catch (Exception ex){
System.out.println(ex.getMessage());
logger.error(ex.getMessage());
return AjaxResult.error(ex.getMessage());
}finally {
is.close();
}
return AjaxResult.success();
}
}
5、Excel模板,创建xlsx格式模板
添加批注,第一个单元格添加范围批注,jx:area(lastCell="K3")
list列表增加jx:each(items="taskItems" var="item" lastCell="K3")

之前写过另一种方法,先根据模板生成Excel,然后调用方法导出,可参考:https://www.cnblogs.com/webttt/p/14283481.html
浙公网安备 33010602011771号