在VSTO中使用PowerPoint图表制作瀑布图

时间:2014-04-15 09:10:52

标签: c# excel vsto

我正在做一个 使用 VSTO PowerPoint 加载项中瀑布图

PowerPoint.Slide slide = null;
PowerPoint.Shape shape = null;
PowerPoint.Chart chart = null;

这一行说明了要制作的图表类型。

shape = slide.Shapes.AddChart(Office.XlChartType.xlColumnStacked, 200, 200, 300, 200);

这一行此处打开一个Excel工作簿,在将数据添加到其中时生成图表。

chart = shape.Chart;

以下是我创建的图表的图像。My Waterfall chart

现在的问题是,我希望第二个条形图从第一个条形图的末端绘制,即从x轴上的4而不是0。

喜欢这个。

The Real Waterfall Chart

有人能告诉我有没有办法可以从前一系列的值而不是x轴的0值中绘制我的系列?

2 个答案:

答案 0 :(得分:2)

我认为Excel或PowerPoint图表不支持开箱即用的瀑布。但是,您可以通过将图表类型保持为堆叠并添加一个不可见的单独的帮助图表系列并推送其他系列来实现此目的。然后,根据实际图表系列的先前值计算此辅助图表系列的不同值。

通过隐形,我暗示同时生成线条和填充。图表系列仍然存在,但除非您开始编辑图表,否则您将看不到它。

答案 1 :(得分:0)

我从Stacked柱形图创建了瀑布图,并使用了Selected图形的Chartdata中的Workbook对象。 您可以按照此link检查如何手动创建瀑布图表,然后通过代码操作图表的工作表/数据表来创建瀑布图表。 这是我的代码片段..

 private void calculationAndFormatting(bool excelEvent,Excel.Worksheet Sheet)
    {
        //unregister from Excel Change Event

        Sheet.Application.EnableEvents = false;

                int lRow = 1;
                lRow = iRowCount;

                Sheet.Range["A1", "A" + lRow].Copy(Type.Missing);
                Sheet.Range["B" + (lRow + 5)].PasteSpecial(Excel.XlPasteType.xlPasteAll, Excel.XlPasteSpecialOperation.xlPasteSpecialOperationNone, false, false);
                Sheet.Range["B1", "B" + lRow].Copy(Type.Missing);
                Sheet.Range["A" + (lRow + 5)].PasteSpecial(Excel.XlPasteType.xlPasteAll, Excel.XlPasteSpecialOperation.xlPasteSpecialOperationNone, false, false);
                Sheet.Range["B1", "D1"].Copy(Type.Missing);
                Sheet.Range["C" + (lRow + 5)].PasteSpecial(Excel.XlPasteType.xlPasteAll, Excel.XlPasteSpecialOperation.xlPasteSpecialOperationNone, false, false);
                int ulRow = Sheet.UsedRange.Rows.Count;
                int k=ulRow;
                if (!excelEvent)
                {
                    Sheet.Range["C" + (lRow + 6)].Value = "0";
                    Sheet.Range["C" + (ulRow + 1)].Value = "0";

                    Sheet.Range["A" + (ulRow + 1)].Value = "=SUM(A" + (lRow + 5) + ":" + "A" + ulRow + ")";
                    Sheet.Range["B" + (ulRow + 1)].Value = "Total Value";
                    k = ulRow + 1;
                }              
                for (int i = lRow + 6; i <= k; i++)
                {
                    if (Sheet.Range["A" + i].Value < 0)
                    {
                        if (i <= k-1 && i != lRow + 6)
                        {
                            Sheet.Range["C" + i].Formula = "=E" + (i - 1) + "+" + "A" + i;
                        }
                        Sheet.Range["D" + i].Formula = "=-A" + i;
                        Sheet.Range["E" + i].Formula = "=C" + i;
                    }
                    else
                    {
                        if (i <= k-1 && i != lRow + 6)
                        {
                            Sheet.Range["C" + i].Formula = "=E" + (i - 1);
                        }
                        Sheet.Range["D" + i].Formula = "=A" + i;
                        Sheet.Range["E" + i].Formula = "=C" + i + "+" + "D" + i;
                    }

            }
                string sourceCol = "='" + Sheet.Name + "'!$C$" + (lRow + 5) + ":$E$" + (k);
                pChart.SetSourceData(sourceCol, PowerPoint.XlRowCol.xlColumns);


                PowerPoint.Axis axis = pChart.Axes(PowerPoint.XlAxisType.xlValue);
                axis.MaximumScale = 1.25 * (System.Double)Sheet.Range["D" + (k)].Value;
                axis.MinimumScale = 0.0;
                PowerPoint.Axis catAxis = pChart.Axes(PowerPoint.XlAxisType.xlCategory);

                catAxis.CategoryNames = Sheet.Range["B" + (lRow + 6), "B" + (k)].Value;
                                applyFormatting();
                drawLeaderLines(Sheet);
            Sheet.Application.EnableEvents = true;
            Sheet = null;

    }