使用 powershell 在 Excel 图表上添加两个以上的数据范围

Add more than two ranges of data on an Excel chart with powershell

我在这里读到 thread 关于在 Excel 图表中添加多个系列,这对我帮助很大,但我还需要将 3 个范围的信息添加到同一行(系列) 在图表上。
我的 objective 正在从另一个 Excel 文件中获取信息,将其移动到包含图表的文件中,并将信息(在第一个 sheet 中以普通文本形式存储)添加到图表中。
我设法创建了一个有两个范围的系列,使用这个:

$xlChartType=[Microsoft.Office.Interop.Excel.XLChartType] 
$XlLegendPosition=[Microsoft.Office.Interop.Excel.XlLegendPosition]

$chart=$WorksheetTool2.Shapes.AddChart().Chart
$chart.chartType=$xlChartType::xlLineMarkers 
$chart.SeriesCollection().NewSeries.Invoke() 
$chart.SeriesCollection(1).Values = $WorksheetTool1.Range("D10:D11","D20:D24") 
$chart.SeriesCollection(1).Name = "=""First""

但我需要添加第三个范围,如果我添加第三个范围,我得到的错误是:

Exception getting "Range": "Cannot find an overload for "Range" and the argument count: "3"." At C:\Users\graciela_robert\Desktop\PerfTool\script.ps1:57 char:1 + $chart.SeriesCollection(1).Values = $WorksheetTool1.Range("D10:D11","D20:D24","D ... + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : NotSpecified: (:) [], GetValueInvocationException + FullyQualifiedErrorId : CatchFromBaseParameterizedPropertyAdapterGetValue

有谁知道如何在这个图表中添加第三个范围?

此外,我正在尝试使用

将图表图例移至底部
$XlLegendPosition=[Microsoft.Office.Interop.Excel.XlLegendPosition]
$chart.Legend=$XlLegendPosition::xlLegendPositionBottom

但是没用。我也试过我读到 here 的“#$chart.Legend=--4107”,但它也不起作用。没有错误,只是没有任何变化。

不好意思问了两个问题! 谢谢!

要对此做出实际回答...您调用 returns 和 SeriesCollection collection 的 SeriesCollection 方法。 collection 在图表上的每个范围都有一个 object,几乎由 Formula 属性 定义。那么让我们假设如下:
对于您的图表,我们可以使用以下内容建立所有 4 条线:

$chart.SeriesCollection().add($WorksheetTool1.Range("B2:E2")
$chart.SeriesCollection().add($WorksheetTool1.Range("B3:E3")
$chart.SeriesCollection().add($WorksheetTool1.Range("B4:E4")
$chart.SeriesCollection().add($WorksheetTool1.Range("I1:L1")

这为我们在图表上画了线条。它没有放入图例,也没有在底部填写日期,但它放入了我们的线条和 auto-generates 侧面的比例。所以,当我们查看 SeriesCollection 时,它给了我们 4 objects,我们只需要对它们做一些修复。现在,正如我之前提到的,每个上的 Formula 属性 包含我们需要的所有信息。它的布局如下:

=SERIES(<Series Title>,<Series Index Points>,<Range>,Index)

因此,为了在此处添加一些上下文,我们数组中的第一个 object 应该具有以下 Formula 以使其按我们希望的方式显示(假设您的 Sheet 名称是'Tool1' 正如你的变量名所暗示的那样:

$chart.SeriesCollection(1).Formula = '=SERIES(Tool1!$A,Tool1!$B:$E,Tool1!$B:$E,1)'

然后剩下的,酌情...

$chart.SeriesCollection(2).Formula = '=SERIES(Tool1!$A,Tool1!$B:$E,Tool1!$B:$E,2)'
$chart.SeriesCollection(3).Formula = '=SERIES(Tool1!$A,Tool1!$B:$E,Tool1!$B:$E,3)'
$chart.SeriesCollection(4).Formula = '=SERIES(Tool1!$H,Tool1!$B:$E,Tool1!$I:$L,4)'

现在我们有一个显示所有四个系列的图表,带有我们的图例,并适当地标记:

编辑: 好的,我看到了你的例子,并在 Excel 中复制了它。据我所知,这很简单。这就是我所做的。我在 PowerShell 中将 Excel 作为 comobject 打开并创建了一个空白工作簿。我让它可见,并添加了一些随机名称,并输入了示例图表中列出的 headers。然后我在 PowerShell 中填充了一些 get-random 优点的数据,并手动创建了图表。这是我最终得到的结果:
所以这与你给出的图表非常接近,我正在考虑这个例子。那么 PowerShell 为公式显示了什么?这是我得到的:

=SERIES(Sheet1!$A,Sheet1!$B:$X,Sheet1!$B:$X,1)
=SERIES(Sheet1!$A,Sheet1!$B:$X,Sheet1!$B:$X,2)
=SERIES(Sheet1!$A,Sheet1!$B:$X,Sheet1!$B:$X,3)
=SERIES(Sheet1!$A,Sheet1!$B:$X,Sheet1!$B:$X,4)
=SERIES(Sheet1!$A,Sheet1!$B:$X,Sheet1!$B:$X,5)

SeriesCollection()有5个成员,一人一个。它们的格式与我之前提到的一样。