优秀的编程知识分享平台

网站首页 > 技术文章 正文

springboot实现批量导出多个excel表格并压缩zip

nanyue 2024-08-01 22:50:14 技术文章 11 ℃

分享不易,喜欢请关注

导出多个Excel文件,并压缩成zip包的功能,这是很多业务系统都需要的功能。本文将结合easypoi实现。

导入easypoi项目

<dependency>
			<groupId>cn.afterturn</groupId>
		    <artifactId>easypoi-spring-boot-starter</artifactId>
		    <version>4.2.0</version>
</dependency>

创建Excel模板

模板是处理复杂Excel的简单方法,复杂的Excel样式,可以用Excel直接编辑,完美地避开了代码编写样式的雷区,同时指令的支持,也提了模板的有效性。创建的模板示例如图所示:

基本语法如下:

  • 空格分割
  • 三目运算 {{test ? obj:obj2}}
  • n: 表示 这个cell是数值类型 {{n:}}
  • le: 代表长度{{le:()}} 在if/else 运用{{le:() > 8 ? obj1 : obj2}}
  • fd: 格式化时间 {{fd:(obj;yyyy-MM-dd)}}
  • fn: 格式化数字 {{fn:(obj;###.00)}}
  • fe: 遍历数据,创建row
  • !fe: 遍历数据不创建row
  • $fe: 下移插入,把当前行,下面的行全部下移.size()行,然后插入
  • #fe: 横向遍历
  • v_fe: 横向遍历值
  • !if: 删除当前列 {{!if:(test)}}
  • 单引号表示常量值 '' 比如'1' 那么输出的就是 1
  • &NULL& 空格
  • ]] 换行符 多行遍历导出
  • sum: 统计数据

CBFile模板类

不同的数据,可能需要定制不一样的模板。因此,可以定制一个模板类,以实现对模板数据的管理:

@Data
public class CBFile {
	private Integer id;//保存的数据库里模板文件的标识
	private String name;//模板名称
	private String url;//储存地址
}

构建导出excel方法并压缩

//datas为需要导出的数据,其中key为压缩包里的Excel文件名,value是数据
//name为压缩包名称
	public void downZip(Map<String,Map<String,Object>> datas,String name) throws IOException {
		response.setContentType("application/zip");
		response.setHeader("Content-Disposition", "attachment;filename="+name+".zip");
		ByteArrayOutputStream bos = new ByteArrayOutputStream();
		ZipOutputStream zos = new  ZipOutputStream(bos);
		ServletOutputStream out = response.getOutputStream();

		for(String key:datas.keySet()) {
			Map<String,Object> data=datas.get(key);
			String path=getFilePath((Integer) data.get("fileId"));//这是获得模板文件路径的方法,根据实际情况修改。fileId对应的是上面的文件id
			TemplateExportParams params=new TemplateExportParams(path);
		//使用模板生成excel文件
			Workbook workbook=ExcelExportUtil.exportExcel(params, data);
      //存放在压缩包里
			ZipEntry zipEntry = new ZipEntry(name+"/"+key+".xlsx");
			zos.putNextEntry(zipEntry);
			workbook.write(new NonCloseableOutputStream(zos));
			//bos.writeTo(zos);
			zos.closeEntry(); 
		}
		zos.close();
		byte[] bytes = bos.toByteArray();

		//setting content-type and zip file name
		response.setContentType("application/zip");
		response.setHeader("Content-Disposition", "attachment; filename="+name+".zip");
		out.write(bytes);
		out.flush();

	}

分享不易,喜欢请点关注

Tags:

最近发表
标签列表