在ASP中加载上载的文件时发生EPPlus异常.NET 4.0



这是我的代码。它的目的是计算第一列中有文本的行数

ExcelWorksheet sheet = null;
using (ExcelPackage pkg = new ExcelPackage(new MemoryStream(_fileBytes)))
{
  sheet = pkg.Workbook.Worksheets[1];
}
int rows = sheet.Dimension.End.Row;
int count = 0;
for (int i = 1; i <= rows; ++i)
{
  if (!string.IsNullOrEmpty(sheet.Cells[i, 1].Text))
    ++count;
}

当我刚在调试器外运行代码时,我在sheet.Cells[i, 1].Text调用中得到一个异常:

Package object was closed and disposed, so cannot carry out operations 
on this object or any stream opened on a part of this package.

当我使用调试器逐步完成它时,我会得到相同的异常。。。除非我的手表窗口中有这个:sheet.Cells[1, 1].Text。如果我在初始化sheet对象之前对代码运行调试器(即按F5),我会得到异常。如果我逐步通过在我的监视窗口中剪切的代码,没有例外。该代码工作得非常完美。"监视"窗口正确显示第一个单元格的内容。什么东西?

您得到异常是因为您试图访问using语句之外的ExcelPackage的工作表(处理包)。

using (ExcelPackage pkg = new ExcelPackage(new MemoryStream(_fileBytes)))
{
    sheet = pkg.Workbook.Worksheets[1];
    int rows = sheet.Dimension.End.Row;
    int count = 0;
    for (int i = 1; i <= rows; ++i)
    {
    if (!string.IsNullOrEmpty(sheet.Cells[i, 1].Text))
      ++count;
    }
}

顺便说一句,你可以用Linq:缩短代码

using (ExcelPackage pkg = new ExcelPackage(new MemoryStream(_fileBytes)))
{
    var sheet = pkg.Workbook.Worksheets.First();
    int count = sheet.Cells[1, 1, sheet.Dimension.End.Row, 1]
        .Count(c => !string.IsNullOrEmpty(c.Text));
}

最新更新