2017-06-29 92 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文件更新了代碼片段,您可以在您身邊測試它。 –

相關問題