easy excel 分页查询数据并上传文件服务器返回链接

背景

之前看到公司的excel下载是先分页查询再上传到obs(华为云服务器),最后返回链接的,最近在学习easy excel特意记录一下。

目的

实现easy excel 分页查询数据并上传文件服务器返回链接

参考链接

这里

实现代码

点击查看代码
@GetMapping("downloadOssUrl")
    @ResponseBody
    public HeaderResponse downloadOssUrl(HttpServletResponse response) throws IOException {
        String fileName = URLEncoder.encode("测试", "UTF-8").replaceAll("\\+", "%20");
        File file = new File( fileName+ ".xlsx");
        FileOutputStream fileOutputStream=null;
        try {
            fileOutputStream = new FileOutputStream(file);
        } catch (FileNotFoundException e) {
            System.out.println("文件找不到异常");
            return null;
        }
                try (
                ExcelWriter excelWriter = EasyExcel.write(fileName, DownloadData.class).build()) {
            // 这里注意 如果同一个sheet只要创建一次
            WriteSheet writeSheet = EasyExcel.writerSheet("模板").build();
            // 去调用写入,这里我调用了五次,实际使用时根据数据库分页的总的页数来
            for (int i = 0; i < 5; i++) {
                // 分页去数据库查询数据 这里可以去数据库查询每一页的数据
                List<DownloadData> data = data();
                excelWriter.write(data, writeSheet);
            }

        }

// 文件上传到oss
        FileInputStream fileInputStream = new FileInputStream(file);
        ObsClient obsClient = null;
        HeaderResponse response1=null;
        try {
            String endPoint = "http://obs.cn-east-3.myhuaweicloud.com";
            String ak = "";
            String sk = "";
            // 创建ObsClient实例
            obsClient = new ObsClient(ak, sk, endPoint);
            // 调用接口进行操作,例如上传对象
             response1 = obsClient.putObject("dev-test-obs", "测试.xlsx", fileInputStream);  // localfile为待上传的本地文件路径,需要指定到具体的文件名
            System.out.println(response1);
        } catch (ObsException e) {
            System.out.println("HTTP Code: " + e.getResponseCode());
            System.out.println("Error Code:" + e.getErrorCode());
            System.out.println("Error Message: " + e.getErrorMessage());

            System.out.println("Request ID:" + e.getErrorRequestId());
            System.out.println("Host ID:" + e.getErrorHostId());
        } finally {
            // 关闭ObsClient实例,如果是全局ObsClient实例,可以不在每个方法调用完成后关闭
            // ObsClient在调用ObsClient.close方法关闭后不能再次使用
            if (obsClient != null) {
                // obsClient.close();
            }
        }
        
        // 上传完成后删除本地文件
        file.delete();
        
        return response1;
    }

测试一下

请求调用:http://127.0.0.1:8000/downloadOssUrl

存在问题

代码执行完成发现项目目录下有一个excel,这个是很没有必要的

修复方案

就不用file,用ByteInputStream

点击查看代码
    @GetMapping("downloadOssUrl")
    @ResponseBody
    public HeaderResponse downloadOssUrl(HttpServletResponse response) throws IOException {
        String fileName = URLEncoder.encode("测试", "UTF-8").replaceAll("\\+", "%20");
        ByteArrayOutputStream out = new ByteArrayOutputStream();
        try (
                ExcelWriter excelWriter = EasyExcel.write(out, DownloadData.class).build()) {
            // 这里注意 如果同一个sheet只要创建一次
            WriteSheet writeSheet = EasyExcel.writerSheet("模板").build();
            // 去调用写入,这里我调用了五次,实际使用时根据数据库分页的总的页数来
            for (int i = 0; i < 5; i++) {
                // 分页去数据库查询数据 这里可以去数据库查询每一页的数据
                List<DownloadData> data = data();
                excelWriter.write(data, writeSheet);
            }
        }
// 文件上传到oss
        InputStream fileInputStream = new ByteInputStream(out.toByteArray(), out.size());
//        MultipartFile multipartFile = new MockMultipartFile(file.getName(), file.getName(), ContentType.APPLICATION_OCTET_STREAM.toString(), fileInputStream);
        ObsClient obsClient = null;
        HeaderResponse response1 = null;
        try {
            String endPoint = "http://obs.cn-east-3.myhuaweicloud.com";
            String ak = "EWGYXHBAMGH2GMUTGFFZ";
            String sk = "477LboFMzhzHPvPMN4p4B5fDopUhdCON0WsC49QB";
            // 创建ObsClient实例
            obsClient = new ObsClient(ak, sk, endPoint);
            // 调用接口进行操作,例如上传对象
            response1 = obsClient.putObject("dev-test-obs", "测试.xlsx", fileInputStream);  // localfile为待上传的本地文件路径,需要指定到具体的文件名
            System.out.println(response1);
        } catch (ObsException e) {
            System.out.println("HTTP Code: " + e.getResponseCode());
            System.out.println("Error Code:" + e.getErrorCode());
            System.out.println("Error Message: " + e.getErrorMessage());

            System.out.println("Request ID:" + e.getErrorRequestId());
            System.out.println("Host ID:" + e.getErrorHostId());
        } finally {
            // 关闭ObsClient实例,如果是全局ObsClient实例,可以不在每个方法调用完成后关闭
            // ObsClient在调用ObsClient.close方法关闭后不能再次使用
            if (obsClient != null) {
                // obsClient.close();
            }
        }
        return response1;
    }
posted @ 2023-04-07 11:41  小陈子博客  阅读(147)  评论(0编辑  收藏  举报