使用VSTO中的PowerPoint图制作瀑布图

我正在使用VSTOPowerPoint加载项中制作瀑布图

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; 

这是我创build的图表的图像。 我的瀑布图

现在的问题是,我想第二栏从第一栏的末尾绘制,即在x轴上从4而不是0。

喜欢这个。

真实的瀑布图

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

我不认为Excel或PowerPoint图表支持瀑布。 但是,您可以通过将图表types保持为堆叠状态并添加一个不可见的辅助图表系列 ,并将其他系列向上推。 然后,基于实际图表系列的先前值,计算此辅助图表系列的不同值。

通过看不见的东西,我意味着使得线条和填充都没有 。 图表系列仍然在那里,但除非您开始编辑图表,否则您将不会看到它。

我从堆积柱形图创build瀑布图,并使用选定形状的图表数据中的工作簿对象。 你可以按照这个链接来检查如何手动创build瀑布图。然后通过代码操纵图表的工作表/数据表来创build瀑布图。 这是我的代码片段..

  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; }