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