批量导出导入数据及附件文件ZIP包_导出压缩包 ,压缩包里面要包含查询的数据生成的excel 还有服务器上存储的资料文

img
img

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

1. 列表数据导出到本地excel文件

		String path = profile + "/temp/" + DateUtils.dateTimeNow();
        File file = new File(path);
        if (file.mkdirs()) {
            System.out.println("文件夹创建成功!创建后的文件目录为:" + file.getPath());
        }
        //1. 输出Excel文件
        HSSFWorkbook workbook = new HSSFWorkbook();
        HSSFSheet sheet = workbook.createSheet("sheet");
        String fileName="XX数据导出.xls";
        String savePath= file.getPath() + File.separator +fileName;
        OutputStream os = new FileOutputStream(savePath);
        //响应到客户端(即浏览器端直接弹出下载连接的方式)需要用response获取流
        //this.setResponseHeader(response, filename);
        //OutputStream os = response.getOutputStream();
        List<HashMap> dataList = new ArrayList<>();
        try{
            // 表头
            this.createExcelTitle(workbook, sheet);
            // 查询条件
            HashMap param = this.buildQueryParams(params);
            dataList = shareRegisterMapper.shareList(param);
            if (CollectionUtils.isEmpty(dataList)){
                return;
            }
            this.dealAssetData(dataList, sheet);
            // 处理子表数据
            this.dealAssetDetailData(dataList,workbook);
            workbook.write(os);
            os.flush();
            os.close();
        }catch(Exception e) {
            e.printStackTrace();

        }finally {
            if (os != null) {
                os.flush();
                os.close();
            }
            workbook.close();
        }

2. 下载附件信息

在上一步生成的Excel文件路径下新建files文件夹,里面存放附件

public void downloadFile(List<HashMap> dataList) throws Exception {
	String urlPrefix = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort() + request.getContextPath();
	String savePath = file.getPath() + File.separator + "/files";
        OutputStream os = null;
        InputStream is = null;
        int i=0;
        try {
            for (HashMap data : dataList) {
                if (data == null || data.get("FILES") == null){
                    continue;
                }
                List<ZsglFileEntity> entityList = new ArrayList<>();
                String[] fileArray = data.get("FILES").toString().split(",");
                List idList = Arrays.asList(fileArray);
                entityList.addAll(fileMapper.selectByIds(idList));
                if (CollectionUtils.isNotEmpty(entityList)){
                    for (ZsglFileEntity file : entityList){
                        if ( file.getFssFileId() == null){
                            continue;
                        }
                        String fileUrl = urlPrefix + "/fss/download/" + file.getFssFileId();
                        // 构造URL
                        URL url = new URL(fileUrl);
                        // 打开连接
                        URLConnection con = url.openConnection();
                        //设置请求超时为5s
                        con.setConnectTimeout(5 \* 1000);
                        // 输入流
                        is = con.getInputStream();
                        File tempFile = new File(savePath + "/"+file.getFileName());
                        // 校验文件夹目录是否存在,不存在就创建一个目录
                        if (!tempFile.getParentFile().exists()) {
                            tempFile.getParentFile().mkdirs();
                        }
                        os = new FileOutputStream(tempFile);
                        is = con.getInputStream();
                        con.getHeaderFields();
                        IOUtils.copy(is, os);
                        System.out.println("下载完成");
                    }
                    entityList.clear();
                }
            }
        }catch (IOException e){
            System.err.println(e);
        }finally {
            IOUtils.closeQuietly(is);
            IOUtils.closeQuietly(os);
        }
    }

3. 生成压缩文件(浏览器下载)

        response.setCharacterEncoding("UTF-8");
        response.setContentType("multipart/form-data");
        response.setHeader("content-disposition", "attachment;filename=" + "XX数据导出.zip");
        ZipOutputStream zos = new ZipOutputStream(response.getOutputStream());
        try {
            File[] sourceFiles = file.listFiles();
            if (null == sourceFiles || sourceFiles.length < 1) {
                System.out.println("待压缩的文件目录:" + "里面不存在文件,无需压缩.");
            } else {
                for (int i = 0; i < sourceFiles.length;i++){
                    File srcFile = sourceFiles[i];
                    if (srcFile.isDirectory()){
                        File[] imageSourceFiles = srcFile.listFiles();
                        if (null == imageSourceFiles || imageSourceFiles.length < 1){
                            continue;
                        }
                        for (File imageFile : imageSourceFiles){
                            compress(zos,imageFile,srcFile.getName()+"/");
                        }
                    } else {
                        compress(zos,srcFile,"");
                    }
                }
            }
        }catch (Exception e){
            e.printStackTrace();
        } finally {
            //关闭流
            try {
                if(null != zos) {
                    zos.close();
                }
            } catch (IOException e){
                e.printStackTrace();
            }
        }

其中的压缩方法如下:

public void compress(ZipOutputStream out,File sourceFile,String base) throws Exception
    {
        out.putNextEntry( new ZipEntry(base+sourceFile.getName()) );
        FileInputStream fos = new FileInputStream(sourceFile);
        BufferedInputStream bis = new BufferedInputStream(fos);
        int tag;
        System.out.println(base);
        //将源文件写入到zip文件中
        while((tag=bis.read())!=-1) {
            out.write(tag);
            out.flush();
        }
        out.closeEntry();
        bis.close();
        fos.close();
    }

4. 删除临时目录

public void deleteDirectory(File file) {
        File[] list = file.listFiles();  //无法做到list多层文件夹数据
        if (list != null) {
            for (File temp : list) {     //先去递归删除子文件夹及子文件
                deleteDirectory(temp);   //注意这里是递归调用
            }
        }
        if (!file.delete()) {     //再删除自己本身的文件夹
            logger.error("文件删除失败 : %s%n", file);
        }
    }

二、导入ZIP包

1. 上传zip包,解压到临时目录

这里开始想着在不解压的情况下读取里面的文件,结果没有走通。因为zip里面包含了子文件夹里面的附件信息需要解析。不解压直接解析文件适用于只需要解析zip包中第一层文件的场景,如果子文件夹下的文件也需要处理的话,最好解压后再处理。

public void unzip(ZipInputStream zipIn, String destDirectory) throws IOException {
        File destDir = new File(destDirectory);
        if (!destDir.exists()) {
            destDir.mkdirs();
        }
        ZipEntry entry = zipIn.getNextEntry();
        // 遍历Zip文件中的条目
        while (entry != null) {
            String filePath = destDirectory + File.separator + entry.getName();
            if (!entry.isDirectory()) {
                int index = entry.getName().indexOf("/");
                if (index > -1 && entry.getName().length() > index){


![img](https://img-blog.csdnimg.cn/img_convert/9206eb817e053ab679a2128b6af14f79.png)
![img](https://img-blog.csdnimg.cn/img_convert/58a39de6c0f06690a6d850be785040d6.png)

**网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**

**[需要这份系统化资料的朋友,可以戳这里获取](https://bbs.youkuaiyun.com/topics/618545628)**


**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**

)]

**网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**

**[需要这份系统化资料的朋友,可以戳这里获取](https://bbs.youkuaiyun.com/topics/618545628)**


**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值