导出多个Excel文件并打包为压缩包下载

问题简述

之前系统里做的导出都是千篇一律的所有文件导在一个excel里,有现成的工具,现成的逻辑。

突然有那么一天,一切都不再现成了,我得把数据们导出为压缩包,一人一个Excel谁也不干涉谁。研究和参考了一下网上大神们的思路和逻辑以及代码,最后做出一版符合现有需求和现有系统的接口。希望能帮到需要的、同为初级菜菜的兄弟姐妹。水平有限不足之处望大家批评指正,批评使人进步,进步使人涨薪

 

先上导出效果(名字保密啦,大概就是这个熊样)

 开始 撸起袖子干

思路

1.先在工作路径的适当位置搞一个临时文件夹

2.把所有组装好的数据丢进去

3.打包这个临时文件夹并把.zip文件也放在临时文件夹下面

4.压缩包输出流,临时文件夹及其里所有东西删除掉

编写工具类

package com.gdj.ggfw.serv.web.rest.util.ExcelUtils;
import java.io.*;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;
import javax.servlet.http.HttpServletResponse;
import cn.afterturn.easypoi.excel.ExcelExportUtil;
import cn.afterturn.easypoi.excel.entity.TemplateExportParams;
import org.apache.poi.ss.usermodel.Workbook;public class ZipExportUtils {/*** 导出--使用easypoi,有模板* @param sheetList、、* @param templatePath* @param filename* @return*/public static String getExportResult(List<List<Map<String, Object>>> sheetList, String templatePath, String filename) throws IOException {// 加载模板TemplateExportParams params = new TemplateExportParams(templatePath, true);// 组装数据Map<String, Object> excelMap = new HashMap<>();for (int i = 0; i < sheetList.size(); i++) {String sheetname = "sheet" + (i + 1);List<Map<String, Object>> list = sheetList.get(i);excelMap.put(sheetname, list);}// easypoi方法--得到workbookWorkbook workbook = ExcelExportUtil.exportExcel(params, excelMap);// workBook写入fileFileOutputStream fileOutputStream = new FileOutputStream(filename);workbook.write(fileOutputStream);fileOutputStream.close();return "导出成功";}/*** 将多个Excel打包成zip文件* @param srcfile* @param zipfile*/public static void zipFiles(List<File> srcfile, File zipfile) {byte[] buf = new byte[1024];try {ZipOutputStream out = new ZipOutputStream(new FileOutputStream(zipfile));for (int i = 0; i < srcfile.size(); i++) {File file = srcfile.get(i);FileInputStream in = new FileInputStream(file);out.putNextEntry(new ZipEntry(file.getName()));int len;while ((len = in.read(buf)) > 0) {out.write(buf, 0, len);}out.closeEntry();in.close();}out.close();} catch (IOException e) {e.printStackTrace();}}/*** 输出文件流以及关闭闭流;*/public static void closeFile(HttpServletResponse response,String serverPath, String str) {try {String path = serverPath +"/"+ str;File file = new File(path);if (file.exists()) {FileInputStream inputStream = null;try {inputStream = new FileInputStream(file);byte[] data = new byte[(int) file.length()];int length = inputStream.read(data);inputStream.close();response.setContentType("application/zip");OutputStream stream = response.getOutputStream();stream.write(data);stream.flush();stream.close();} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}} else {response.sendRedirect("../error.jsp");}} catch (IOException e) {e.printStackTrace();}finally{File file1=new File(serverPath);// 删除临时目录deleteExcelPath(file1);}}/*** 删除目录下所有的文件;* @param file*/public static boolean deleteExcelPath(File file){String[] files = null;if(file != null){files = file.list();}if(file.isDirectory()){for(int i = 0; i < files.length; i ++){boolean bol = deleteExcelPath(new File(file,files[i]));if(bol){System.out.println("删除成功!");}else{System.out.println("删除失败!");}}}return file.delete();}
}

 

控制层代码

     /*** 导出(压缩包)* @param response* @param ids* @return*/@PutMapping("/exportZip")@Timedpublic void exportProContractManagement(HttpServletResponse response , @RequestBody List<String> ids) throws IOException {// 加载模板String templatePath = "xxx/xxx.xls";// 设置下载excel的临时文件夹String dirId = UUID.randomUUID().toString();MultipartConfigFactory multipartConfigFactory = new MultipartConfigFactory();//获取程序当前路径(当前工作目录)String serverPath = System.getProperty("user.dir") + "/" + dirId;File fileTemp = new File(serverPath);if(!fileTemp.exists()){fileTemp.mkdirs();}multipartConfigFactory.setLocation(serverPath);multipartConfigFactory.createMultipartConfig();serverPath = serverPath.replace('\\', '/');// 声明一个集合,用来存放多个Excel文件路径及名称List<File> srcfile = new ArrayList<File>();// 得到路径下的文件,如果不存在创建文件夹File file = new File(serverPath);if (!file.exists()) {file.mkdir();}// 打印日志logger.debug("\n"+"临时路径---------------------------" + serverPath);// 组装数据List<List<Map<String, Object>>> sheetList = null;for(int i = 0 ; i < ids.size() ; i ++){// 单条数据查询(service层中获取数据并组装完成,此处不赘述)sheetList = managementService.exportProContractManagement(ids.get(i));if (sheetList.size() == 0) {// 删除临时路径(为防止报错后临时文件夹仍存在于工作目录,这里需要删除临时文件夹)boolean b = ZipExportUtils.deleteExcelPath(file);throw new BadRequestAlertException("请确认有可导出数据!", ENTITY_NAME, "NoExists");} else {// 设置每个Excel的名称String filename = serverPath + "/" +sheetList.get(0).get(0).get("contractName")+".xls";ZipExportUtils.getExportResult(sheetList, templatePath, filename);// 组装数据Map<String, Object> excelMap = new HashMap<>();String sheetname = "sheet"  + 1;excelMap.put(sheetname, sheetList);String encodedfileName = new String(filename.getBytes(), "UTF-8");// 存放到文件集合中srcfile.add(new File(encodedfileName));}}// 设置压缩包路径File zipfile = new File(serverPath + "/" + "单项目业绩" + ".zip");// 实现将多个excel打包成zip文件ZipExportUtils.zipFiles(srcfile, zipfile);// 打印日志logger.debug("\n"+"打包成功---------------------------" );// 实现将压缩包写入流中,并删除临时文件中的压缩包及文件ZipExportUtils.closeFile(response, serverPath, "单项目业绩" + ".zip");logger.debug("\n"+"压缩成功并删除临时文件---------------------------" );}

总结

大神们的代码千千万,放在自己系统里就是不好使。所以还是要动脑子,思路逻辑捋清楚,不然真的做无用功

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/1379821.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

office安装包百度云

包含了office2010&#xff0c;office2013&#xff0c;office2016&#xff0c;office2019&#xff0c;office2021以及 新的office安装包 百度云网盘分享office 安装教程&#xff1a; 1安装前&#xff0c; 解压完成后&#xff0c;找到Setup.exe并双击 2等待安装&#xff0c;过程…

excel哪个版本好用,应该怎么选择

excelexcel哪个版本最好用&#xff1f;Excel软件是上班族必备的电脑办公神器&#xff0c;它带来了专业的数据整理和可视化随着excel的版本更新&#xff0c;可以使用的excel版本越来越多&#xff0c;让你的数据信息更加简洁直观那么&#xff0c;哪个版本的excel软件更有用呢 一…

R之Excel文件读取与程序包的安装调用

目录 方法一 方法二 1.用命令安装 2.从下拉菜单安装 三、加载所需安装包 方法一 方法二 四、使用新程序包读取数据 方法一 另存为 .csv 文件 这是wps的另存为 然后选择位置&#xff0c;重命名或更改格式为 .csv 这是excel 的另存为 文件 —— 另存为 —— 选择位置 …

spark 图计算 助力解决 dataframe中的链式依赖

链式依赖说明 name newName a b c d b c 我们需要的结果 即我们可以支持获取到链式转换的 起点 重点 以及链式的中间转换过程顺序数组. 特别说明: 出版只支持 单向 无分叉的图,其他复杂场景暂时未测试. 场景举例: 比如某件商品价格变化,我们需要知…

基础计算机算法函数,算法基础入门概述

著名计算机科学家沃思(NiklausWirth)提出一个公式&#xff1a;算法 数据结构 程序&#xff0c;其中算法是程序的灵魂。 01算法的定义及特性 在数学和计算机科学/算学之中&#xff0c;算法/演算法/算则法(algorithm)为一个计算的具体步骤&#xff0c;常用于计算、数据处理和自…

MapReduce 论文阅读笔记 MapReduce 简介

论文&#xff1a; MapReduce: Simplified Data Processing on Large Clusters Jeffrey Dean and Sanjay Ghemawat Google https://pdos.csail.mit.edu/6.824/papers/mapreduce.pdf MapReduce 是一种分布式系统中处理大数据方法。他提出是在 2004&#xff0c; jeff dean 和 Sanj…

2017 CS231n学习笔记(三)----损失函数和最优化(Loss Functions and Optimization )

video&#xff1a;https://study.163.com/course/courseMain.htm?courseId1004697005 slides&#xff1a;http://cs231n.stanford.edu/slides/2017/cs231n_2017_lecture3.pdf course notes&#xff1a;http://cs231n.github.io/ 文章所有内容来自Stanford university 课程 CS2…

时间和空间复杂度分析

前言 对于数据结构相关的博客文章&#xff0c;我是根据大学本科阶段《数据结构和算法》课程的内容和王争老师在即刻时间上的《数据结构和算法之美》系列课程&#xff08;墙裂推荐&#xff09;进行了一些排版参考和笔记性梳理。这些文章作为笔记总结&#xff0c;一方便是为了夯…

INT303 Big Data 个人笔记

又来到了经典半个月写一个学期内容的环节 目前更新至Lec{14}/Lec14 依旧是不涉及代码&#xff0c;代码请看学校的jupyter notebook~ Lec1 Introduction 介绍课程 TopicRangeTopic 1: Introduction to Big Data AnalyticsLec1~Lec3Topic2: Big data collection and visualiza…

日撸 Java 三百行(21 天: 二叉树及其基本操作)

注意&#xff1a;这里是JAVA自学与了解的同步笔记与记录&#xff0c;如有问题欢迎指正说明 目录 前言 一、一对多的结构&#xff1a;树形结构 二、二叉树 1.二叉树的体现运用 2.二叉树存储 三、二叉树遍历 1.树遍历的递归思想中的“三角抉择” 2.树的前、中、后序遍历…

C语言每日一练 —— 第21天:算法的应用

文章目录 前言一、算法简介1、推荐算法2、最短路算法3、最值算法4、排序算法5、压缩算法6、加密算法 二、为什么要学算法1、面试时2、工作中 三、算法能给我们带来什么能力的提升1、抽象问题的能力2、解决问题的能力3、编写代码的能力4、调试能力1&#xff09;画图2&#xff09…

C语言基础学习

**1.2 C语言程序设计入门三步骤 程序设计入门三步骤&#xff1a; &#xff08;1&#xff09;安装软件并开发HelloWorld程序。 &#xff08;2&#xff09;掌握基本的输入输出方法。 &#xff08;3&#xff09;理解该语言中程序的基本结构。 1.2.1 安装软件并开发第一个HelloWo…

BP算法Java实现

我们上次已经把公式给推导了出来。还举了例子&#xff0c;不懂的理论的点击这里&#xff0c;老师的代码   这回我们将要用Java进行初步实现&#xff0c;这个代码是我参考老师的&#xff0c;里面附带了详细的注解。要成功运行需要一些包&#xff0c;需要的可以联系我。 public…

关系代数和SQL语法

数据分析的语言接口 OLAP计算引擎是一架机器&#xff0c;而操作这架机器的是编程语言。使用者通过特定语言告诉计算引擎&#xff0c;需要读取哪些数据、以及需要进行什么样的计算。编程语言有很多种&#xff0c;任何人都可以设计出一门编程语言&#xff0c;然后设计对应的编译…

优雅的对象

最近一口气读完了二百多页的《Elegant Objects》。可能因为整理自博客所以排版一般,而且才二百多页定价却40多刀。但读过之后发现超值,甚至还想去买第二卷。作者观点大多比较激进,对自己的理念异常坚定,所以经常使用诸如“绝对不要使用XXX”、“记住XXX,就这样,句号”。但…

深入理解Java 8 Lambda

关于 深入理解 Java 8 Lambda&#xff08;语言篇——lambda&#xff0c;方法引用&#xff0c;目标类型和默认方法&#xff09;深入理解 Java 8 Lambda&#xff08;类库篇——Streams API&#xff0c;Collector 和并行&#xff09;深入理解 Java 8 Lambda&#xff08;原理篇——…

自然语言处理中注意力机制综述

https://www.toutiao.com/a6655120292144218637/ 目录 1.写在前面 2.Seq2Seq 模型 3.NLP中注意力机制起源 4.NLP中的注意力机制 5.Hierarchical Attention 6.Self-Attention 7.Memory-based Attention 8.Soft/Hard Attention 9.Global/Local Attention 10.评价指标 11.写在后面…

【深度学习基础】从零开始的炼丹生活00——机器学习数学基础以及数值计算数值优化方法

正值假期&#xff0c;决定恶补机器学习、深度学习及相关领域&#xff08;顺便开个博客&#xff09;。首先学习一下数学基础以及数值计算的方法&#xff08;主要参考《深度学习》&#xff09; 一、数学基础 这里简单复习一下机器学习相关的数学1.线性代数 范数 衡量一个向量的…

“泰迪杯”挑战赛 -利用非侵入式负荷检测进行高效率数据挖掘(完整数学模型)

目录 1 研究背景与意义 2 变量说明 3 问题分析 4 问题一 4.1 数据预处理 4.1.1 降噪处理 4.1.2 数据变换 4.2 负荷特征分析 4.2.1 暂态特征 4.2.2 稳态特征 5 问题二 5.1 相似度与权系数 5.2 模型建立 5.3 模型求解 6 问题三 6.1 事件检测算法 6.2 模型建立 6.3 模型求解…

37%原则如何优化我们做决定的时间

当需要百(千&#xff0c;万…)里挑一时&#xff0c;需要权衡最优解和效率&#xff0c;有一个37%原则比较有趣。 整个择优过程分为两个阶段&#xff1a; 观望&#xff1a;在前面 k k k个候选者中冒泡记录最优者 p p p&#xff0c;其分数为 V p V_p Vp​&#xff0c;但并不选择…