前端上传excle在服务器保存地址,后端返回下载流

1.对于非加密excle文件,将文件读成二进制流返回

			ServletOutputStream out = null;
            FileInputStream in = null;
            try {
                in = new FileInputStream(new File(path));
                //设置文件ContentType类型
                response.setContentType("application/vnd.ms-excel");
                //设置文件头:最后一个参数是设置下载文件名
                response.setHeader("Content-Disposition", "attachment; filename=" + URLEncoder.encode(path, "UTF-8"));
                out = response.getOutputStream();
                // 读取文件流
                int len = 0;
                byte[] buffer = new byte[1024 * 10];
                while ((len = in.read(buffer)) != -1) {
                    out.write(buffer, 0, len);
                }
                out.flush();
            }
            catch (Exception e) {
                logger.error("responseFileStream error:" + e.toString());
            } finally {
                    out.close();
                    in.close();
            }

2.对于加密excle文件,直接读二进制流读不出来,可以用WorkbookFactory读取数据,此方法对于加密不加密excle都可以转成流,但是对于加密文件,返回给前端下载后的文件不需要密码也可以打开

			OutputStream os = null;
            FileInputStream in = null;
            Workbook wb=null;
            try {
                in = new FileInputStream(new File(emailConfig.getTaxesQueryFilePath()+"/"+path));
                //设置文件ContentType类型
                response.setContentType("application/vnd.ms-excel");
                //设置文件头:最后一个参数是设置下载文件名
                response.setHeader("Content-Disposition", "attachment; filename=" + URLEncoder.encode(path, "UTF-8"));
                os = response.getOutputStream();
                wb = WorkbookFactory.create(in, password);
                //调取response对象中的OutputStream对象
                wb.write(os);
                os.flush();
                os.close();
            }
            catch (Exception e) {
                logger.error("excel转流异常" + e);
            } finally {
                os.close();
                in.close();
                wb.close();
            }

3.对于需要保证安全性的加密文件,需要采用easyExcle将获取文件数据,然后将数据写入response流

		 //根据地址获取excel表数据
            InputStream fis = new FileInputStream(path);
            ExcelListener<Map<String,Object>> listener = new ExcelListener<Map<String,Object>>();
            ExcelReader excelReader = EasyExcelFactory.read(fis, null, listener).password(password).headRowNumber(0).build();
            excelReader.readAll();
            List<Map<String,Object>> list = listener.getDatas();
            //一定要记得关闭流
            excelReader.finish();
            //将map类型数据转化为对象
            ArrayList<TaskTaxesQuery> taxesQueryList = new ArrayList<>();
            for (int i = 1; i < list.size(); i++) {
                Map<String, Object> map = list.get(i);
                TaskTaxesQuery taskTaxesQuery = new TaskTaxesQuery(
                        map.get(0).toString(),map.get(1).toString(),map.get(2).toString(),map.get(3).toString(),
                        map.get(4).toString(),map.get(5).toString(),map.get(6).toString(),map.get(7).toString()
                );
                taxesQueryList.add(taskTaxesQuery);
            }
            //将数据写入response返回流
            response.setContentType("application/vnd.ms-excel");
            response.setCharacterEncoding("UTF-8");
            response.setHeader("Content-Disposition", "attachment; filename=" + URLEncoder.encode(path , "UTF-8"));
            //构建excelWriter
            @Cleanup("finish") ExcelWriter writer = EasyExcel
                    //将数据映射到TaskTaxesQuery实体类并响应到浏览器
                    .write(new BufferedOutputStream(response.getOutputStream()),TaskTaxesQuery.class)
                    //自动关闭输出流
                    .autoCloseStream(Boolean.TRUE)
                    //excel版本,强烈建议导出07版excel,因为省内存
                    .excelType(ExcelTypeEnum.XLS)
                    //是否需要表头
                    .needHead(Boolean.TRUE)
                    //设置excel保护密码
                    .password(password)
                    //构建
                    .build();
            //初始化sheet
            WriteSheet writeSheet = EasyExcel.writerSheet().build();
            writeSheet.setSheetName(path);
            //导出excel,注意导出结束要finish
            writer.write(taxesQueryList,writeSheet);

版权声明:本文为gkkljy原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。