繁体   English   中英

在C#中ComObject发布后如何修复Excel?

[英]How to repair excel after ComObject Release in C#?

执行以下代码后:

            Microsoft.Office.Interop.Excel.Application oXL;
            oXL = new Microsoft.Office.Interop.Excel.Application();
            oXL.Visible = false;
            oXL.IgnoreRemoteRequests = true;
            oXL.DisplayAlerts = false;
            Workbook oWB;
            oWB = oXL.Workbooks.Open(path, 0, false, 5, "", "", false, XlPlatform.xlWindows, "", true, false, 0, true, false, false);

            Sheets excelSheets = oWB.Worksheets;
            string currentSheet = "PC_HW_Info";
            Worksheet excelWorksheet = excelSheets.get_Item(currentSheet);

            string columnRange;
            int rowsNumber = 2;

            Range PC_User;
            PC_User = excelWorksheet.get_Range("A2", "A2");
            while ((PC_User.Value2) != null)
            {
                ++rowsNumber;
                columnRange = "A" + rowsNumber;
                PC_User = excelWorksheet.get_Range(columnRange, columnRange);
            }
            PC_User.Value2 = "aaaa";

            oXL.UserControl = false;
            oWB.SaveAs("valid path to my file", XlFileFormat.xlWorkbookDefault, Type.Missing, Type.Missing,
            false, false, XlSaveAsAccessMode.xlNoChange, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing);

            oWB.Close();
            oXL.Quit();
            Marshal.ReleaseComObject(oXL);
            Marshal.ReleaseComObject(oWB);
            Marshal.ReleaseComObject(excelSheets);
            Marshal.ReleaseComObject(excelWorksheet);

我的Excel某种程度上已损坏,即使重新启动后,它也不会恢复其初始工作状态。 现在,我无法直接打开工作表,我必须使用“打开”->“浏览”来访问工作表。

在第一次运行时,当我打开已处理的原始文档的“已恢复”版本的工作表时,似乎已还原了该文件,但我又还原了它,但是从那时起,我无法像以前那样使用Excel。

有什么想法吗? 我在ReleaseComObject上做错了什么? 我应该如何关闭excel应用程序?

LE:如果我在关闭并释放对象的所有最后一行中添加注释,则说明它工作正常。

        Microsoft.Office.Interop.Excel.Application oXL;
        oXL = new Microsoft.Office.Interop.Excel.Application();
        oXL.Visible = false;
        oXL.IgnoreRemoteRequests = true;
        oXL.DisplayAlerts = false;
        Workbook oWB;
        Workbooks wbs = oXL.Workbooks; //Never use two dots, since the middle one needs free as well
        oWB = wbs.Open(path, 0, false, 5, "", "", false, XlPlatform.xlWindows, "", true, false, 0, true, false, false);
        Marshal.ReleaseComObject(wbs);

        Sheets excelSheets = oWB.Worksheets;
        string currentSheet = "PC_HW_Info";
        Worksheet excelWorksheet = excelSheets.get_Item(currentSheet);

        string columnRange;
        int rowsNumber = 2;

        Range PC_User;
        PC_User = excelWorksheet.get_Range("A2", "A2"); // Need to free
        while ((PC_User.Value2) != null)
        {
            ++rowsNumber;
            columnRange = "A" + rowsNumber;

            Marshal.ReleaseComObject(PC_User);
            PC_User = excelWorksheet.get_Range(columnRange, columnRange);
        }
        PC_User.Value2 = "aaaa";
        Marshal.ReleaseComObject(PC_User);


        oXL.UserControl = false;
        oWB.SaveAs("valid path to my file", XlFileFormat.xlWorkbookDefault, Type.Missing, Type.Missing,
        false, false, XlSaveAsAccessMode.xlNoChange, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing);

        oWB.Close();
        Marshal.ReleaseComObject(excelWorksheet);
        Marshal.ReleaseComObject(excelSheets);
        Marshal.ReleaseComObject(oWB);

        oXL.Quit();
        Marshal.ReleaseComObject(oXL);

您忘记释放Range和工作簿对象。 您还犯了免费订购错误(尽管为了安全起见,我认为这不会产生影响)

通过不释放所有对象,您将在后台留下一个幽灵excel进程。 尝试杀死它们,看看是否能解决问题

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM