2015-04-28 72 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); 
} 
相关问题