【问题标题】:File Locked after Opening with Excel Interop使用 Excel 互操作打开后文件被锁定
【发布时间】:2015-02-06 19:52:47
【问题描述】:

我正在打开一个 excel 文件,刷新它的数据源,然后使用 c# 应用程序将其保存为 PDF。我基于 this 之类的代码示例。但是,即使在调用最终版本之后,该文件仍保持锁定状态。

Microsoft.Office.Interop.Excel.Application excelApp = new Microsoft.Office.Interop.Excel.Application();

// Open the Workbook:
Microsoft.Office.Interop.Excel.Workbook wb = excelApp.Workbooks.Open(
    @"c:\test\test.xlsx",
    Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing,
    Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing,
    Type.Missing, Type.Missing, Type.Missing, Type.Missing);

Microsoft.Office.Interop.Excel.Worksheet ws = (Microsoft.Office.Interop.Excel.Worksheet)wb.Worksheets[1];

wb.RefreshAll();
Thread.Sleep(4000); //surely a better way to do this

//ws.PrintOut(Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing);
wb.ExportAsFixedFormat(XlFixedFormatType.xlTypePDF, @"c:\test\test.pdf");

// Cleanup:
GC.Collect();
GC.WaitForPendingFinalizers();

Marshal.FinalReleaseComObject(ws);

wb.Close(false, Type.Missing, Type.Missing);
Marshal.FinalReleaseComObject(wb);

excelApp.Quit();
Marshal.FinalReleaseComObject(excelApp);

还有哪些额外步骤可以确保流程完成后它不会被锁定?

【问题讨论】:

    标签: excel-interop


    【解决方案1】:
    1. 我认为您在这里做的一些工作有问题 - 即在关闭您的应用程序或工作簿之前收集。
    2. 我已经清理了 Excel 对象的每个部分 - 工作表、工作簿、应用程序和 processID。这可能是非常谨慎的,但最好确保您正在清理您的内存 IMO。
    3. 我不知道这是您的问题,但我倾向于使用更完整的声明来导出 PDF。我会考虑的。

      xlWorkbook.ExportAsFixedFormat(Excel.XlFixedFormatType.xlTypePDF, 文件路径, Excel.XlFixedFormatQuality.xlQualityStandard, true, false, 1, 1, true, missing);

    我为自己的工作所做的是创建两个函数来处理杀死幽灵进程的工作(这可能导致你的锁定)。

    我的代码封装在我创建的一个名为 singleExcel 的类中,该类为我处理 Excel 实例,因此可以根据需要对其进行调整,但它应该能让你顺利上路。

    public Excel._Worksheet xlWorksheet { get; set; }
    public Excel.Application xlApp { get; set; }
    public Excel.Workbook xlWorkbook { get; set; }
    public Process excelProcess { get; set; }
    
    public static void CloseSheet(singleExcel thisExcel)
    {
        if (thisExcel.excelProcess != null)
        {
            try
            {
                thisExcel.excelProcess.Kill();
                thisExcel.excelProcess.Dispose();
            }
            catch (Exception ex)
            {
                // depending on your needs   
            }
        }
        else
        {
            thisExcel.xlWorkbook.Close(true);
            thisExcel.xlApp.Quit();
        }
        releaseObject(thisExcel.xlWorksheet);
        releaseObject(thisExcel.xlWorkbook);
        releaseObject(thisExcel.xlApp);
        releaseObject(thisExcel.excelProcess);
        releaseObject(thisExcel);
    }
    
    public static void releaseObject(object obj)
    {
        try
        {
            Marshal.ReleaseComObject(obj);
            obj = null;
        }
        catch
        {
            obj = null;
        }
        finally
        {
            GC.Collect();
            GC.WaitForPendingFinalizers();
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-12-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-25
      • 2012-02-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多