2015-04-28 104 views
0

我試圖找到一種方法來檢查通過網絡(使用HTTP URL)的Excel(XLS)文件的內容,如果內容(數據來自特定的單元格和表單名稱)很好,可以在本地保存。 我現在所做的是我下載文件,用Iterop檢查,如果內容不匹配,我刪除/刪除它。 我一直在考慮用BinaryReader獲取文件內容,並將其轉換爲FileStream,但沒有找到辦法做到這一點。 目前我還在檢查NPOI庫,但是到現在爲止還沒有找到一種方法來acomplish這...試圖讀取Excel(xls)文件,而無需先下載它

+0

XLS使用BIFF格式,我肯定會推薦一個庫來解析這個(是可以做到的,但它會需要一段時間,這取決於有多少信息寫解析器你想),但你需要找到一個接受流或字節[]。推薦圖書館的主題是 –

+0

你會建議有人寫一個自己的解析器,因爲推薦一個圖書館是脫離主題?如果這是一個規則,這是一個奇怪的。 – Denis

+0

關於圖書館推薦,我肯定會去NPOI。有人可以用SpreadsheetGear I asume來達到同樣的效果,但NPOI是開源的,我的POV的優點是什麼。 – Denis

回答

1

如果使用的是EPPlus庫可以通過一個Stream到構造函數的ExcelPackage

不幸的是,流需要支持查找操作,這就排除了直接傳遞Web響應流的問題。

你可以,但是,複製到MemoryStream如下:

var webRequest = HttpWebRequest.Create("http://spreadsheetpage.com/downloads/xl/worksheet%20functions.xlsx") as HttpWebRequest; 
var webResponse = webRequest.GetResponse(); 

using (var webResponseStream = webResponse.GetResponseStream()) 
using (var memoryStream = new MemoryStream()) 
{ 
    webResponseStream.CopyTo(memoryStream); 
    using (var excelPackage = new ExcelPackage(memoryStream)) 
    { 
     var value = excelPackage.Workbook.Worksheets.First().Cells[1, 1].Value; 
     //etc... 
    } 
} 
0

@Stewart_R感謝一個MemoryStream提示! 我只需要使用NPOI而不是EPPlus。 EPPlus庫僅適用於OOXML(我需要支持較舊的xls格式),但NPOI HSSFWorkbook構造函數也接受支持seek操作的流。 所以基本上解決方案是將HttpWebRequest響應流轉換爲MemoryStream,並使用MemoryStream作爲參數來初始化HSSFWorkbook構造函數。不幸的是,這個構造函數在編譯期間沒有錯誤地接受所有類型的流(比如System.IO.Stream),但是會產生一個關於缺少查找操作支持的運行時異常。無論如何,好事是MemoryStream工作正常(現在:))。 此代碼的工作對我來說:

using (var memoryStream = new MemoryStream()) 
{ 
    webResponseStream.CopyTo(memoryStream); 

    HSSFWorkbook workbook = new HSSFWorkbook(memoryStream); 
    HSSFSheet sheet = (HSSFSheet)workbook.GetSheetAt(0); 

    Console.WriteLine("Name of the sheet is: {0}", sheet.SheetName); 
    Console.ReadKey(true); 
} 
相關問題