Excel.Interop.Chart.Export不会关闭导出的图像文件

时间:2014-08-13 13:49:56

标签: c# excel

我创建了一个小类,它使用excel工作簿,抓取工作簿中包含的图表并将每个图表导出为PNG文件。

它几乎可以正常工作,但我对生成的PNG文件有疑问,该类没有正确关闭文件,直到用户关闭应用程序。

这是我的班级:

        public List<string> ExportCharts(string fileName)
    {
        var exportedGraphsList = new List<string>();

        Excel.Workbooks xlWorkBooks = null;
        Excel.Workbook xlWorkBook = null;
        Excel.Application xlApp = null;
        Excel.Sheets xlSheets = null;
        object misValue = System.Reflection.Missing.Value;

        try
        {
            xlApp = new Excel.ApplicationClass();
            xlWorkBooks = xlApp.Workbooks;
            xlWorkBook = xlWorkBooks.Open(fileName);
            xlSheets = xlWorkBook.Charts;

            foreach (Excel.Chart xlChart in xlSheets)
            {
                var exportfileName = ConfigurationManager.AppSettings["imageSavePath"] + @"\" + xlChart.Name + ".png";                                      
                xlChart.Export(exportfileName, "PNG", misValue);
                exportedGraphsList.Add(exportfileName);
            }

            return exportedGraphsList;
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message + "\n\n" + ex.StackTrace, "Der gik noget galt");
            exportedGraphsList.Clear();
            return exportedGraphsList;
        }
        finally
        {
            GC.Collect();
            GC.WaitForPendingFinalizers();

            if(xlSheets != null)
                Marshal.FinalReleaseComObject(xlSheets);

            if (xlWorkBook != null)
            {
                xlWorkBook.Close(false, Type.Missing, Type.Missing);
                Marshal.FinalReleaseComObject(xlWorkBook);
            }

            if (xlWorkBooks != null)
                Marshal.FinalReleaseComObject(xlWorkBooks);

            if (xlApp != null)
            {
                xlApp.Quit();
                Marshal.FinalReleaseComObject(xlApp);
            }
        }
    }

    public void Dispose()
    {
        GC.Collect();
        GC.WaitForPendingFinalizers();
    }

调用此方法时,它会很好地启动和关闭Excel进程,但PNG文件仍保持打开状态。我可以将coruse在导出的文件名上加上时间戳,但我担心这会让用户感到困惑。

提前感谢任何提示或想法。 : - )

1 个答案:

答案 0 :(得分:0)

已解决 - 这是因为我之后将图像文件加载到GUI。

所以Excel.InterOp工作正常。