之前写过一篇极其简单的excel导入导出,是单个文件的:
Springboot 最简单的结合MYSQL数据实现EXCEL表格导出及数据导入_小目标青年的博客-CSDN博客
还有指定模板的:
Springboot 指定自定义模板导出Excel文件_小目标青年的博客-CSDN博客
今天有人问到,多个文件导出,放到zip压缩包里面怎么搞?
不多说,开搞。
三步:
1. 引入 核心依赖
2. 复制粘贴已经给你们写好的工具类
3. 送一步,自测看效果
cn.afterturn easypoi-base 3.0.3 cn.afterturn easypoi-web 3.0.3 cn.afterturn easypoi-annotation 3.0.3
ExcelUtil.java
import cn.afterturn.easypoi.excel.ExcelExportUtil;
import cn.afterturn.easypoi.excel.entity.ExportParams;
import org.apache.poi.ss.usermodel.Workbook;
import javax.servlet.http.HttpServletResponse;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.net.URLEncoder;
import java.util.List;
/**
* @Author: JCccc
* @Date: 2022-7-13 16:02
* @Description: excel工具类
*/
public class ExcelUtil {
/**
* 导出
* @param list
* @param title
* @param sheetName
* @param pojoClass
* @param fileName
* @param response
*/
public static void exportExcel(List> list, String title, String sheetName, Class> pojoClass, String fileName, HttpServletResponse response) {
defaultExport(list, pojoClass, fileName, response, new ExportParams(title, sheetName));
}
/**
* 导出excle转换成 bytes
* @param list
* @param title
* @param sheetName
* @param pojoClass
* @param fileName
* @param response
* @return
* @throws IOException
*/
public static byte[] getExportExcelBytes(List> list, String title, String sheetName, Class> pojoClass, String fileName, HttpServletResponse response) throws IOException {
Workbook workbook = ExcelExportUtil.exportExcel(new ExportParams(title, sheetName), pojoClass, list);
ByteArrayOutputStream os = new ByteArrayOutputStream();
workbook.write(os);
return os.toByteArray();
}
private static void defaultExport(List> list, Class> pojoClass, String fileName, HttpServletResponse response, ExportParams exportParams) {
Workbook workbook = ExcelExportUtil.exportExcel(exportParams, pojoClass, list);
downLoadExcel(fileName, response, workbook);
}
private static void downLoadExcel(String fileName, HttpServletResponse response, Workbook workbook) {
try {
response.setCharacterEncoding("UTF-8");
response.setHeader("content-Type", "application/vnd.ms-excel");
response.setHeader("Content-Disposition",
"attachment;filename=" + URLEncoder.encode(fileName, "UTF-8"));
workbook.write(response.getOutputStream());
} catch (IOException e) {
throw new RuntimeException(e.getMessage());
}
}
}
ZipUtils.java
import java.io.*;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;
import static org.springframework.util.StreamUtils.BUFFER_SIZE;
/**
* @Author: JCccc
* @Date: 2022-7-13 16:02
* @Description: zip工具类
*/
public class ZipUtils {
/**
* 传入文件file
* @param outputStream
* @param fileList
*/
public static void downloadZipForFiles(OutputStream outputStream, List fileList){
ZipOutputStream zipOutputStream = null;
try {
zipOutputStream = new ZipOutputStream(outputStream);
for (File file : fileList) {
ZipEntry zipEntry = new ZipEntry(file.getName());
zipOutputStream.putNextEntry(zipEntry);
byte[] buf = new byte[BUFFER_SIZE];
int len;
FileInputStream in = new FileInputStream(file);
while ((len = in.read(buf)) != -1) {
zipOutputStream.write(buf, 0, len);
zipOutputStream.flush();
}
}
zipOutputStream.flush();
zipOutputStream.close();
} catch (IOException e) {
e.printStackTrace();
} finally {
// 关闭流
try {
if (zipOutputStream != null ) {
zipOutputStream.close();
}
if (outputStream != null) {
outputStream.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
/**
* 传入文件的 byte[]
* Map fileBufMap key是文件名(包含后缀),value是文件的byte[]
* @param outputStream
* @param fileBufMap
*/
public static void downloadZipForByteMore(OutputStream outputStream,Map fileBufMap) {
ZipOutputStream zipOutputStream = null;
try {
zipOutputStream = new ZipOutputStream(outputStream);
for (String fileName:fileBufMap.keySet()){
ZipEntry zipEntry = new ZipEntry(fileName);
zipOutputStream.putNextEntry(zipEntry);
if (Objects.nonNull(fileBufMap.get(fileName))){
byte[] fileBytes = fileBufMap.get(fileName);
zipOutputStream.write(fileBytes);
zipOutputStream.flush();
}
}
zipOutputStream.flush();
zipOutputStream.close();
} catch (IOException e) {
e.printStackTrace();
}finally {
// 关闭流
try {
if (zipOutputStream != null ) {
zipOutputStream.close();
}
if (outputStream != null) {
outputStream.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
/**
* 返回zip包的 byte[]
*
* @param fileBufMap
* @return
*/
public static byte[] getZipForByteMore(Map fileBufMap) {
ByteArrayOutputStream totalZipBytes = null;
ZipOutputStream zipOutputStream = null;
try {
totalZipBytes = new ByteArrayOutputStream();
zipOutputStream = new ZipOutputStream(totalZipBytes);
for (String fileName:fileBufMap.keySet()){
ZipEntry zipEntry = new ZipEntry(fileName);
zipOutputStream.putNextEntry(zipEntry);
if (Objects.nonNull(fileBufMap.get(fileName))){
byte[] fileBytes = fileBufMap.get(fileName);
zipOutputStream.write(fileBytes);
zipOutputStream.flush();
}
}
zipOutputStream.close();
byte[] bytes = totalZipBytes.toByteArray();
totalZipBytes.close();// 关闭流
return bytes;
} catch (IOException e) {
e.printStackTrace();
} finally {
// 关闭流
try {
if (totalZipBytes != null) {
totalZipBytes.close();
}
if (zipOutputStream != null) {
zipOutputStream.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
return null;
}
}
回顾一下,单个excel导出,写过使用场景接口:
@RequestMapping("exportUserExcel")
public void exportUserExcel(HttpServletResponse response){
// List userList = userService.queryUserInfo();
List userList=new ArrayList<>();
User user1=new User(1,"a","12");
User user2=new User(1,"b","12");
User user3=new User(1,"c","12");
userList.add(user1);
userList.add(user2);
userList.add(user3);
//导出操作
ExcelUtil.exportExcel(userList,"用户信息","sheet1",User.class,"users.xls",response);
}
接口使用代码:
/**
* 将指定文件打包成zip并下载
*/
@RequestMapping("exportExcelZipWithFile")
public void exportExcelZipWithFile(HttpServletResponse response) throws IOException {
// 这里还是和上面一样
String[] filePath = new String[]{"D:\\ziptest\\11.xls", "D:\\ziptest\\22.xls"};
List fileList = new ArrayList<>();
for (String s : filePath) {
File file = new File(s);
fileList.add(file);
}
response.setHeader("content-type", "application/octet-stream");
response.setContentType("application/octet-stream");
response.setHeader(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=configDetail.zip");
ZipUtils.downloadZipForFiles(response.getOutputStream(), fileList);
}
/**
* 将excel文件的Byte[]打包成zip并下载
*/
@RequestMapping("exportExcelZipWithByte")
public void exportExcelZipWithByte(HttpServletResponse response) throws IOException {
Map fileBufMap=new HashMap<>();
List accountList=new ArrayList<>();
Account account1=new Account(1,"1234");
Account account2=new Account(2,"12222");
Account account3=new Account(3,"1431546");
accountList.add(account1);
accountList.add(account2);
accountList.add(account3);
//导出操作 1
byte[] exportAccountExcelBytes = ExcelUtil.getExportExcelBytes(accountList, "账号信息", "sheet1", Account.class, "accounts.xls", response);
List userList=new ArrayList<>();
User user1=new User(1,"a","12");
User user2=new User(1,"b","12");
User user3=new User(1,"c","12");
userList.add(user1);
userList.add(user2);
userList.add(user3);
//导出操作
byte[] exportUserExcelBytes = ExcelUtil.getExportExcelBytes(userList,"用户信息","sheet1",User.class,"users.xls",response);
fileBufMap.put("accounts.xls",exportAccountExcelBytes);
fileBufMap.put("users.xls",exportUserExcelBytes);
response.setHeader("content-type", "application/octet-stream");
response.setContentType("application/octet-stream");
response.setHeader(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=configDetail.zip");
ZipUtils.downloadZipForByteMore(response.getOutputStream(), fileBufMap);
}
代码简析:
这个map,key 是zip压缩包里面的文件名, vlaue是 excel文件的字节流:
生成excel文件,我们直接返回 byte[]流:
好吧,该篇就到这。