试图读取Excel(xls)文件,而不必先下载它

我试图find一种方法来检查通过networking(使用HTTP URL)的Excel(XLS)文件的内容,如果内容(来自特定的单元格,和工作表名称的数据)罚款,将其保存在本地。 我现在所做的是我下载文件,用Iterop检查,如果内容不匹配,我删除/删除它。 我正在考虑用BinaryReader获取文件内容,而不是把它转换成FileStream,但是没有find办法做到这一点。 目前我还在检查NPOI图书馆,但直到现在还没有find办法来实现这一点…

如果使用EPPlus库,则可以将Stream传递给ExcelPackage的构造函数。

不幸的是,所述stream需要支持查找操作,这就排除了直接传递networking响应stream。

但是,您可以将其复制到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... } } 

@Stewart_R感谢您的MemoryStream提示! 我只需要使用NPOI而不是EPPlus。 EPPlus库只适用于OOXML(我需要支持较旧的xls格式),但是NPOI HSSFWorkbook构造函数也接受支持seek操作的stream。 所以基本上解决scheme是将HttpWebRequest响应stream转换为MemoryStream,并使用MemoryStream作为参数来初始化HSSFWorkbook构造函数。 不幸的是,这个构造函数在编译时会接受所有types的stream(比如System.IO.Stream)而没有错误,但是会产生一个关于缺less对seek操作支持的运行时exception。 无论如何,好事是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); }