C++を使用したチャートデータのフィルタリングの3つの方法
1. チャートからシリーズをフィルタリングする
Excelでチャートからシリーズをフィルタリングする手順
Excelでは、特定の系列をフィルタリングして、その系列をチャートに表示しないようにすることができます。元のチャートは図1に示されています。ただし、Testseries2とTestseries4をフィルターアウトすると、チャートは図2のように表示されます。
Aspose.Cellsでも同様の操作が可能です。サンプルファイルのように、Testseries2とTestseries4を除外したい場合、次のコードを実行できます。さらに、2つのリストを管理します。1つはすべての選択された系列を格納する(GetNSeries())、もう1つはフィルタリングされた系列を格納する(GetFilteredNSeries)。
注意:コード中で、**chart->GetNSeries()->Get(0)->SetIsFiltered(true);を設定すると、GetNSeries()の最初の系列が除外され、GetFilteredNSeriesの適切な位置に移動します。その後、前のNSeries[1]**が新しい最初の項目になり、続く系列は1つずつ前にシフトします。これにより、**chart->GetNSeries()->Get(1)->SetIsFiltered(true);**を実行すると、元の3番目の系列が除外されます。この操作は混乱を招く場合があるため、コードの操作は後ろから前へとシリーズを削除する方法を推奨します。
サンプルコード
次のサンプルコードは、サンプル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>
}