安利一个非常好用的excel模板导入工具库jxls

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>
  • 编写excel模板

模板样例

  • 简略说明

    • jxls通过识别**${}**来项excel中设置数据
    • jxls几种常用批注
      1. jx:area(lastCell=“A3”)
        jx:area是模板必须的
        lastCell:表示表格的区域
      2. jx:each(items=“” var=“” lastCell=“”)
        items:设置遍历的集合
        var:设置每一次遍历的变量名
        direction:遍历方向,枚举类型:“DOWN”,“RIGHT”。默认为 DOWN 表示纵向遍历,RIGHT表示横向遍历
        varIndex:当前迭代元素的索引,从0开始
      3. jx:mergeCells(cells=“” rows=“” minCols=“” minRows=“” lastCell=“”)
        cells:设置合并的列数
        rows:设置合并的行数
        minCols:设置合并的最小列数,可无
        minRows:设置合并的最小行数,可无
  • 编写程序

    • 数据处理部分通过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”)
      这个标签的作用是再需要的单元格插入图片
  • 自定义标签

    有时候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);

模板中用以下方式使用
在这里插入图片描述

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
jxls一个开源的Java工具,可以根据Excel模板文件生成Excel文件。jxls支持复杂的Excel模板,可以在模板中包含多个工作表、多个单元格样式、公式等。 下面是使用jxls导出Excel的步骤: 1. 创建Excel模板文件,可以使用Excel或者其他电子表格软件创建,也可以使用jxls提供的Excel模板文件样例。 2. 在Java代码中使用jxls API读取Excel模板文件,并将要填充到Excel文件中的数据传递给jxls。 3. 在Excel模板文件中,使用jxls提供的标记语言标记待填充的单元格或区域。 4. 使用jxls API将填充好数据的Excel文件输出到指定位置。 下面是一个简单的示例: 1. 创建Excel模板文件,假设文件名为template.xlsx,包含两个工作表Sheet1和Sheet2,每个工作表中包含一个表格,表格中包含两个单元格A1和B1,A1单元格中填充姓名,B1单元格中填充年龄。 2. 在Java代码中,使用jxls API读取Excel模板文件,准备要填充到Excel文件中的数据: ```java InputStream is = new FileInputStream(new File("template.xlsx")); OutputStream os = new FileOutputStream(new File("output.xlsx")); Map<String, Object> model = new HashMap<String, Object>(); List<Person> persons = new ArrayList<Person>(); persons.add(new Person("Alice", 25)); persons.add(new Person("Bob", 30)); model.put("persons", persons); ``` 3. 在Excel模板文件中,使用jxls提供的标记语言标记待填充的单元格或区域。在A1单元格中插入${person.name},在B1单元格中插入${person.age},表示在Excel文件中填充persons集合中的每个Person对象的name和age属性。 4. 使用jxls API将填充好数据的Excel文件输出到指定位置: ```java XLSTransformer transformer = new XLSTransformer(); Workbook workbook = transformer.transformXLS(is, model); workbook.write(os); os.flush(); os.close(); is.close(); ``` 这样,就可以根据复杂模板导出Excel文件了。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值