2017-06-29 67 views
-1

我在Azure存储中有一个zip文件,里面有一个Excel文件。我想读取excel文件,而不用使用C#下载文件。 我正在使用MemoryStream。代码是:在Azure存储中的Zip中读取Excel文件。 C#

public void ReadZipStream(CloudBlockBlob blockBlob) 
{ 
    using (var msZippedBlob = new MemoryStream()) 
    { 
     blockBlob.DownloadToStream(msZippedBlob); 

     using (ZipArchive zip = new ZipArchive(msZippedBlob)) 
     { 
      foreach (ZipArchiveEntry entry in zip.Entries) 
      { 
       if (entry.FullName.EndsWith(".xlsx", StringComparison.OrdinalIgnoreCase)) 
       { 
        using (StreamReader sr = new StreamReader(entry.Open())) 
        { 
         // sr 
        } 
       } 
      } 
     } 
    } 
} 

ZipArchive的工作正常,它显示了zip文件中的所有数据。 问题在于SteamReader。它显示了一个非可读的文本所以像:

我读到,StreamReader的是一个文本阅读器,因此它不能读取Excel中。 但它有什么替代呢?

或者以另一种方式,我如何读取位于Azure中的zip文件中的Excel文件? 谢谢。

+1

xlsx文件本质上是一个zip文件。 – stuartd

+0

为什么期望一个'TextReader'或任何其他读者打开一个.xls文件? Excel文件是带有一些XML内容的压缩档案。要打开它,请使用像EPPlus – jAC

+0

这样的excel框架。是不是'DownloadToStream'下载文件? – stuartd

回答

0

我读到StreamReader是一个文本阅读器,所以它无法读取Excel。但是它有什么选择呢?

你可以利用NPOI进行读/写XLS,XLSX如下:

CloudBlockBlob zipblob = new CloudBlockBlob(new Uri("https://brucechen.blob.core.windows.net/brucechen/LogTable.zip")); 
using (var msZippedBlob = new MemoryStream()) 
{ 
    zipblob.DownloadToStream(msZippedBlob); 
    using (ZipArchive zip = new ZipArchive(msZippedBlob)) 
    { 
     foreach (ZipArchiveEntry entry in zip.Entries) 
     { 
      if (entry.FullName.EndsWith(".xlsx", StringComparison.OrdinalIgnoreCase)) 
      { 
       using (var stream = entry.Open()) 
       { 
        var wk = new XSSFWorkbook(stream); //HSSFWorkbook for xls 
        var sheet = wk.GetSheetAt(0); 
        IRow row = sheet.GetRow(0); 
        for (int i = 0; i <= sheet.LastRowNum; i++) 
        { 
         row = sheet.GetRow(i); 
         if (row != null) 
         { 
          for (int j = 0; j < row.LastCellNum; j++) 
          { 
           string value = row.GetCell(j).ToString(); 
           Console.Write(value.ToString() + " "); 
          } 
          Console.WriteLine("\n"); 
         } 
        } 
       } 
      } 
     } 
    } 
} 

结果

enter image description here

或以另一种方式,我该怎么读位于Azure中的zip文件中的Excel文件?

AFAIK,根据您的情况,没有更好的方法来实现它。此外,您还可以参考SpreadsheetLightAspose.Cells for .NET等。

+0

谢谢你的答案,但它也没有奏效。它通过一个异常,它是空的流。 –

+0

我已经用我的示例zip文件更新了代码片段,您可以在您身边测试它。 –