JAVA实现easyExcel下载压缩包

devtools/2024/9/25 13:09:21/

添加pom依赖

<dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>2.2.6</version>
</dependency>
<dependency><groupId>org.apache.ant</groupId><artifactId>ant</artifactId><version>1.10.5</version>
</dependency>
<dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.21</version>
</dependency>
<!--工具类-->
<dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>5.8.23</version>
</dependency>

实体类

java">package com.example.mybatismysql8demo.excel;import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;import java.io.Serializable;
import java.math.BigDecimal;@NoArgsConstructor
@AllArgsConstructor
@Accessors(chain = true)
@Data
public class TemplateGoodsExcel implements Serializable {private String goodsCategory;private String goodsName;private Integer num;private BigDecimal price;public TemplateGoodsExcel(String goodsCategory,String goodsName, BigDecimal price, Integer num) {this.goodsName = goodsName;this.price = price;this.num = num;this.goodsCategory = goodsCategory;}}

导出模版
在这里插入图片描述

zip下载工具类

java">package com.example.mybatismysql8demo.utils;import cn.hutool.core.io.FileUtil;
import lombok.extern.slf4j.Slf4j;
import org.apache.tools.zip.ZipEntry;
import org.apache.tools.zip.ZipOutputStream;
import org.springframework.stereotype.Component;import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;@Component
@Slf4j
public class ZipUtil {/*** 字节数组长度*/private static final int BYTE_ARRAY_LENGTH = 1024;/*** 创建压缩文件* @param srcFile 源文件列表* @param zipFile 压缩文件*/public static void zipFiles(File[] srcFile, File zipFile) {byte[] buf = new byte[BYTE_ARRAY_LENGTH];FileInputStream in = null;try (ZipOutputStream out = new ZipOutputStream(new FileOutputStream(zipFile))) {for (File file : srcFile) {try {in = new FileInputStream(file);out.putNextEntry(new ZipEntry(file.getName()));// 支持中文  解决文件名乱码问题out.setEncoding("GBK");int len;while ((len = in.read(buf)) > 0) {out.write(buf, 0, len);}} catch (Exception e) {log.error(String.format("压缩文件出错 01:{}%s", e));} finally {out.closeEntry();assert in != null;in.close();//删除源文件FileUtil.del(file);}}} catch (IOException e) {log.error(String.format("压缩文件出错 02:{}%s", e));}finally {if(in!=null){try {in.close();} catch (IOException e) {log.error(String.format("压缩文件出错 02:{}%s", e));}}}}/*** 从浏览器下载压缩文件* @param file 文件对象* @param response 响应对象* @param isDelete 是否删除源文件* @throws IOException io异常*/public static void downloadZipFile(File file, HttpServletResponse response, boolean isDelete) throws IOException{OutputStream toClient = null;try(InputStream inputStream =new FileInputStream(file)) {response.reset();toClient = new BufferedOutputStream(response.getOutputStream());response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=UTF-8");response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(file.getName(), StandardCharsets.UTF_8));int len;byte[] buffer = new byte[1024];while((len=inputStream.read(buffer))>0){toClient.write(buffer,0,len);}toClient.flush();} catch (IOException ex) {log.error(ex.getMessage());} finally{if(toClient!= null){toClient.close();}}//在所有流都关闭后再删除文件if(isDelete && file.exists()) {FileUtil.del(file);}}
}

执行方法

java">package com.example.mybatismysql8demo.controller;import com.alibaba.excel.EasyExcelFactory;
import com.alibaba.excel.ExcelWriter;
import com.alibaba.excel.support.ExcelTypeEnum;
import com.alibaba.excel.write.metadata.WriteSheet;
import com.example.mybatismysql8demo.excel.TemplateGoodsExcel;
import com.example.mybatismysql8demo.utils.ZipUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.math.BigDecimal;
import java.util.*;
import java.util.stream.Collectors;@Slf4j
@RestController
public class EasyExcelController {/*** 浏览器下载* @param response*/@RequestMapping(value = "easyExcelExport", method = RequestMethod.GET)private void browserDownload(HttpServletResponse response){//数据List<TemplateGoodsExcel> data = new ArrayList<>();data.add(new TemplateGoodsExcel("零食","辣条",new BigDecimal(10),100));data.add(new TemplateGoodsExcel("水果","葡萄",new BigDecimal(16),50));data.add(new TemplateGoodsExcel("水果","苹果",new BigDecimal(20),150));//按照分类分组Map<String, List<TemplateGoodsExcel>> collect = data.stream().collect(Collectors.groupingBy(TemplateGoodsExcel::getGoodsCategory));//模版路径String templatePath = "E:\\模板\\商品.xls";//文件下载路径String path = "E:\\下载\\";//文件集合File[] fileArray = new File[collect.size()];//小标int index = 0;for (Map.Entry<String, List<TemplateGoodsExcel>> value : collect.entrySet()) {//判断文件夹是否存在File filePath = new File(path);if (!filePath.exists()) {filePath.mkdir();}//导出文件名String fileName = path +  value.getKey() + "_" + System.currentTimeMillis() + ".xls";//导出ExcelWriter excelWriter = EasyExcelFactory.write(fileName).excelType(ExcelTypeEnum.XLS).withTemplate(templatePath).build();WriteSheet writeSheet = EasyExcelFactory.writerSheet().build();//表格数据excelWriter.fill(value.getValue(), writeSheet);Map<String,Object> map = new HashMap<>(1);map.put("goodsName", value.getKey());excelWriter.fill(map, writeSheet);excelWriter.finish();fileArray[index] = new File(fileName);index++;}//打包文件名String zipPath = path + System.currentTimeMillis() + "_" + "物品信息.zip";//文件打包ZipUtil.zipFiles(fileArray, new File(zipPath));//浏览器下载File file = new File(zipPath);try {ZipUtil.downloadZipFile(file, response, true);} catch (IOException e) {System.out.println(e.getMessage());}}
}

在这里插入图片描述


http://www.ppmy.cn/devtools/23622.html

相关文章

C#上位机与S7-200Smart通信注意事项

S7-200SMART连接 问题描述 我们使用C#开发上位机和S7-200Smart系列PLC交互数据时&#xff0c;大多会用到Sharp7、Snap7之类的通信类库。有些通信类库默认的使用的是PG连接资源&#xff0c;而对于S7-200Smart来说&#xff0c;它的PG连接资源只有1个。 官网200smart提到的连接数…

leetcode1143. 最长公共子序列(ACM模式解法)

题目描述 给你一个序列X和另一个序列Z&#xff0c;当Z中的所有元素都在X中存在&#xff0c;并且在X中的下标顺序是严格递增的&#xff0c;那么就把Z叫做X的子序列。 例如&#xff1a;Z是序列X的一个子序列&#xff0c;Z中的元素在X中的下标序列为<1,2,4,6>。 现给你两个…

Aigtek:介电弹性体高压放大器在软体机器人研究中的应用

近年来软体机器人的研究成为目前机器人研究领域的热点&#xff0c;由于软体材料的自由度可以根据需求自由变化&#xff0c;因此软体机器人有着极高的灵活性&#xff0c;而且软体机器人因其材料的柔软性有着很好的人机交互性能和安全性。它的出现成功解决了传统的刚性机器人人机…

Java 设计模式(行为型)

文章目录 策略模式迭代器模式访问者模式观察者模式命令模式模板方法模式事件驱动模式责任链模式中介者模式状态模式 策略模式 策略模式是一种行为设计模式&#xff0c;它定义了一系列算法&#xff0c;将每个算法封装在独立的策略类中&#xff0c;并使它们可以互相替换。策略模…

第九周学习笔记DAY.1-反射

在计算机学科中&#xff0c;反射是指计算机程序在运行时可以访问、检测和修改它本身状态或行为的一种能力。通过Java的反射机制&#xff0c;程序员可以更深入地控制程序的运行过程&#xff0c;如在程序运行时对用户输入的信息进行验证&#xff0c;还可以逆向控制程序的执行过程…

整理好了!2024年最常见 100 道 Java基础面试题(十七)

上一篇地址&#xff1a;整理好了&#xff01;2024年最常见 100 道 Java基础面试题&#xff08;十六&#xff09;-CSDN博客 三十三、Java 中常见的异常有哪些&#xff1f; Java中常见的异常很多&#xff0c;它们主要分为两大类&#xff1a;受检查异常&#xff08;Checked Exce…

php反序列化逃逸

php反序列化逃逸 逃逸是php中反序列化时的恶意利用&#xff0c;以ctf为例演示 第一段演示 逃逸为ctf反序列化的内容&#xff0c;主要是对序列化对象进行过滤&#xff0c;其中替换串长度不一致&#xff0c;造成字符逃逸。攻击者可以构造恶意的payload&#xff0c;改变对象中的…

毕业答辩的提问怎么回复?

(1&#xff09;论文采用了哪些与本专业相关的研究方法 本论文采用了[定量研究/定性研究/混合方法研究]&#xff0c;包括[调查问卷、实验、案例分析、文献综述等]&#xff0c;以确保研究的全面性和可靠性。 &#xff08;2&#xff09;论文中的核心概念是什么&#xff1f; 论文…