用C++筛选图表数据的三种方法。
1. 过滤以渲染图表的系列
在Excel中,我们可以过滤掉图表中的特定系列,导致这些被过滤的系列不会显示在图表中。 原始图表显示在图1中。然而,当我们过滤掉Testseries2和Testseries4时,图表将会如图2所示。
在Excel中,我们可以筛选出特定系列,从而在图表中隐藏那些筛选的系列。原始图表如图1所示。当我们筛选掉Testseries2和Testseries4后,图表将如图2所示。
在Aspose.Cells中,我们可以执行类似操作。对于示例文件,如果要筛选掉Testseries2和Testseries4,可以执行以下代码。此外,我们会维护两个列表:一个(GetNSeries())存储所有被选中的系列,另一个(GetFilteredNSeries)存储筛选后的系列。
请注意,在代码中,当我们设置chart->GetNSeries()->Get(0)->SetIsFiltered(true);时,第一条系列将被移除并放入GetFilteredNSeries中。接着,之前的NSeries[1]将变为新列表的第一项,之后的系列向后移动一位。这意味着如果随后运行chart->GetNSeries()->Get(1)->SetIsFiltered(true);,实际上是移除了原第三个系列。这有时会引起混淆,建议按代码操作,从后向前删除系列。
示例代码
以下示例代码加载了示例Excel文件。
#include <iostream>
#include "Aspose.Cells.h"
using namespace Aspose::Cells;
int main()
{
Aspose::Cells::Startup();
<span class="c1">// Create an instance of existing Workbook
Workbook workbook(u"seriesFiltered.xlsx");
<span class="c1">// Get filtered series list
SeriesCollection nSeriesFiltered = workbook.GetWorksheets().Get(0).GetCharts().Get(u"Chart 1").GetFilteredNSeries();
<span class="c1">// Get selected series list
SeriesCollection nSeries = workbook.GetWorksheets().Get(0).GetCharts().Get(u"Chart 1").GetNSeries();
<span class="c1">// Should be 0
std::cout << "Filtered Series count: " << nSeriesFiltered.GetCount() << std::endl;
<span class="c1">// Should be 6
std::cout << "Visible Series count: " << nSeries.GetCount() << std::endl;
<span class="c1">// Process from the end to the beginning
nSeries.Get(1).SetIsFiltered(true);
nSeries.Get(0).SetIsFiltered(true);
<span class="c1">// Should be 2
std::cout << "Filtered Series count: " << nSeriesFiltered.GetCount() << std::endl;
<span class="c1">// Should be 4
std::cout << "Visible Series count: " << nSeries.GetCount() << std::endl;
<span class="c1">// Save the workbook
workbook.Save(u"seriesFiltered-out.xlsx");
<span class="c1">// Reload the workbook
workbook = Workbook(u"seriesFiltered-out.xlsx");
<span class="c1">// Should be 2
std::cout << "Filtered Series count: " << nSeriesFiltered.GetCount() << std::endl;
<span class="c1">// Should be 4
std::cout << "Visible Series count: " << nSeries.GetCount() << std::endl;
<span class="n">Aspose</span><span class="o">::</span><span class="n">Cells</span><span class="o">::</span><span class="n">Cleanup</span><span class="p">();</span>
}
2. 过滤数据并使图表发生变化
筛选数据是处理大量图表数据的好方法。当你筛选数据时,图表也会相应变化。需要注意的是,要确保图表始终显示在屏幕上,筛选可能会隐藏行,而图表可能位于这些隐藏行中。
使用数据筛选器更改Excel中图表的步骤
- 点击数据范围内部。
- 单击数据选项卡,通过单击筛选器进行筛选。 您的标题行将有下拉箭头。
- 通过转到插入选项卡并选择列图表来创建图表。
- 现在使用数据中的下拉箭头筛选您的数据。 不要使用图表筛选器。
示例代码
以下示例代码展示了使用Aspose.Cells实现相同功能。
#include <iostream>
#include "Aspose.Cells.h"
using namespace Aspose::Cells;
using namespace Aspose::Cells::Charts;
int main() {
Aspose::Cells::Startup();
<span class="c1">// Create an instance of Workbook
Workbook workbook;
<span class="c1">// Get the First sheet.
Worksheet sheet = workbook.GetWorksheets().Get(u"Sheet1");
<span class="c1">// Add data into details cells.
sheet.GetCells().Get(0, 0).PutValue(u"Fruits Name");
sheet.GetCells().Get(0, 1).PutValue(u"Fruits Price");
sheet.GetCells().Get(1, 0).PutValue(u"Apples");
sheet.GetCells().Get(2, 0).PutValue(u"Bananas");
sheet.GetCells().Get(3, 0).PutValue(u"Grapes");
sheet.GetCells().Get(4, 0).PutValue(u"Oranges");
sheet.GetCells().Get(1, 1).PutValue(5);
sheet.GetCells().Get(2, 1).PutValue(2);
sheet.GetCells().Get(3, 1).PutValue(1);
sheet.GetCells().Get(4, 1).PutValue(4);
<span class="c1">// Add a chart to the worksheet
int chartIndex = sheet.GetCharts().Add(ChartType::Column, 7, 7, 15, 15);
<span class="c1">// Access the instance of the newly added chart
Chart chart = sheet.GetCharts().Get(chartIndex);
<span class="c1">// Set data range
chart.SetChartDataRange(u"A1:B5", true);
<span class="c1">// Set AutoFilter range
sheet.GetAutoFilter().SetRange(u"A1:B5");
<span class="c1">// Add filters for a filter column.
sheet.GetAutoFilter().AddFilter(0, u"Bananas");
sheet.GetAutoFilter().AddFilter(0, u"Oranges");
<span class="c1">// Apply the filters
sheet.GetAutoFilter().Refresh();
<span class="c1">// Save the chart as an image
chart.ToImage(u"Autofilter.png");
<span class="c1">// Save the workbook
workbook.Save(u"Autofilter.xlsx");
<span class="n">Aspose</span><span class="o">::</span><span class="n">Cells</span><span class="o">::</span><span class="n">Cleanup</span><span class="p">();</span>
<span class="k">return</span> <span class="mi">0</span><span class="p">;</span>
}
3. 使用表格过滤数据并使图表发生变化
使用表格类似于方法2,使用范围,但表格比范围有优势。当您将范围更改为表格并添加数据时,图表会自动更新。使用范围时,您将不得不更改数据源。
在Excel中格式化为表格
单击数据内部并使用CTRL + T或使用主页选项卡,格式为表格
示例代码
以下示例代码加载了示例Excel文件,展示了使用Aspose.Cells实现相同功能。
#include <iostream>
#include "Aspose.Cells.h"
using namespace Aspose::Cells;
using namespace Aspose::Cells::Charts;
using namespace Aspose::Cells::Tables;
int main()
{
Aspose::Cells::Startup();
<span class="c1">// Create a workbook
Workbook workbook(u"TableFilters.xlsx");
<span class="c1">// Access first worksheet
Worksheet sheet = workbook.GetWorksheets().Get(0);
<span class="c1">// Access the instance of the newly added chart
int chartIndex = sheet.GetCharts().Add(ChartType::Column, 7, 7, 15, 15);
Chart chart = sheet.GetCharts().Get(chartIndex);
<span class="c1">// Set data range
chart.SetChartDataRange(u"A1:B7", true);
<span class="c1">// Convert the chart to image
chart.ToImage(u"TableFilters.before.png");
<span class="c1">// Add a new List Object to the worksheet
ListObject listObject = sheet.GetListObjects().Get(sheet.GetListObjects().Add(u"A1", u"B7", true));
<span class="c1">// Add default style to the table
listObject.SetTableStyleType(TableStyleType::TableStyleMedium10);
<span class="c1">// Show Total
listObject.SetShowTotals(false);
<span class="c1">// Add filters for a filter column
listObject.GetAutoFilter().AddFilter(0, u"James");
<span class="c1">// Apply the filters
listObject.GetAutoFilter().Refresh();
<span class="c1">// After adding new value the chart will change
listObject.PutCellValue(7, 0, Object(u"Me"));
listObject.PutCellValue(7, 1, Object(1000));
<span class="c1">// Check the changed images
chart.ToImage(u"TableFilters.after.png");
<span class="c1">// Saving the Excel file
workbook.Save(u"TableFilter.out.xlsx");
<span class="n">Aspose</span><span class="o">::</span><span class="n">Cells</span><span class="o">::</span><span class="n">Cleanup</span><span class="p">();</span>
}