【问题标题】:Making waterfall chart using PowerPoint chart in VSTO在 VSTO 中使用 PowerPoint 图表制作瀑布图
【发布时间】:2015-10-17 20:42:37
【问题描述】:

我正在制作一个 使用 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;

这是我创建的图表的图像。

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

像这样。

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

【问题讨论】:

    标签: c# excel vsto


    【解决方案1】:

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

    我所说的不可见是指将线条和填充都设为none。图表系列仍然存在,但除非您开始编辑图表,否则您将看不到它。

    【讨论】:

      【解决方案2】:

      我从堆积柱形图创建了瀑布图,并使用了所选形状的 Chartdata 中的 Workbook 对象。 您可以按照link查看如何手动创建瀑布图..然后通过代码操作图表的工作表/数据表来创建瀑布图。 这是我的代码的 sn-p..

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

      【讨论】:

      • 我的错..我也有 c# 版本..标签完全从我的脑海中跳过了。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-11-03
      • 1970-01-01
      • 2020-01-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-27
      相关资源
      最近更新 更多