这是我的代码。其目的是计算第一列中有文本的行数。
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.
当我使用调试器逐步完成它时,我得到了同样的异常......除非我在Watch窗口中有这个:sheet.Cells[1, 1].Text
。如果我在代码上运行调试器(即按F5),则在sheet
对象初始化之前,我得到异常。如果我单步执行在我的Watch窗口中剪切的代码,则无异常。代码完美无瑕。 Watch窗口正确显示第一个单元格的内容。是什么给了什么?
答案 0 :(得分: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));
}