【问题标题】:Read and write an excel file from Azure Blob Storage without downloading it to local file in Java从 Azure Blob 存储读取和写入 excel 文件,无需将其下载到 Java 中的本地文件
【发布时间】: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 将与 InputStreamOutputStream 一起工作得非常愉快,就像与 File 一样 - 您只需要为您的 azure 存储系统找到一个库,为 blob 提供这些库跨度>
  • 仅供参考 Azure Blob 存储没有 目录 的概念,除非您正在访问文件共享(或使用 ADLS)。
  • CloudBlockBlob 有一个“downloadToStream”方法。请尝试使用它而不是“downloadToFile”。您可以使用该流来创建您的 Excel 文件。

标签: java spring-boot apache-poi azure-storage azure-blob-storage


【解决方案1】:

这是我使用 NPOI 从 Azure blob 读取文件的灵魂

foreach (var blob in blobContainer.GetBlobs())
        {
            var blobClient = blobContainer.GetBlobClient(blob.Name);

            using MemoryStream memStream = new();
            blobClient.DownloadTo(memStream);
            memStream.Position = 0;
            var wb = new XSSFWorkbook(memStream);
            sheetName = wb.GetSheetAt(0).SheetName;
            sheet = (XSSFSheet)wb.GetSheet(sheetName);
}

【讨论】:

    猜你喜欢
    • 2019-10-16
    • 2020-05-15
    • 2021-04-01
    • 2015-12-30
    • 2020-11-11
    • 2021-12-08
    • 1970-01-01
    相关资源
    最近更新 更多