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. 如果我在代码上运行调试器(即按 F5),在sheet对象初始化之前,我会得到异常。如果我在我的 Watch 窗口中使用剪断的代码单步执行代码,则无一例外。代码完美无缺。Watch 窗口正确显示了第一个单元格的内容。是什么赋予了?

4

1 回答 1

0

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

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));
}
于 2013-02-07T15:29:22.520 回答