当前位置: 首页 > news >正文

将 Workbook 输出流直接上传到云盘

如果不想将 Excel 文件保存到本地,而是希望直接将输出流上传到云存储(如阿里云OSS、腾讯云COS、七牛云等),可以采用以下方法:
在这里插入图片描述

文章目录

  • 1. 创建内存中的 Excel 输出流
  • 2. 上传到云存储的通用方法
  • 3. 具体云服务实现示例
    • 阿里云OSS实现
    • 腾讯云COS实现
    • 完整使用示例
  • 4. 注意事项
    • ​​内存管理​​:
    • 云存储配置​​:
    • 性能优化​​:
    • ​​错误处理​​:
    • 安全考虑​​:

1. 创建内存中的 Excel 输出流

import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import java.io.ByteArrayOutputStream;
import java.io.IOException;public class ExcelCloudUploader {public static byte[] createExcelInMemory(List<List<Object>> data) throws IOException {try (Workbook workbook = new XSSFWorkbook();ByteArrayOutputStream bos = new ByteArrayOutputStream()) {Sheet sheet = workbook.createSheet("Sheet1");// 填充数据到sheet...for (int i = 0; i < data.size(); i++) {Row row = sheet.createRow(i);List<Object> rowData = data.get(i);for (int j = 0; j < rowData.size(); j++) {Cell cell = row.createCell(j);Object value = rowData.get(j);// 设置单元格值...}}workbook.write(bos);return bos.toByteArray();}}
}

2. 上传到云存储的通用方法

import java.io.ByteArrayInputStream;public class CloudStorageService {public static String uploadToCloud(byte[] fileData, String fileName) {try (ByteArrayInputStream bis = new ByteArrayInputStream(fileData)) {// 这里使用具体的云存储SDK// 以下是伪代码,实际实现取决于您使用的云服务// 阿里云OSS示例// OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);// ossClient.putObject(bucketName, fileName, bis);// ossClient.shutdown();// 腾讯云COS示例// COSClient cosClient = new COSClient(new BasicCOSCredentials(secretId, secretKey), //     new ClientConfig(new Region(regionName)));// ObjectMetadata metadata = new ObjectMetadata();// metadata.setContentLength(fileData.length);// PutObjectRequest request = new PutObjectRequest(bucketName, fileName, bis, metadata);// cosClient.putObject(request);// cosClient.shutdown();// 七牛云示例// Auth auth = Auth.create(accessKey, secretKey);// UploadManager uploadManager = new UploadManager();// Response response = uploadManager.put(bis, fileName, auth.uploadToken(bucketName));return "https://your-cloud-domain.com/" + fileName;} catch (Exception e) {throw new RuntimeException("上传到云存储失败", e);}}
}

3. 具体云服务实现示例

阿里云OSS实现

import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import java.io.ByteArrayInputStream;public class AliyunOSSUploader {private static final String endpoint = "your-oss-endpoint";private static final String accessKeyId = "your-access-key-id";private static final String accessKeySecret = "your-access-key-secret";private static final String bucketName = "your-bucket-name";public static String uploadExcelToOSS(byte[] excelData, String objectName) {OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);try (ByteArrayInputStream bis = new ByteArrayInputStream(excelData)) {ossClient.putObject(bucketName, objectName, bis);return generateFileUrl(objectName);} catch (Exception e) {throw new RuntimeException("上传到OSS失败", e);} finally {if (ossClient != null) {ossClient.shutdown();}}}private static String generateFileUrl(String objectName) {// 生成可访问的URLreturn "https://" + bucketName + "." + endpoint + "/" + objectName;}
}

腾讯云COS实现

import com.qcloud.cos.COSClient;
import com.qcloud.cos.ClientConfig;
import com.qcloud.cos.auth.BasicCOSCredentials;
import com.qcloud.cos.model.ObjectMetadata;
import com.qcloud.cos.model.PutObjectRequest;
import com.qcloud.cos.region.Region;
import java.io.ByteArrayInputStream;public class TencentCOSUploader {private static final String secretId = "your-secret-id";private static final String secretKey = "your-secret-key";private static final String regionName = "your-region";private static final String bucketName = "your-bucket-name";public static String uploadExcelToCOS(byte[] excelData, String objectName) {COSClient cosClient = new COSClient(new BasicCOSCredentials(secretId, secretKey),new ClientConfig(new Region(regionName)));try (ByteArrayInputStream bis = new ByteArrayInputStream(excelData)) {ObjectMetadata metadata = new ObjectMetadata();metadata.setContentLength(excelData.length);metadata.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");PutObjectRequest request = new PutObjectRequest(bucketName, objectName, bis, metadata);cosClient.putObject(request);return cosClient.getObjectUrl(bucketName, objectName).toString();} catch (Exception e) {throw new RuntimeException("上传到COS失败", e);} finally {if (cosClient != null) {cosClient.shutdown();}}}
}

完整使用示例

public class ExcelCloudExportExample {public static void main(String[] args) {try {// 1. 准备数据List<List<Object>> data = prepareData();// 2. 在内存中创建Excelbyte[] excelData = ExcelCloudUploader.createExcelInMemory(data);// 3. 上传到云存储String fileName = "export_" + System.currentTimeMillis() + ".xlsx";// 选择一种云服务上传String fileUrl = AliyunOSSUploader.uploadExcelToOSS(excelData, fileName);// 或// String fileUrl = TencentCOSUploader.uploadExcelToCOS(excelData, fileName);System.out.println("Excel文件已上传,访问地址: " + fileUrl);} catch (Exception e) {e.printStackTrace();}}private static List<List<Object>> prepareData() {// 返回要导出的数据List<List<Object>> data = new ArrayList<>();// 添加表头data.add(Arrays.asList("ID", "姓名", "部门", "薪资"));// 添加数据行data.add(Arrays.asList(1, "张三", "技术部", 15000.00));data.add(Arrays.asList(2, "李四", "市场部", 12000.00));return data;}
}

4. 注意事项

​​内存管理​​:

对于大文件,考虑使用 SXSSFWorkbook 替代 XSSFWorkbook可以设置 ByteArrayOutputStream 的初始大小以减少扩容次数

云存储配置​​:

敏感信息(accessKey等)应该通过配置中心或环境变量获取考虑使用临时安全令牌(STS)提高安全性

性能优化​​:

可以并行处理数据生成和上传过程对于频繁操作,重用云存储客户端(但要注意线程安全)

​​错误处理​​:

添加重试机制应对网络波动记录详细的错误日志

安全考虑​​:

为上传的文件设置适当的ACL权限考虑对敏感数据在传输过程中加密
通过这种方式,您可以完全避免在本地生成临时文件,直接将Excel数据流式上传到云存储服务。

相关文章:

  • [python] 轻量级定时任务调度库schedule使用指北
  • Rocketmq Broker与队列关系,怎么存储的
  • PySide6 GUI 学习笔记——常用类及控件使用方法(常用控件调色板QPalette)
  • 【LUT技术专题】DnLUT代码解读
  • 进程——概念及状态
  • NHANES最新指标推荐:NHR
  • DP2 跳台阶【牛客网】
  • win版mysql8.0和redis,解压即用
  • YOLO模型初次训练体验(+实测)
  • 时态--07--过去完成時
  • 探秘「4+3原型驱动的交付模式」如何实现软件快速定制
  • 现代计算机图形学Games101入门笔记(十八)
  • 《算法笔记》11.8小节——动态规划专题->总结 问题 B: 拦截导弹
  • 第二届帕鲁杯时间折叠(TimeFold Paradox)
  • 2025年电工杯新规发布-近三年题目以及命题趋势
  • vLLM框架高效原因分析
  • 游戏开发实战(三):Python复刻「崩坏星穹铁道」嗷呜嗷呜事务所---源码级解析该小游戏背后的算法与设计模式【纯原创】
  • 【优秀三方库研读】在 quill 开源库中为什么封装 safe_fwrite,而不是直接使用系统 fwrite
  • Unity3D仿星露谷物语开发47之砍树时落叶特效
  • 四元数中 w xyz 的含义及应用
  • 受贿数额特别巨大、滥用职权,国家烟草专卖局原局长凌成兴一审被判十六年
  • 浙江台州女厅官林虹被决定逮捕,曾因直播带货广受关注
  • 王晋卿读《酒的精神》︱乏味时代的有味之思
  • 中公教育:现阶段在全力解决学员退费问题,部分地区历史退费已逐步出清
  • 当文徵明“相遇”莫奈:苏博将展“从拙政园到莫奈花园”
  • 4月中国常青游戏榜:32款游戏吸金近34亿元,腾讯、网易占半壁江山,《原神》再跌出前十