java excel模板导出工具库“jxls”
jxls是一个方便的java excel模板导出工具库,可以通过简单的设置excel模板,导出想要的数据格式和样式。
传送门
使用步骤
<dependency>
<groupId>org.jxls</groupId>
<artifactId>jxls-poi</artifactId>
<version>2.10.0</version>
</dependency>
<dependency>
<groupId>org.jxls</groupId>
<artifactId>jxls</artifactId>
<version>2.10.0</version>
</dependency>
<dependency>
<groupId>net.sf.jxls</groupId>
<artifactId>jxls-core</artifactId>
<version>1.0.6</version>
</dependency>
-
简略说明
- jxls通过识别**${}**来项excel中设置数据
- jxls几种常用批注
- jx:area(lastCell=“A3”)
jx:area是模板必须的
lastCell:表示表格的区域 - jx:each(items=“” var=“” lastCell=“”)
items:设置遍历的集合
var:设置每一次遍历的变量名
direction:遍历方向,枚举类型:“DOWN”,“RIGHT”。默认为 DOWN 表示纵向遍历,RIGHT表示横向遍历
varIndex:当前迭代元素的索引,从0开始 - jx:mergeCells(cells=“” rows=“” minCols=“” minRows=“” lastCell=“”)
cells:设置合并的列数
rows:设置合并的行数
minCols:设置合并的最小列数,可无
minRows:设置合并的最小行数,可无
- jx:area(lastCell=“A3”)
-
编写程序
- 数据处理部分通过Context设置数据
// 文件名
String fileName = DateUtils.formatDate(statistics.getSearchDate(), "yyyy年MM月") + "学生信息统计表" + ".xlsx";
// 组装导出数据
Context context = new Context();
context.putVar("grade", grade);
context.putVar("classStudentInfoList",classStudentInfoList); // list
context.putVar("boyNumber", boyNumber);
context.putVar("girlNumber", girlNumber);
InputStream is = this.getClass().getClassLoader()
.getResourceAsStream("templates/modules/excel/classStudentInfo.xls");
response.reset();
response.setContentType("application/octet-stream; charset=utf-8");
response.setHeader("Content-Disposition",
"attachment; filename=" + new String(fileName.getBytes("gbk"), "ISO-8859-1"));
OutputStream os = response.getOutputStream();
JxlsHelper.getInstance().processTemplate(is, os, context);
复杂应用
-
其他标签
出列上边提到的三种常用标签之外,jxls还提供了以下集中标签:
- jx:if(condition=“student.gradePoint<= 4.5”, lastCell=“F9”, areas=[“A9:F9”,“A18:F18”])
这个标签的作用就是进行条件判断,符合条件的才在设定的区域执行需要的逻辑 - jx:image(lastCell=“D10” src=“image” imageType=“PNG”)
这个标签的作用是再需要的单元格插入图片
- jx:if(condition=“student.gradePoint<= 4.5”, lastCell=“F9”, areas=[“A9:F9”,“A18:F18”])
-
自定义标签
有时候jxls自带的标签不能满足我们的需要,那么需要我们自己定义标签来满足我们的需求。
- 自定义标签的定义和使用步骤
- 创建自定义标签类
自定义标签类需要继承jxls中的AbstractCommand类。
下面这个方法是一个简单定义,作用是通过索引获取map中的数据
- 创建自定义标签类
- 自定义标签的定义和使用步骤
public class MapValCommand extends AbstractCommand{
public static final String COMMAND_NAME = "mapVal";
private UtilWrapper util = new UtilWrapper();
private String mapData;
private String index;
private String var;
private Area area;
public MapValCommand() {
}
public MapValCommand(String mapData, String index, String var, Area area) {
this.mapData = mapData;
this.index = index;
this.var = var;
this.area = area;
}
@Override
public String getName() {
return COMMAND_NAME;
}
public String getMapData() {
return mapData;
}
public String getIndex() {
return index;
}
public String getVar() {
return var;
}
public Area getArea() {
return area;
}
public void setMapData(String mapData) {
this.mapData = mapData;
}
public void setIndex(String index) {
this.index = index;
}
public void setVar(String var) {
this.var = var;
}
public void setArea(Area area) {
this.area = area;
}
public UtilWrapper getUtil() {
return util;
}
public void setUtil(UtilWrapper util) {
this.util = util;
}
@Override
public Command addArea(Area area) {
if (area == null) {
return this;
}
if (super.getAreaList().size() >= 1) {
throw new IllegalArgumentException("You can only add 1 area to 'mergeCells' command!");
}
this.area = area;
return super.addArea(area);
}
@Override
public Size applyAt(CellRef cellRef, Context context) {
if(StringUtils.isBlank(index)) {
throw new IllegalArgumentException("index can not be null!");
}
return processCollection(context, cellRef, var);
}
private Size processCollection(Context context, CellRef cellRef, String varName) {
int idx = 0;
int newWidth = 0;
int newHeight = 0;
Object collectionObject = getTransformationConfig().getExpressionEvaluator().evaluate(mapData, context.toMap());
if(collectionObject instanceof Map) {
for (Map.Entry<String, Object> entry : ((Map<String, Object>)collectionObject).entrySet()) {
if(idx == Integer.valueOf(index)) {
context.putVar(varName, entry.getValue());
}
idx++;
}
}
CellRef currentCell = cellRef;
Object currentVarObject = varName == null ? null : context.getRunVar(varName);
Size size;
try {
size = area.applyAt(currentCell, context);
} catch (NegativeArraySizeException e) {
throw new JxlsException("Check jx:mapVal/lastCell parameter in template! Illegal area: " + area.getAreaRef(), e);
}
currentCell = new CellRef(currentCell.getSheetName(), currentCell.getRow(), currentCell.getCol() + size.getWidth());
newWidth += size.getWidth();
newHeight = Math.max(newHeight, size.getHeight());
restoreVarObject(context, varName, currentVarObject);
return new Size(newWidth, newHeight);
}
private void restoreVarObject(Context context, String varName, Object varObject) {
if (varName == null) {
return;
}
if (varObject != null) {
context.putVar(varName, varObject);
} else {
context.removeVar(varName);
}
}
}
使用方式
在代码中用一下方式引入
XlsCommentAreaBuilder.addCommandMapping("mapVal", MapValCommand.class);
模板中用以下方式使用