【发布时间】:2021-09-29 18:07:01
【问题描述】:
我正在使用 azure-storage 依赖项来创建 azure 目录的引用 然后在本地系统中下载文件后,我可以使用 进行读写poi-ooxml 库 然后再次在 azure 存储中上传相同的文件。
我只是想删除这个本地下载的东西。有什么办法可以在不下载本地的情况下读写excel文件。
使用的依赖项。
<dependency>
<groupId>com.microsoft.azure</groupId>
<artifactId>azure-storage</artifactId>
<version>8.4.0</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>3.15</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>3.15</version>
</dependency>
代码
try {
CloudStorageAccount storageAccount = CloudStorageAccount.parse(storageConnectionString);
CloudBlobClient blobClient = storageAccount.createCloudBlobClient();
CloudBlobContainer container = blobClient.getContainerReference(containerName);
CloudBlobDirectory downloadDirectory = container.getDirectoryReference(dowloadDirectoryName);
for(ListBlobItem blobItem: downloadDirectory.listBlobs()) {
if(blobItem instanceof CloudBlockBlob) {
CloudBlockBlob cloudBlob = (CloudBlockBlob) blobItem;
File inputFile = new File(cloudBlob.getName());
cloudBlob.downloadToFile(inputFile.getAbsolutePath());
FileInputStream inputStream = new FileInputStream(inputFile);
Workbook workbook = new HSSFWorkbook(inputStream);
/*Workbook workbook = WorkbookFactory.create(inputFile);*/
Sheet sheet = workbook.getSheetAt(0);
log.info("Cell No 0 : "+sheet.getRow(0).getCell(0).getStringCellValue());
for (int i = 1; i <= sheet.getLastRowNum(); i++) {
Cell reasonLabel = sheet.getRow(i).createCell(2);
reasonLabel.setCellValue("Added one cell");
}
File outputFile = new File(cloudBlob.getName().split("\\.")[0]+"01.xls");
FileOutputStream outputStream = new FileOutputStream(outputFile);
workbook.write(outputStream);
outputStream.close();
workbook.close();
CloudBlobDirectory uploadDirectory = container.getDirectoryReference(uploadDirectoryName);
CloudBlockBlob uploadBlob = uploadDirectory.getBlockBlobReference(outputFile.getName());
FileInputStream fileInputStream = new FileInputStream(outputFile);
uploadBlob.upload(fileInputStream, outputFile.getTotalSpace());
fileInputStream.close();
outputFile.delete();
}
}
} catch(Exception ex) {
log.error(ex.getMessage());
throw ex;
}
【问题讨论】:
-
请编辑您的问题并包含您编写的代码。
-
也许您可以研究一下 lambda 或微软所说的任何东西?可能最好查看 azure api 文档。
-
Apache POI 将与
InputStream和OutputStream一起工作得非常愉快,就像与File一样 - 您只需要为您的 azure 存储系统找到一个库,为 blob 提供这些库跨度> -
仅供参考 Azure Blob 存储没有 目录 的概念,除非您正在访问文件共享(或使用 ADLS)。
-
CloudBlockBlob 有一个“downloadToStream”方法。请尝试使用它而不是“downloadToFile”。您可以使用该流来创建您的 Excel 文件。
标签: java spring-boot apache-poi azure-storage azure-blob-storage