2017-06-29 35 views
-1

Azureストレージにzipファイルがあり、その中にExcelファイルがあります。私はC#を使ってファイルをダウンロードせずにExcelファイルを読みたいと思っています。 私はMemoryStreamを使用しています。コードは次のとおりです。Azure Storageの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にあります。それはExcelを読み取ることができないので、私はStreamReaderをはテキストリーダーであることを読ん

:それはのようなので、何か非読み取り可能なテキストを示しています。 しかし、それに代わるものは何ですか?

など、別の方法では、Azureにあるzipファイル内のExcelファイルをどのように読み取ることができますか? ありがとうございます。

+1

xlsxファイルは、基本的にそれ自身がzipファイルです。 – stuartd

+0

なぜ、 'TextReader'や他の読者が.xlsファイルを開くのを期待していますか? Excelファイルは、XMLコンテンツを含む圧縮されたアーカイブです。それを開くには、EPPlusのようなExcelフレームワークを使用してください – jAC

+0

とにかくファイルをダウンロードする 'DownloadToStream'はありませんか? – stuartd

答えて

0

私はそれがExcelを読み取ることができないので、StreamReaderをはテキストリーダーであることを読みました。それに代わるものは何ですか?

あなたは、読み取り/書き込みXLSためNPOIを活用し、以下のように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、あなたのシナリオに基づいてそれを達成するための良い方法はありません。また、SpreadsheetLightまたはAspose.Cells for .NETなどを参照することもできます。

+0

答えをありがとうございますが、それもうまくいきませんでした。それはストリームを持つ例外を介して空です。 –

+0

サンプルのzipファイルでコードスニペットを更新しました。あなたの側でそれをテストすることができます。 –

関連する問題