Search code examples
c#excelpowerpointvsto

Extra Excel Application Opening while creating powerpoint charts


I am creating charts in PowerPoint. The below code opens two excel applications. One opens in the background that is invisible. The second one opens after the method ends. I need to make sure second excel either never open ideally or I can close it after it opens.

I have tried the below things but none worked.

I have tried forcing GC, Manual ReleaseComObject, Killing Excel process

I have tried separating excel COM objects and forcing GC

private void BtnInsert_Click(object sender, EventArgs e)
{
    var Addin = Globals.ThisAddIn;
    Microsoft.Office.Interop.PowerPoint.Application activeApplication = Addin.Application;
    DocumentWindow activeWindows = activeApplication.ActiveWindow;
    Microsoft.Office.Interop.PowerPoint.View activeView = activeWindows.View;
    Slide activeSlide = activeView.Slide;

    Microsoft.Office.Interop.PowerPoint.Shapes slideShape = activeSlide.Shapes;
    Microsoft.Office.Interop.PowerPoint.Shape shape = slideShape.AddChart2(-1, XlChartType.xl3DBarClustered, -1, -1, -1, -1, true);
    Microsoft.Office.Interop.PowerPoint.Chart chart = shape.Chart;

    //Access the chart data
    Microsoft.Office.Interop.PowerPoint.ChartData chartData = chart.ChartData;
    chartData.Activate();

    //Create instance to Excel workbook to work with chart data
    Workbook workbook = chartData.Workbook;
    Microsoft.Office.Interop.Excel.Application workbookApplication = workbook.Application;
    workbookApplication.Visible = false;
    workbookApplication.WindowState = XlWindowState.xlMinimized;

    //Accessing the data worksheet for chart
    Worksheet worksheet = workbook.Worksheets[1];

    // I am adding data here
    // This is not required to reproduce this

    chartData.BreakLink();
    workbook.Close(true);
}

Also, note that this issue does not occur while updating data.


Solution

  • Remove chartData.Activate() and chartData.BreakLink() solves this. Although online documentation says that chartdata.activate is required before accessing the workbook. Otherwise, we will get a null reference.

    I think the documentation is incorrect or it does not apply to vsto.