3

Excel Interop の使用をカプセル化して、再利用可能なライブラリで使いやすくしたいと考えています。

これまでのところ、完全にうまく機能するいくつかのテストを作成しましたが、各テスト間で Excel を強制的に終了させて​​、削除できるようにするためにテスト ファイルを処理しないようにしています。

各テストの後にアプリケーション インスタンスを終了すると、Excel が応答しなくなったようで、Windows が表示されます。

「Excel が動作を停止し、解決策を探しています」

メッセージ。このメッセージは数秒間続きます。その間、Excel が閉じているため、ファイルのハングが発生し、テストで次のような例外がスローされます。

「別のプロセスで使用されているため、ファイルにアクセスできません...」

メッセージ。それ以外の場合、各テストは個別に正常に実行されます!

この問題を解決する方法の手がかりはありますか?

ApplicationClass.Quit()メソッドを使いすぎていませんか?

テストが完了してから Excel を終了すると、テスト用に作成されたファイルが削除できなくなります。

ありがとう!=)

4

2 に答える 2

2

に変更を加えた場合Workbook、「変更を保存しますか?」というメッセージが表示される可能性があります。物事を保持しているダイアログ。アプリケーションを終了する前に、_Workbook.Savedプロパティをに設定してみてください。True詳細はこちら

于 2011-02-23T23:16:55.243 に答える
1

同じ「別のプロセスで使用されているため、ファイルにアクセスできません...」という問題がありました。

ワークシートを保存していましたが、ワークブックを保存する必要があります。これが完全な例です。

private void TestCreateExcel(IEnumerable<Sales1> data)
    {
        var excelApp = new Excel.Application();
        var workBook = excelApp.Workbooks.Add();
        Excel._Worksheet workSheet = excelApp.ActiveSheet;

        workSheet.Cells[1, "A"] = "Title";
        workSheet.Cells[1, "B"] = "Author(s)";
        workSheet.Cells[1, "C"] = "Release Date";
        workSheet.Cells[1, "D"] = "Total Books Sold";
        workSheet.Cells[1, "E"] = "Last 30 Days Sales";
        workSheet.Cells[1, "F"] = "Average Sales Per Month";
        workSheet.Cells[1, "G"] = "Starting Advance";
        workSheet.Cells[1, "H"] = "Current Advance";

        int index = 1; //Keep track of the which row we're writing to.
        foreach (var n in data)
        {
            index++;
            workSheet.Cells[index, "A"] = n.Title;
            workSheet.Cells[index, "B"] = n.Author;
            workSheet.Cells[index, "C"] = n.ReleaseDate.ToShortDateString();
            workSheet.Cells[index, "D"] = n.TotalBooksSold;
            workSheet.Cells[index, "E"] = n.Last30DaysSales;
            workSheet.Cells[index, "F"] = n.AverageSalesPerMonth;
            workSheet.Cells[index, "G"] = n.StartingAdvance;
            workSheet.Cells[index, "H"] = n.CurrentAdvance;
        }

        workBook.SaveAs(Server.MapPath(filePath + fileName));
        excelApp.Quit();
    }
于 2011-12-11T22:15:38.137 に答える