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

将 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数据流式上传到云存储服务。

http://www.xdnf.cn/news/7506.html

相关文章:

  • Apollo10.0学习——planning模块(8)之Frame类
  • 使用VGG-16模型来对海贼王中的角色进行图像分类分类
  • python打卡day31
  • SQLynx 团队协作实践:提升数据库开发效率的解决方案​
  • 4-5月份,思科,华为,微软,个别考试战报分享
  • Axure中使用动态面板实现图标拖动交换位置
  • C++23 新增扁平化关联容器详解
  • 微小店推客系统开发:构建全民营销矩阵,解锁流量增长密码
  • Java EE进阶1:导读
  • Spring Cloud Gateway深度解析:原理、架构与生产实践
  • 根据当前日期计算并选取上一个月和上一个季度的日期范围,用于日期控件的快捷选取功能
  • MySQL 8.0 OCP 英文题库解析(七)
  • 在 Git 中添加子模块(submodule)的详细步骤
  • kotlin 将一个list按条件分为两个list(partition )
  • 漏洞检测与渗透检验在功能及范围上究竟有何显著差异?
  • iOS Runtime与RunLoop的对比和使用
  • 基于flask+vue的电影可视化与智能推荐系统
  • PostgreSQL架构
  • HTML应用指南:利用POST请求获取全国申通快递服务网点位置信息
  • 华为云鲲鹏型kC2云服务器——鲲鹏920芯片性能测评
  • 【EI会议火热征稿中】第二届云计算与大数据国际学术会议(ICCBD 2025)
  • 程序运行报错分析文档
  • 使用 adb 命令截取 Android 设备的屏幕截图
  • CentOS 7连接公司网络配置指南
  • BERT 作为Transformer的Encoder 为什么采用可学习的位置编码
  • 打破次元壁,VR 气象站开启气象学习新姿势​
  • 使用SQLite Studio导出/导入SQL修复损坏的数据库
  • 面试突击:消息中间件之RabbitMQ
  • 流复备机断档处理
  • 开疆智能Profinet转RS485网关连接温度送变器配置案例