如何使用 VSTO 和 C# 更改 PowerPoint 图表中的值?
How can I change the values in a PowerPoint chart using VSTO and C#?
我需要使用 VSTO 更改 PowerPoint 图表中的源数据。第一个代码片段显示了我如何从形状 object.
中获取系列
SeriesCollection seriesCollection = shape.Chart.SeriesCollection();
Series series = seriesCollection.Item(1);
我已经通过调用
测试了它是否有效
series.Delete()
这将从图表中删除系列。但是,如果可能的话,我只想更改系列的值。我尝试了以下方法:
series.Values = myArray1;
series.XValues = myArray2;
这导致图表为空。 (系列名称和标题保留,但数据丢失)。
有谁知道这是如何实现的?我目前的解决方案是在 excel 中重新生成图表并替换 PowerPoint 中的图表,但我希望有更有效的方法。
Powerpoint 图表基于基础 Excel 工作表,图表数据存储在单元格中。如果您调用图表的上下文菜单并单击 "Edit Data...",Excel 应用程序将启动,工作表包含图表中的值。
因此,您不应通过直接设置系列值来修改 Powerpoint 图表。您应该通过更新基础 Excel 工作表中的单元格值来完成此操作。这是一个工作示例:
static void Main(string[] args)
{
var powerPointApp = new Microsoft.Office.Interop.PowerPoint.Application();
var presentation = powerPointApp.Presentations.Open(@"Presentation1.pptx");
var slide = presentation.Slides[1];
var shape = slide.Shapes[1];
var chartData = shape.Chart.ChartData;
chartData.Activate();
var workbook = chartData.Workbook;
workbook.Application.Visible = false;
var dataSheet = workbook.Worksheets[1];
double[] newData = {1, 2, 3, 4, 5};
var colNumber = 2;
var firstRowNumber = 2;
// Clearing previous data
dataSheet.UsedRange.Columns[colNumber, Type.Missing].Clear();
for (var i = 0; i < newData.Length; ++i)
{
dataSheet.Cells[firstRowNumber + i, colNumber] = newData[i];
}
// Saving and closing Excel workbook before presentation could be saved.
workbook.Close(true);
presentation.Save();
presentation.Close();
powerPointApp.Quit();
}
在上面的代码中有两个硬编码值:
var colNumber = 2;
var firstRowNumber = 2;
图表基础工作表具有预定义的结构。例如,对于默认图表,它构建以下工作簿:
因此您在修改工作表中的数据时可以依赖以下假设:
- 值系列的第一行等于 2。
- 特定系列对应的列等于
1 + series index
。此处的系列索引与您传递给 SeriesCollection.Item(object Index)
调用以获取系列(从 1
开始)的索引相同。因此,第二个工作表列对应于第一个图表系列,依此类推。
更新(关于瀑布图的问题)
瀑布图的问题也在我的环境中重现。我已经检查了所有其他 15 种图表类型,并且以下它们发生了相同的错误:
- 树状图
- 旭日
- 直方图
- 盒须
- 瀑布
问题的根本原因是 chartData.Activate()
调用实际上并未打开与图表关联的工作表。该问题特定于 Interop,因为如果您在 PowerPoint 应用程序中 select "Edit data...",工作表将成功打开。
所有这些图表都是在 Office 2016 中添加的。对于以前版本的 Office 中可用的图表,一切都很好。似乎问题是由 Interop 程序集与 2016 office 集成的问题引起的。仍然没有适用于 Office 2016 的主要互操作程序集,它仍然随 Office 2013 的 PIA 一起提供。不幸的是,我无法针对此特定问题提出修复或解决方法。我们必须等待微软团队的修复。
我需要使用 VSTO 更改 PowerPoint 图表中的源数据。第一个代码片段显示了我如何从形状 object.
中获取系列SeriesCollection seriesCollection = shape.Chart.SeriesCollection();
Series series = seriesCollection.Item(1);
我已经通过调用
测试了它是否有效series.Delete()
这将从图表中删除系列。但是,如果可能的话,我只想更改系列的值。我尝试了以下方法:
series.Values = myArray1;
series.XValues = myArray2;
这导致图表为空。 (系列名称和标题保留,但数据丢失)。
有谁知道这是如何实现的?我目前的解决方案是在 excel 中重新生成图表并替换 PowerPoint 中的图表,但我希望有更有效的方法。
Powerpoint 图表基于基础 Excel 工作表,图表数据存储在单元格中。如果您调用图表的上下文菜单并单击 "Edit Data...",Excel 应用程序将启动,工作表包含图表中的值。
因此,您不应通过直接设置系列值来修改 Powerpoint 图表。您应该通过更新基础 Excel 工作表中的单元格值来完成此操作。这是一个工作示例:
static void Main(string[] args)
{
var powerPointApp = new Microsoft.Office.Interop.PowerPoint.Application();
var presentation = powerPointApp.Presentations.Open(@"Presentation1.pptx");
var slide = presentation.Slides[1];
var shape = slide.Shapes[1];
var chartData = shape.Chart.ChartData;
chartData.Activate();
var workbook = chartData.Workbook;
workbook.Application.Visible = false;
var dataSheet = workbook.Worksheets[1];
double[] newData = {1, 2, 3, 4, 5};
var colNumber = 2;
var firstRowNumber = 2;
// Clearing previous data
dataSheet.UsedRange.Columns[colNumber, Type.Missing].Clear();
for (var i = 0; i < newData.Length; ++i)
{
dataSheet.Cells[firstRowNumber + i, colNumber] = newData[i];
}
// Saving and closing Excel workbook before presentation could be saved.
workbook.Close(true);
presentation.Save();
presentation.Close();
powerPointApp.Quit();
}
在上面的代码中有两个硬编码值:
var colNumber = 2;
var firstRowNumber = 2;
图表基础工作表具有预定义的结构。例如,对于默认图表,它构建以下工作簿:
因此您在修改工作表中的数据时可以依赖以下假设:
- 值系列的第一行等于 2。
- 特定系列对应的列等于
1 + series index
。此处的系列索引与您传递给SeriesCollection.Item(object Index)
调用以获取系列(从1
开始)的索引相同。因此,第二个工作表列对应于第一个图表系列,依此类推。
更新(关于瀑布图的问题)
瀑布图的问题也在我的环境中重现。我已经检查了所有其他 15 种图表类型,并且以下它们发生了相同的错误:
- 树状图
- 旭日
- 直方图
- 盒须
- 瀑布
问题的根本原因是 chartData.Activate()
调用实际上并未打开与图表关联的工作表。该问题特定于 Interop,因为如果您在 PowerPoint 应用程序中 select "Edit data...",工作表将成功打开。
所有这些图表都是在 Office 2016 中添加的。对于以前版本的 Office 中可用的图表,一切都很好。似乎问题是由 Interop 程序集与 2016 office 集成的问题引起的。仍然没有适用于 Office 2016 的主要互操作程序集,它仍然随 Office 2013 的 PIA 一起提供。不幸的是,我无法针对此特定问题提出修复或解决方法。我们必须等待微软团队的修复。