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オブジェクトが初期化される前から、例外が発生します。ウォッチウィンドウで切り取ったコードをステップスルーすると、例外はありません。コードは問題なく動作します。ウォッチ ウィンドウには、最初のセルの内容が正しく表示されます。何を与える?

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 に答える