1
foreach (var item in itemlist.Items)
{
    if (item.PivotChartConfig != null)
    {
        var describedPivotChart = item;
        var chartConfig = describedPivotChart.PivotChartConfig;

        Excel.PivotCache pivotCache = workbook.PivotCaches().Create(Excel.XlPivotTableSourceType.xlDatabase, dataRange);

        Excel.Range pivotTableLocation;

        if (lastInsertedRange != null)
        {
            pivotTableLocation = pivotSheet.Cells[lastInsertedRange.Row + lastInsertedRange.Rows.Count + 1, 1];
        }
        else
        {
            pivotTableLocation = pivotSheet.Cells[1, 1];
        }

        Excel.PivotTable pivotTable = pivotCache.CreatePivotTable(
            TableDestination: pivotTableLocation,
            TableName: "PivotTable" + Guid.NewGuid().ToString());   

        ConfigurePivotTableFields(pivotTable, chartConfig.PivotTableConfig.Fields);
        Excel.Range pivotTableRange = pivotTable.TableRange2;

        double chartLeft = pivotTableRange.Left + pivotTableRange.Width + 10;  
        double chartTop = pivotTableRange.Top;
        double chartWidth = 500;   
        double chartHeight = 300; 

        Excel.ChartObjects chartObjects = (Excel.ChartObjects)pivotSheet.ChartObjects();
        Excel.ChartObject chartObject = chartObjects.Add(
            chartLeft,
            chartTop,
            chartWidth,
            chartHeight);

        Excel.Chart chart = chartObject.Chart;
        chart.SetSourceData(pivotTable.TableRange2);

        chart.ChartType = chartConfig.ChartType;
        chart.HasTitle = true;
        chart.ChartTitle.Text = chartConfig.ChartTitle;
        lastInsertedRange = pivotTable.TableRange2;

        if (!string.IsNullOrEmpty(describedPivotChart.Description))
        {
            pivotTableRange = pivotTable.TableRange2;
            int descriptionRow = pivotTableRange.Row + pivotTableRange.Rows.Count;
            int descriptionColumn = pivotTableRange.Column;

            Excel.Range descriptionCell = pivotSheet.Cells[descriptionRow, descriptionColumn];
            descriptionCell.Value2 = describedPivotChart.Description;

            descriptionCell.Font.Bold = true;
            descriptionCell.Font.Italic = true;
            descriptionCell.EntireRow.AutoFit();
            lastInsertedRange = pivotSheet.Cells[descriptionRow, descriptionColumn];
        }
    }
    else
    {
        if (lastInsertedRange == null)
        {
            lastInsertedRange = pivotSheet.Cells[1, 1];
        }

        int stringItemRow = lastInsertedRange.Row + lastInsertedRange.Rows.Count + (lastInsertedRange == pivotSheet.Cells[1, 1] ? 0 : 1);
        int stringItemColumn = lastInsertedRange.Column;

        Excel.Range stringItemCell = pivotSheet.Cells[stringItemRow, stringItemColumn];
        stringItemCell.Value2 = item.Description;

        stringItemCell.Font.Bold = true;
        stringItemCell.Font.Size = 12;
        stringItemCell.EntireRow.AutoFit();

        lastInsertedRange = pivotSheet.Cells[stringItemRow, stringItemColumn];
    }
}

If only one pivot chart is created, my code runs normally, but if multiple pivot charts are created, an error occurs.

Unhandled exception. System.Runtime.InteropServices.COMException (0x80004005): Error HRESULT E_FAIL has been returned from a call to a COM component.

Error occurs on this line of code:

chart.SetSourceData(pivotTable.TableRange2);

I reviewed Microsoft's interop documentation but couldn't find a suitable solution.

0

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.