尝试阅读Excel(xls)文件而无需先下载

时间:2015-04-28 16:33:49

标签: c# excel http npoi

我正在尝试通过网络(使用HTTP URL)检查excel(XLS)文件的内容,如果内容(来自特定单元格和工作表名称的数据)正常,则将其保存为localy 。 我现在做的是下载文件,用Iterop检查,如果内容不匹配,我删除/删除它。 我当时正在考虑使用BinaryReader获取文件内容,而不是将其转换为FileStream,但是没有找到方法来执行此操作。 目前我还在检查NPOI库,但到目前为止还没有找到方法来实现这个...

2 个答案:

答案 0 :(得分: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...
    }
}

答案 1 :(得分:0)

@Stewart_R感谢您提供MemoryStream提示! 我只需要使用 NPOI 而不是EPPlus。 EPPlus库仅适用于OOXML(我需要支持旧的xls格式),但NPOI HSSFWorkbook构造函数也接受支持搜索操作的流。 所以基本上解决方案是将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);
 }