1

我有一个 C# 程序,它使用 Excel Interop 创建、编写和保存一个 excel 文件。问题是,如果我在保存并关闭 excel 文件后没有立即退出应用程序,那么 c# 应用程序会出现未处理的异常并崩溃。有没有人找到一种方法来做到这一点,同时能够保持主机 c# 应用程序打开和运行。

这是处理涉及 Excel 互操作的所有内容的代码

 class CreateExcelDoc
{
    string newFormString = trialReportForm.newFormString;
   string fileString=trialReportForm.fileString;
   int sheetCount;
   string trialString = trialReportForm.trialString;
   string dateString = trialReportForm.dateString;
   string saveString = trialReportForm.saveSting;
   System.Windows.Forms.Timer excelTimer = new System.Windows.Forms.Timer();
    private Excel.Application app = null;
    private Excel.Workbook workbook = null;
    private Excel.Worksheet worksheet = null;
    private Excel.Range workSheet_range = null;
    public CreateExcelDoc()

    {
        createDoc();
    }

    public void createDoc()
    {

        try
        {
            app = new Excel.Application();
            //app.Visible = false;
            if (startForm.exportOwnerString == "Yes")
            {
                app.Visible = true;
                startForm.exportOwnerString = " ";
            }
            else
            {
                app.Visible = false;
            }
            if (startForm.excelActionFlag=="addNewTrialReport")
            {
                workbook = (Excel.Workbook) app.Workbooks.Add(1);
                //workbook.SaveAs(newFileForm.desktopPath + "\\" + "OB "+trialReportForm.otrClubNameString+" - "+trialReportForm.otrDateString);
                worksheet = (Excel.Worksheet)workbook.Worksheets[1];
                //fileNameString = newFileForm.desktopPath + "\\OB " + trialReportForm.otrClubNameString + " " + trialReportForm.otrDateString;
                workbook.Worksheets[1].Name = trialReportForm.trialReportDate+" Trial "+trialReportForm.trialReportTrialNumber;
            }
            else if (startForm.excelActionFlag == "ownerContacts")
            {
                workbook = (Excel.Workbook)app.Workbooks.Add(1);
                worksheet = (Excel.Worksheet)workbook.Worksheets[1];
                workbook.Worksheets[1].Name = "Owner Contacts";
            }
            else if (startForm.excelActionFlag == "newExcelResults")
            {
                string testFile = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) + "\\test";
                workbook = (Excel.Workbook)app.Workbooks.Add(1);

                worksheet = (Excel.Worksheet)workbook.Worksheets[1];
                workbook.Worksheets[1].Name = "Event 1 Results";
                //workbook.SaveAs(testFile, Missing.Value, Missing.Value, Missing.Value, false);
                //workbook.SaveAs(Environment.GetFolderPath(Environment.SpecialFolder.Desktop)+"\\Results", Missing.Value, Missing.Value, Missing.Value, false);



                //workbook.SaveAs(startForm.excelFileLocation, Missing.Value, Missing.Value, Missing.Value, false);

                //fileNameString = registrationForm.regFileLocation + "\\OB " + registrationForm.regClubName + " " + registrationForm.regDateString;
            }
            else if (dogForm.dogRegistrationExcel == "Yes")
            {
                workbook = (Excel.Workbook)app.Workbooks.Add(1);
                workbook.SaveAs(dogForm.filePath, Missing.Value, Missing.Value, Missing.Value, false);

            }
            else if (newFormString == "No")
            {

                //workbook = app.Workbooks.Open(fileString, Missing.Value, false, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, true, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value);
                // workbook.Close(true,fileString,Missing.Value);
                workbook = (Excel.Workbook)app.Workbooks.Open(fileString, Missing.Value, false, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, true, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value);
            }
            if (newFormString=="Yes"&registrationForm.formString=="OTR")
            {
                //string sheetName = "Trial Report - " + dateString + " " + trialString;
            worksheet = (Excel.Worksheet)workbook.Worksheets[1];
            workbook.Worksheets[1].Name =trialReportForm.otrDateString+" Trial " + trialReportForm.otrTrialString;
            //workbook.Worksheets[1].Name = "Trial Report - " + dateString + " " + trialString;
            //workbook.Worksheets[1].Name = "Hello";
            //Excel.Name name1 = worksheet.Names.Add("Trial Report - " + dateString + " " + trialString, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value);
            //worksheet.Name = "Trial Report - " + dateString + " " + trialString;


            }
            else if (newFormString == "Yes" & registrationForm.formString == "Registration")
            {
                //string sheetName = "Trial Report - " + dateString + " " + trialString;
                worksheet = (Excel.Worksheet)workbook.Worksheets[1];
                workbook.Worksheets[1].Name = "Results: "+registrationForm.selectedEvent;
                //workbook.Worksheets[1].Name = "Trial Report - " + dateString + " " + trialString;
                //workbook.Worksheets[1].Name = "Hello";
                //Excel.Name name1 = worksheet.Names.Add("Trial Report - " + dateString + " " + trialString, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value);
                //worksheet.Name = "Trial Report - " + dateString + " " + trialString;


            }
            else if (startForm.excelActionFlag == "addExistingTrialReport")
            {
                workbook = (Excel.Workbook)app.Workbooks.Open(startForm.excelFileLocation, Missing.Value, false, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, true, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value);
               sheetCount = workbook.Worksheets.Count;
               int sheetCountPlusONe=sheetCount+1;
               worksheet = (Excel.Worksheet)workbook.Worksheets.Add(Missing.Value,workbook.Worksheets[sheetCount],Missing.Value,Missing.Value);
               workbook.Worksheets[sheetCountPlusONe].Name = trialReportForm.trialReportDate + " Trial " + trialReportForm.trialReportTrialNumber;

               //worksheet.Move(Missing.Value, workbook.Worksheets[sheetCount]);


            }
            else if (startForm.excelActionFlag == "existingExcelResults")
            {

                workbook = (Excel.Workbook)app.Workbooks.Open(startForm.excelFileLocation, Missing.Value, false, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, true, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value);
                sheetCount = workbook.Worksheets.Count;
                int sheetCountPlusONe = sheetCount + 1;
                worksheet = (Excel.Worksheet)workbook.Worksheets.Add(Missing.Value, workbook.Worksheets[sheetCount], Missing.Value, Missing.Value);
                workbook.Worksheets[sheetCountPlusONe].Name = "Event " + sheetCountPlusONe.ToString() + " Results";


                //worksheet.Move(Missing.Value, workbook.Worksheets[sheetCount]);


            }
            else if (dogForm.dogRegistrationExcel == "Yes")
            {
                worksheet = (Excel.Worksheet)workbook.Worksheets[1];
                workbook.Worksheets[1].Name = dogForm.dogUKCNumber;
            }
        }
        catch (Exception e)
        {
            Console.Write("Error");
        }
         /* if (trialReportForm.saveMe=="Yes")
            {
                workbook.Save();
                workbook.Close();
            }
        */


    }


    public void createHeaders(int row, int col, string htext, string cell1,
    string cell2, int mergeColumns, string b, bool font, int size, string
    fcolor)
    {
        worksheet.Cells[row, col] = htext;
        workSheet_range = worksheet.get_Range(cell1, cell2);
        workSheet_range.Merge(mergeColumns);
        switch (b)
        {
            case "BLUE":
                workSheet_range.Interior.Color = System.Drawing.Color.Red.ToArgb();
                break;
            case "GAINSBORO":
                workSheet_range.Interior.Color =
        System.Drawing.Color.Gainsboro.ToArgb();
                break;
            //case "Turquoise":
               // workSheet_range.Interior.Color =
        //System.Drawing.Color.Turquoise.ToArgb();
                //break;
            case "PeachPuff":
                workSheet_range.Interior.Color =
        System.Drawing.Color.PeachPuff.ToArgb();
                break;
            default:
                //  workSheet_range.Interior.Color = System.Drawing.Color..ToArgb();
                break;
        }

        //workSheet_range.Borders.Color = System.Drawing.Color.Black.ToArgb();
        //workSheet_range.Borders = null;
        workSheet_range.Font.Bold = font;
        workSheet_range.ColumnWidth = size;
        //workSheet_range.HorizontalAlignment = ContentAlignment.BottomCenter;
        if (startForm.excelActionFlag == "existingExcelResults" | startForm.excelActionFlag=="newExcelResults")
        {
            workSheet_range.HorizontalAlignment = Microsoft.Office.Interop.Excel.XlHAlign.xlHAlignCenter;
        }
        //workSheet_range.Cells.HorizontalAlignment = ContentAlignment.MiddleCenter;
        workSheet_range.Font.Color = System.Drawing.Color.FloralWhite.ToArgb();

    }

    public void addData(int row, int col, string data,
        string cell1, string cell2, string format)
    {
        worksheet.Cells[row, col] = data;
        workSheet_range = worksheet.get_Range(cell1, cell2);
        //workSheet_range.Borders.Color = System.Drawing.Color.Black.ToArgb();
        workSheet_range.NumberFormat = format;
        workSheet_range.HorizontalAlignment = Microsoft.Office.Interop.Excel.XlHAlign.xlHAlignLeft;

        excelTimer.Tick += new EventHandler(excelTimer_Tick);
        excelTimer.Interval = 6000;
        excelTimer.Start();
    }
    void excelTimer_Tick(object sender, EventArgs e)
    {
        if (startForm.excelActionFlag != "ownerContacts")
        {
            if (startForm.excelActionFlag == "existingExcelResults" | startForm.excelActionFlag == "newExcelResults")
            {
               /* Excel.Range sortRange;
                sortRange = worksheet.get_Range("A14", "K32");
                Excel.Range scoreColumn;
                scoreColumn = worksheet.get_Range("C14", "C32");
                sortRange.Sort(scoreColumn, Excel.XlSortOrder.xlDescending);*/
                Excel.Range valueRange;
                Excel.Range placeRange;
                placeRange = worksheet.get_Range("A14", "A" + (14 + (registrationForm.numberofCompetitors - 1)).ToString());
                valueRange = worksheet.get_Range("A14", "K"+(14+(registrationForm.numberofCompetitors-1)).ToString());
                valueRange.Sort(valueRange.Columns[3, Type.Missing], Excel.XlSortOrder.xlDescending, Type.Missing, Type.Missing, Excel.XlSortOrder.xlAscending, Type.Missing, Excel.XlSortOrder.xlAscending, Excel.XlYesNoGuess.xlGuess, Type.Missing, Type.Missing, Excel.XlSortOrientation.xlSortColumns, Excel.XlSortMethod.xlPinYin, Excel.XlSortDataOption.xlSortNormal, Excel.XlSortDataOption.xlSortNormal, Excel.XlSortDataOption.xlSortNormal);
                placeRange.Sort(placeRange.Columns[1, Type.Missing], Excel.XlSortOrder.xlAscending, Type.Missing, Type.Missing, Excel.XlSortOrder.xlAscending, Type.Missing, Excel.XlSortOrder.xlAscending, Excel.XlYesNoGuess.xlGuess, Type.Missing, Type.Missing, Excel.XlSortOrientation.xlSortColumns, Excel.XlSortMethod.xlPinYin, Excel.XlSortDataOption.xlSortNormal, Excel.XlSortDataOption.xlSortNormal, Excel.XlSortDataOption.xlSortNormal); 
            }
            // workbook.Close(true, Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) + "\\Results.xls", Missing.Value);
            workbook.Close(true, startForm.excelFileLocation, Missing.Value);
            app.Quit();
            Application.Exit();

            /* workSheet_range = null;
             worksheet = null;
             workbook = null;
             app = null;*/
            //Thread.Sleep(5000);
            // File.Move(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) + "\\Results.xls", startForm.excelFileLocation);
        }

    }
}
4

2 回答 2

1

提出了包括我在内的几种解决方案如何正确清理 Excel 互操作对象?

您可以选择最服务器(Killing Excel 进程)到更温柔的解决方案(释放 COM 对象)

于 2012-10-23T19:44:24.220 回答
1

我发现使用 excel 保存时,使用 SaveAs 方法会更幸运。例如:

            private static Microsoft.Office.Interop.Excel.Application xlApp = null;
            private static Microsoft.Office.Interop.Excel.Workbook xlWb = null;
            private static Microsoft.Office.Interop.Excel.Worksheet xlWs = null;


            //Your code and operations


            xlWb.SaveAs(filePath, XlFileFormat.xlExcel8, Missing.Value, Missing.Value, Missing.Value, Missing.Value, XlSaveAsAccessMode.xlNoChange,
                        Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value);
            xlApp.Quit();

            Marshal.ReleaseComObject(xlWs);
            Marshal.ReleaseComObject(xlWb);
            Marshal.ReleaseComObject(xlApp);
于 2012-10-23T20:46:58.910 回答