.NET에서 PowerPoint 프레젠테이션 차트 만들기 또는 업데이트
개요
이 문서는 Aspose.Slides for .NET을 사용하여 차트를 만들고 사용자 지정하는 방법에 대한 포괄적인 가이드를 제공합니다. 슬라이드에 차트를 프로그래밍 방식으로 추가하고, 데이터를 채우며, 특정 디자인 요구 사항에 맞게 다양한 서식 옵션을 적용하는 방법을 배우게 됩니다. 문서 전체에 걸쳐 자세한 코드 예제가 각 단계를 설명합니다. 여기에는 프레젠테이션 및 차트 객체 초기화, 시리즈·축·범례 구성 등이 포함됩니다. 이 가이드를 따라 하면 .NET 애플리케이션에 동적 차트 생성을 통합하는 방법을 확실히 이해하게 되어 데이터 기반 프레젠테이션을 손쉽게 만들 수 있습니다.
차트 만들기
차트는 데이터를 빠르게 시각화하고 표나 스프레드시트에서 바로 드러나지 않을 통찰을 얻는 데 도움이 됩니다.
차트를 만들어야 하는 이유
차트를 사용하면 다음을 할 수 있습니다.
- 대량의 데이터를 한 슬라이드에 집계·압축·요약할 수 있습니다.
- 데이터의 패턴과 추세를 드러낼 수 있습니다.
- 시간 경과 혹은 특정 측정 단위에 따른 데이터의 방향성과 모멘텀을 유추할 수 있습니다.
- 이상값, 편차, 오류 및 의미 없는 데이터를 찾아낼 수 있습니다.
- 복잡한 데이터를 효과적으로 전달하거나 발표할 수 있습니다.
PowerPoint에서는 Insert 기능을 통해 다양한 차트 템플릿을 사용해 차트를 만들 수 있습니다. Aspose.Slides를 사용하면 일반 차트(대중적인 차트 유형 기반)와 사용자 지정 차트를 모두 만들 수 있습니다.
군집 세로 막대 차트 만들기
다음 예제는 AddChart을 사용해 3개의 카테고리에서 두 시리즈를 비교하는 군집 세로 막대 차트를 생성합니다. 시리즈는 빨간색 및 녹색 채우기를 사용하며, 개별 라벨에 카테고리 이름, 시리즈 이름 및 값이 표시됩니다. 워크시트 인덱스 0은 임베드된 차트 워크북의 첫 번째 시트를 가리킵니다.
using System.Drawing;
using Aspose.Slides;
using Aspose.Slides.Charts;
using Aspose.Slides.Export;
using var presentation = new Presentation();
var slide = presentation.Slides[0];
var chart = slide.Shapes.AddChart(ChartType.ClusteredColumn, 20, 20, 500, 300);
chart.ChartTitle.AddTextFrameForOverriding("Sample Title");
chart.ChartTitle.TextFrameForOverriding.TextFrameFormat.CenterText = NullableBool.True;
chart.ChartTitle.Height = 20;
chart.HasTitle = true;
var workbook = chart.ChartData.ChartDataWorkbook;
var worksheetIndex = 0;
chart.ChartData.Series.Clear();
chart.ChartData.Categories.Clear();
var seriesNameCell = workbook.GetCell(worksheetIndex, 0, 1, "Series 1");
chart.ChartData.Series.Add(seriesNameCell, chart.Type);
seriesNameCell = workbook.GetCell(worksheetIndex, 0, 2, "Series 2");
chart.ChartData.Series.Add(seriesNameCell, chart.Type);
var categoryCell = workbook.GetCell(worksheetIndex, 1, 0, "Category 1");
chart.ChartData.Categories.Add(categoryCell);
categoryCell = workbook.GetCell(worksheetIndex, 2, 0, "Category 2");
chart.ChartData.Categories.Add(categoryCell);
categoryCell = workbook.GetCell(worksheetIndex, 3, 0, "Category 3");
chart.ChartData.Categories.Add(categoryCell);
var series = chart.ChartData.Series[0];
var valueCell = workbook.GetCell(worksheetIndex, 1, 1, 20);
series.DataPoints.AddDataPointForBarSeries(valueCell);
valueCell = workbook.GetCell(worksheetIndex, 2, 1, 50);
series.DataPoints.AddDataPointForBarSeries(valueCell);
valueCell = workbook.GetCell(worksheetIndex, 3, 1, 30);
series.DataPoints.AddDataPointForBarSeries(valueCell);
series.Format.Fill.FillType = FillType.Solid;
series.Format.Fill.SolidFillColor.Color = Color.Red;
series = chart.ChartData.Series[1];
valueCell = workbook.GetCell(worksheetIndex, 1, 2, 30);
series.DataPoints.AddDataPointForBarSeries(valueCell);
valueCell = workbook.GetCell(worksheetIndex, 2, 2, 10);
series.DataPoints.AddDataPointForBarSeries(valueCell);
valueCell = workbook.GetCell(worksheetIndex, 3, 2, 60);
series.DataPoints.AddDataPointForBarSeries(valueCell);
series.Format.Fill.FillType = FillType.Solid;
series.Format.Fill.SolidFillColor.Color = Color.Green;
var label = series.DataPoints[0].Label;
label.DataLabelFormat.ShowCategoryName = true;
label = series.DataPoints[1].Label;
label.DataLabelFormat.ShowSeriesName = true;
label = series.DataPoints[2].Label;
label.DataLabelFormat.ShowValue = true;
label.DataLabelFormat.ShowSeriesName = true;
label.DataLabelFormat.Separator = "/";
presentation.Save("AsposeChart.pptx", SaveFormat.Pptx);
결과:

산점도 차트 만들기
산점도 차트(또는 x‑y 그래프)는 두 변수 간의 패턴을 확인하거나 상관 관계를 보여줄 때 자주 사용됩니다.
산점도 차트를 사용해야 할 경우:
- 숫자 쌍 데이터가 있는 경우
- 두 변수가 서로 밀접하게 연관된 경우
- 두 변수가 관련이 있는지 판단하고 싶은 경우
- 종속 변수에 대해 독립 변수가 여러 값을 갖는 경우
다음 예제는 두 세트의 x‑y 값을 플롯합니다. 첫 번째 시리즈는 별 마커가 있는 직선, 두 번째 시리즈는 원형 마커가 있는 부드러운 곡선을 사용하며, 두 시리즈 모두 크기 10(Size)을 갖습니다. Symbol 속성으로 마커 모양을 제어합니다.
using Aspose.Slides;
using Aspose.Slides.Charts;
using Aspose.Slides.Export;
using var presentation = new Presentation();
var slide = presentation.Slides[0];
var chart = slide.Shapes.AddChart(ChartType.ScatterWithSmoothLines, 20, 20, 500, 300);
var workbook = chart.ChartData.ChartDataWorkbook;
var worksheetIndex = 0;
chart.ChartData.Series.Clear();
var seriesNameCell = workbook.GetCell(worksheetIndex, 1, 1, "Series 1");
chart.ChartData.Series.Add(seriesNameCell, chart.Type);
seriesNameCell = workbook.GetCell(worksheetIndex, 1, 3, "Series 2");
chart.ChartData.Series.Add(seriesNameCell, chart.Type);
var series = chart.ChartData.Series[0];
var xValueCell = workbook.GetCell(worksheetIndex, 2, 1, 1);
var yValueCell = workbook.GetCell(worksheetIndex, 2, 2, 3);
series.DataPoints.AddDataPointForScatterSeries(xValueCell, yValueCell);
xValueCell = workbook.GetCell(worksheetIndex, 3, 1, 2);
yValueCell = workbook.GetCell(worksheetIndex, 3, 2, 10);
series.DataPoints.AddDataPointForScatterSeries(xValueCell, yValueCell);
series.Type = ChartType.ScatterWithStraightLinesAndMarkers;
series.Marker.Size = 10;
series.Marker.Symbol = MarkerStyleType.Star;
series = chart.ChartData.Series[1];
xValueCell = workbook.GetCell(worksheetIndex, 2, 3, 5);
yValueCell = workbook.GetCell(worksheetIndex, 2, 4, 2);
series.DataPoints.AddDataPointForScatterSeries(xValueCell, yValueCell);
xValueCell = workbook.GetCell(worksheetIndex, 3, 3, 3);
yValueCell = workbook.GetCell(worksheetIndex, 3, 4, 1);
series.DataPoints.AddDataPointForScatterSeries(xValueCell, yValueCell);
xValueCell = workbook.GetCell(worksheetIndex, 4, 3, 2);
yValueCell = workbook.GetCell(worksheetIndex, 4, 4, 2);
series.DataPoints.AddDataPointForScatterSeries(xValueCell, yValueCell);
xValueCell = workbook.GetCell(worksheetIndex, 5, 3, 5);
yValueCell = workbook.GetCell(worksheetIndex, 5, 4, 1);
series.DataPoints.AddDataPointForScatterSeries(xValueCell, yValueCell);
series.Marker.Size = 10;
series.Marker.Symbol = MarkerStyleType.Circle;
presentation.Save("AsposeChart.pptx", SaveFormat.Pptx);
결과:

원형 차트 만들기
원형 차트는 특히 카테고리 레이블이 숫자 값과 함께 있을 때, 전체 대비 부분 관계를 보여주는 데 가장 적합합니다. 그러나 파트나 레이블이 많을 경우 막대 차트를 고려하는 것이 좋습니다.
다음 예제는 3개의 분기 값을 갖는 원형 차트를 생성합니다. 각 슬라이스는 사용자 지정 채우기와 테두리를 가지고 있으며, 라벨은 값·백분율·시리즈 정보를 다양한 조합으로 표시합니다. FirstSliceAngle 속성으로 첫 슬라이스가 180도부터 시작하도록 설정합니다.
using System.Drawing;
using Aspose.Slides;
using Aspose.Slides.Charts;
using Aspose.Slides.Export;
using var presentation = new Presentation();
var slide = presentation.Slides[0];
var chart = slide.Shapes.AddChart(ChartType.Pie, 20, 20, 500, 300);
chart.ChartTitle.AddTextFrameForOverriding("Sample Title");
chart.ChartTitle.TextFrameForOverriding.TextFrameFormat.CenterText = NullableBool.True;
chart.ChartTitle.Height = 20;
chart.HasTitle = true;
chart.ChartData.Series[0].Labels.DefaultDataLabelFormat.ShowValue = true;
var workbook = chart.ChartData.ChartDataWorkbook;
var worksheetIndex = 0;
chart.ChartData.Series.Clear();
chart.ChartData.Categories.Clear();
var categoryCell = workbook.GetCell(0, 1, 0, "1st Qtr");
chart.ChartData.Categories.Add(categoryCell);
categoryCell = workbook.GetCell(0, 2, 0, "2nd Qtr");
chart.ChartData.Categories.Add(categoryCell);
categoryCell = workbook.GetCell(0, 3, 0, "3rd Qtr");
chart.ChartData.Categories.Add(categoryCell);
var seriesNameCell = workbook.GetCell(0, 0, 1, "Series 1");
var series = chart.ChartData.Series.Add(seriesNameCell, chart.Type);
var valueCell = workbook.GetCell(worksheetIndex, 1, 1, 20);
series.DataPoints.AddDataPointForPieSeries(valueCell);
valueCell = workbook.GetCell(worksheetIndex, 2, 1, 50);
series.DataPoints.AddDataPointForPieSeries(valueCell);
valueCell = workbook.GetCell(worksheetIndex, 3, 1, 30);
series.DataPoints.AddDataPointForPieSeries(valueCell);
chart.ChartData.SeriesGroups[0].IsColorVaried = true;
var firstSlice = series.DataPoints[0];
firstSlice.Format.Fill.FillType = FillType.Solid;
firstSlice.Format.Fill.SolidFillColor.Color = Color.Cyan;
firstSlice.Format.Line.FillFormat.FillType = FillType.Solid;
firstSlice.Format.Line.FillFormat.SolidFillColor.Color = Color.Gray;
firstSlice.Format.Line.Width = 3.0;
firstSlice.Format.Line.Style = LineStyle.ThinThick;
firstSlice.Format.Line.DashStyle = LineDashStyle.LargeDash;
var secondSlice = series.DataPoints[1];
secondSlice.Format.Fill.FillType = FillType.Solid;
secondSlice.Format.Fill.SolidFillColor.Color = Color.Brown;
secondSlice.Format.Line.FillFormat.FillType = FillType.Solid;
secondSlice.Format.Line.FillFormat.SolidFillColor.Color = Color.Blue;
secondSlice.Format.Line.Width = 3.0;
secondSlice.Format.Line.Style = LineStyle.Single;
secondSlice.Format.Line.DashStyle = LineDashStyle.LargeDashDot;
var thirdSlice = series.DataPoints[2];
thirdSlice.Format.Fill.FillType = FillType.Solid;
thirdSlice.Format.Fill.SolidFillColor.Color = Color.Coral;
thirdSlice.Format.Line.FillFormat.FillType = FillType.Solid;
thirdSlice.Format.Line.FillFormat.SolidFillColor.Color = Color.Red;
thirdSlice.Format.Line.Width = 2.0;
thirdSlice.Format.Line.Style = LineStyle.ThinThin;
thirdSlice.Format.Line.DashStyle = LineDashStyle.LargeDashDotDot;
var firstLabel = series.DataPoints[0].Label;
firstLabel.DataLabelFormat.ShowValue = true;
var secondLabel = series.DataPoints[1].Label;
secondLabel.DataLabelFormat.ShowValue = true;
secondLabel.DataLabelFormat.ShowLegendKey = true;
secondLabel.DataLabelFormat.ShowPercentage = true;
var thirdLabel = series.DataPoints[2].Label;
thirdLabel.DataLabelFormat.ShowSeriesName = true;
thirdLabel.DataLabelFormat.ShowPercentage = true;
series.Labels.DefaultDataLabelFormat.ShowLeaderLines = true;
chart.ChartData.SeriesGroups[0].FirstSliceAngle = 180;
presentation.Save("PieChart.pptx", SaveFormat.Pptx);
결과:

라벨을 파이 외부에 배치하고 라인 색상·두께·투명도·대시 스타일을 사용자 지정하는 예제는 Format Leader Lines 를 참고하십시오.
꺾은선 차트 만들기
꺾은선 차트(또는 선 그래프)는 시간에 따른 값 변화 를 보여줄 때 가장 적합합니다. 꺾은선 차트를 사용하면 대량 데이터를 한 번에 비교하고, 시간에 따른 변화·추세를 추적하며, 데이터 시리즈의 이상치를 강조하는 등 다양한 작업을 수행할 수 있습니다.
다음 예제는 AddChart을 사용해 기본 시리즈와 카테고리를 가진 꺾은선 차트를 만들고 PPTX 로 저장합니다.
using Aspose.Slides;
using Aspose.Slides.Charts;
using Aspose.Slides.Export;
using var presentation = new Presentation();
var slide = presentation.Slides[0];
var lineChart = slide.Shapes.AddChart(ChartType.Line, 20, 20, 500, 300);
presentation.Save("lineChart.pptx", SaveFormat.Pptx);
기본적으로 꺾은선 차트의 점은 직선으로 연결됩니다. 점을 대시선으로 연결하려면 DashStyle을 LineDashStyle의 값으로 설정하십시오:
using Aspose.Slides;
using Aspose.Slides.Charts;
using var presentation = new Presentation();
var slide = presentation.Slides[0];
var lineChart = slide.Shapes.AddChart(ChartType.Line, 20, 20, 500, 300);
foreach (var series in lineChart.ChartData.Series)
{
series.Format.Line.DashStyle = LineDashStyle.Dash;
}
결과:

트리맵 차트 만들기
트리맵 차트는 각 카테고리의 상대적인 크기를 표시하고, 각 카테고리 내에서 큰 기여도를 차지하는 항목에 주의를 끌고자 할 때 가장 적합합니다.
다음 예제는 8개의 잎을 4개의 줄기와 2개의 가지로 그룹화한 트리맵을 생성합니다. SetGroupingItem 메서드로 1단계에 줄기, 2단계에 가지를 할당합니다. 값은 사각형 크기의 상대적인 비율을 결정하고, 카테고리 라벨과 겹치는 상위 라벨이 계층 구조를 나타냅니다.
using Aspose.Slides;
using Aspose.Slides.Charts;
using Aspose.Slides.Export;
using var presentation = new Presentation();
var slide = presentation.Slides[0];
var chart = slide.Shapes.AddChart(ChartType.Treemap, 20, 20, 500, 300);
chart.ChartData.Categories.Clear();
chart.ChartData.Series.Clear();
var workbook = chart.ChartData.ChartDataWorkbook;
workbook.Clear(0);
// 브랜치 1
var categoryCell = workbook.GetCell(0, "C1", "Leaf1");
var leaf = chart.ChartData.Categories.Add(categoryCell);
leaf.GroupingLevels.SetGroupingItem(1, "Stem1");
leaf.GroupingLevels.SetGroupingItem(2, "Branch1");
categoryCell = workbook.GetCell(0, "C2", "Leaf2");
chart.ChartData.Categories.Add(categoryCell);
categoryCell = workbook.GetCell(0, "C3", "Leaf3");
leaf = chart.ChartData.Categories.Add(categoryCell);
leaf.GroupingLevels.SetGroupingItem(1, "Stem2");
categoryCell = workbook.GetCell(0, "C4", "Leaf4");
chart.ChartData.Categories.Add(categoryCell);
// 브랜치 2
categoryCell = workbook.GetCell(0, "C5", "Leaf5");
leaf = chart.ChartData.Categories.Add(categoryCell);
leaf.GroupingLevels.SetGroupingItem(1, "Stem3");
leaf.GroupingLevels.SetGroupingItem(2, "Branch2");
categoryCell = workbook.GetCell(0, "C6", "Leaf6");
chart.ChartData.Categories.Add(categoryCell);
categoryCell = workbook.GetCell(0, "C7", "Leaf7");
leaf = chart.ChartData.Categories.Add(categoryCell);
leaf.GroupingLevels.SetGroupingItem(1, "Stem4");
categoryCell = workbook.GetCell(0, "C8", "Leaf8");
chart.ChartData.Categories.Add(categoryCell);
var series = chart.ChartData.Series.Add(ChartType.Treemap);
series.Labels.DefaultDataLabelFormat.ShowCategoryName = true;
var valueCell = workbook.GetCell(0, "D1", 4);
series.DataPoints.AddDataPointForTreemapSeries(valueCell);
valueCell = workbook.GetCell(0, "D2", 5);
series.DataPoints.AddDataPointForTreemapSeries(valueCell);
valueCell = workbook.GetCell(0, "D3", 3);
series.DataPoints.AddDataPointForTreemapSeries(valueCell);
valueCell = workbook.GetCell(0, "D4", 6);
series.DataPoints.AddDataPointForTreemapSeries(valueCell);
valueCell = workbook.GetCell(0, "D5", 9);
series.DataPoints.AddDataPointForTreemapSeries(valueCell);
valueCell = workbook.GetCell(0, "D6", 9);
series.DataPoints.AddDataPointForTreemapSeries(valueCell);
valueCell = workbook.GetCell(0, "D7", 4);
series.DataPoints.AddDataPointForTreemapSeries(valueCell);
valueCell = workbook.GetCell(0, "D8", 3);
series.DataPoints.AddDataPointForTreemapSeries(valueCell);
series.ParentLabelLayout = ParentLabelLayoutType.Overlapping;
presentation.Save("Treemap.pptx", SaveFormat.Pptx);
결과:

워터폴 차트 만들기
워터폴 차트는 양·음의 변화가 최종값에 어떻게 기여하는지를 보여줍니다. 예를 들어, 매출에서 비용을 차감하고 기타 수익을 더해 순이익을 구하는 과정을 시각화할 수 있습니다. 변화 열은 이전 값과 새로운 누적 값 사이를 연결하고, 총계 열은 0에서 누적값까지 확장됩니다.
다음 예제는 천 달러 단위 금액을 사용합니다:
| 카테고리 | 워크북 값 | 열 유형 |
|---|---|---|
| 매출 | 1000 | 증가 |
| 매출원가 | -400 | 감소 |
| 총이익 | 600 | 중간 합계 |
| 영업비용 | -200 | 감소 |
| 기타 수익 | 50 | 증가 |
| 순이익 | 450 | 최종 합계 |
점이 중간 합계 또는 최종 합계인지 표시하려면 해당 점의 SetAsTotal 속성을 true 로 설정하십시오. 워크북 셀에 실제 누적 금액을 입력합니다: 총이익은 600(1000 - 400), 순이익은 450(600 - 200 + 50). 이 속성은 열을 합계로 표시하지만 셀 값을 계산하거나 채우지는 않습니다. 제자리값 0을 사용하거나 합계 점에 다른 변화를 제공하지 마십시오. 총계 열은 누적값을 한 번만 표시합니다.
다음 C# 예제는 Waterfall 멤버(ChartType)를 사용해 차트를 만들고, 기본 데이터를 지운 뒤 임베드된 워크북을 채웁니다. 워크시트 인덱스 0은 첫 번째 워크시트를 선택합니다; A 열은 카테고리 이름, B 열은 값을 포함합니다. 각 값 셀은 AddDataPointForWaterfallSeries 로 추가합니다. 0‑베이스 점 인덱스 2와 5는 각각 중간 및 최종 합계를 지정합니다. ShowValue 를 활성화하면 열에 금액이 표시됩니다. 입력 프레젠테이션이나 워크북은 필요하지 않습니다.
using Aspose.Slides;
using Aspose.Slides.Charts;
using Aspose.Slides.Export;
using var presentation = new Presentation();
var slide = presentation.Slides[0];
var chart = slide.Shapes.AddChart(ChartType.Waterfall, 20, 20, 680, 200);
chart.HasTitle = true;
chart.ChartTitle.AddTextFrameForOverriding("Profit breakdown (USD thousands)");
chart.ChartTitle.Overlay = false;
chart.HasLegend = false;
chart.ChartData.Series.Clear();
chart.ChartData.Categories.Clear();
var workbook = chart.ChartData.ChartDataWorkbook;
var worksheetIndex = 0;
workbook.Clear(worksheetIndex);
var seriesNameCell = workbook.GetCell(worksheetIndex, 0, 1, "Profit");
var series = chart.ChartData.Series.Add(seriesNameCell, ChartType.Waterfall);
var categories = new[] { "Revenue", "Cost of sales", "Gross profit", "Operating expenses", "Other income", "Net profit" };
var values = new double[] { 1000, -400, 600, -200, 50, 450 };
for (var i = 0; i < categories.Length; i++)
{
var categoryCell = workbook.GetCell(worksheetIndex, i + 1, 0, categories[i]);
chart.ChartData.Categories.Add(categoryCell);
var valueCell = workbook.GetCell(worksheetIndex, i + 1, 1, values[i]);
series.DataPoints.AddDataPointForWaterfallSeries(valueCell);
}
// 세 번째와 여섯 번째 점은 추가 변동이 아니라 합계입니다.
series.DataPoints[2].SetAsTotal = true;
series.DataPoints[5].SetAsTotal = true;
series.ShowConnectorLines = true;
series.Labels.DefaultDataLabelFormat.ShowValue = true;
presentation.Save("WaterfallChart.pptx", SaveFormat.Pptx);
시리즈 수준의 ShowConnectorLines 속성을 true 로 설정하면 연속 열을 연결하는 선이 표시돼 누적값을 따라가기 쉽습니다. 이 선을 숨기려면 예제에서 series.ShowConnectorLines = false; 로 바꾸고 저장하십시오. 이는 선의 표시 여부만 바꾸며 데이터나 합계에는 영향을 주지 않습니다.
저장된 프레젠테이션은 총이익 600과 순이익 450을 0부터 시작하는 두 합계가 표시됩니다:

주식 차트 만들기
주식 차트는 시가·고가·저가·종가와 같은 금융 데이터를 표시해 시장 추세와 변동성을 분석하는 데 도움을 줍니다. 투자자와 분석가가 정보에 기반한 결정을 내리는 데 필수적인 인사이트를 제공합니다.
다음 예제는 시가·고가·저가·종가 순서의 4개 시리즈와 3개 카테고리를 가진 차트를 생성합니다. HasUpDownBars 속성으로 상승·하강 막대를 활성화하고, HiLowLinesFormat 로 가격 범위 표시 선을 제어합니다. 개별 시리즈 선과 작은 수평 격선은 숨겨집니다.
using Aspose.Slides;
using Aspose.Slides.Charts;
using Aspose.Slides.Export;
using var presentation = new Presentation();
var slide = presentation.Slides[0];
var chart = slide.Shapes.AddChart(ChartType.OpenHighLowClose, 20, 20, 500, 300, false);
var workbook = chart.ChartData.ChartDataWorkbook;
var categoryCell = workbook.GetCell(0, 1, 0, "A");
chart.ChartData.Categories.Add(categoryCell);
categoryCell = workbook.GetCell(0, 2, 0, "B");
chart.ChartData.Categories.Add(categoryCell);
categoryCell = workbook.GetCell(0, 3, 0, "C");
chart.ChartData.Categories.Add(categoryCell);
var seriesNameCell = workbook.GetCell(0, 0, 1, "Open");
chart.ChartData.Series.Add(seriesNameCell, ChartType.OpenHighLowClose);
seriesNameCell = workbook.GetCell(0, 0, 2, "High");
chart.ChartData.Series.Add(seriesNameCell, ChartType.OpenHighLowClose);
seriesNameCell = workbook.GetCell(0, 0, 3, "Low");
chart.ChartData.Series.Add(seriesNameCell, ChartType.OpenHighLowClose);
seriesNameCell = workbook.GetCell(0, 0, 4, "Close");
chart.ChartData.Series.Add(seriesNameCell, ChartType.OpenHighLowClose);
var series = chart.ChartData.Series[0];
var valueCell = workbook.GetCell(0, 1, 1, 72);
series.DataPoints.AddDataPointForStockSeries(valueCell);
valueCell = workbook.GetCell(0, 2, 1, 25);
series.DataPoints.AddDataPointForStockSeries(valueCell);
valueCell = workbook.GetCell(0, 3, 1, 38);
series.DataPoints.AddDataPointForStockSeries(valueCell);
series = chart.ChartData.Series[1];
valueCell = workbook.GetCell(0, 1, 2, 172);
series.DataPoints.AddDataPointForStockSeries(valueCell);
valueCell = workbook.GetCell(0, 2, 2, 57);
series.DataPoints.AddDataPointForStockSeries(valueCell);
valueCell = workbook.GetCell(0, 3, 2, 57);
series.DataPoints.AddDataPointForStockSeries(valueCell);
series = chart.ChartData.Series[2];
valueCell = workbook.GetCell(0, 1, 3, 12);
series.DataPoints.AddDataPointForStockSeries(valueCell);
valueCell = workbook.GetCell(0, 2, 3, 12);
series.DataPoints.AddDataPointForStockSeries(valueCell);
valueCell = workbook.GetCell(0, 3, 3, 13);
series.DataPoints.AddDataPointForStockSeries(valueCell);
series = chart.ChartData.Series[3];
valueCell = workbook.GetCell(0, 1, 4, 25);
series.DataPoints.AddDataPointForStockSeries(valueCell);
valueCell = workbook.GetCell(0, 2, 4, 38);
series.DataPoints.AddDataPointForStockSeries(valueCell);
valueCell = workbook.GetCell(0, 3, 4, 50);
series.DataPoints.AddDataPointForStockSeries(valueCell);
chart.ChartData.SeriesGroups[0].UpDownBars.HasUpDownBars = true;
chart.ChartData.SeriesGroups[0].HiLowLinesFormat.Line.FillFormat.FillType = FillType.Solid;
foreach (var stockSeries in chart.ChartData.Series)
{
stockSeries.Format.Line.FillFormat.FillType = FillType.NoFill;
}
chart.Axes.VerticalAxis.MinorGridLinesFormat.Line.FillFormat.FillType = FillType.NoFill;
presentation.Save("Stock-chart.pptx", SaveFormat.Pptx);
결과:

사분위·수염 차트 만들기
사분위·수염 차트는 중위수, 사분위수 및 잠재적 이상값과 같은 핵심 통계 측정을 요약하여 데이터 분포를 표시합니다. 탐색적 데이터 분석 및 통계 연구에서 데이터 변동성을 빠르게 파악하고 이상치를 식별하는 데 유용합니다.
다음 예제는 6개의 값을 사용해 사분위·수염 차트를 생성합니다. QuartileMethod 속성으로 배타적 사분위 계산을 선택합니다. 또한 평균 선·평균 마커·내부 점·이상점이 활성화됩니다.
using Aspose.Slides;
using Aspose.Slides.Charts;
using Aspose.Slides.Export;
using var presentation = new Presentation();
var slide = presentation.Slides[0];
var chart = slide.Shapes.AddChart(ChartType.BoxAndWhisker, 20, 20, 500, 300);
chart.ChartData.Categories.Clear();
chart.ChartData.Series.Clear();
var workbook = chart.ChartData.ChartDataWorkbook;
workbook.Clear(0);
var categoryCell = workbook.GetCell(0, "A1", "Category 1");
chart.ChartData.Categories.Add(categoryCell);
categoryCell = workbook.GetCell(0, "A2", "Category 2");
chart.ChartData.Categories.Add(categoryCell);
categoryCell = workbook.GetCell(0, "A3", "Category 3");
chart.ChartData.Categories.Add(categoryCell);
categoryCell = workbook.GetCell(0, "A4", "Category 4");
chart.ChartData.Categories.Add(categoryCell);
categoryCell = workbook.GetCell(0, "A5", "Category 5");
chart.ChartData.Categories.Add(categoryCell);
categoryCell = workbook.GetCell(0, "A6", "Category 6");
chart.ChartData.Categories.Add(categoryCell);
var series = chart.ChartData.Series.Add(ChartType.BoxAndWhisker);
series.QuartileMethod = QuartileMethodType.Exclusive;
series.ShowMeanLine = true;
series.ShowMeanMarkers = true;
series.ShowInnerPoints = true;
series.ShowOutlierPoints = true;
var valueCell = workbook.GetCell(0, "B1", 15);
series.DataPoints.AddDataPointForBoxAndWhiskerSeries(valueCell);
valueCell = workbook.GetCell(0, "B2", 41);
series.DataPoints.AddDataPointForBoxAndWhiskerSeries(valueCell);
valueCell = workbook.GetCell(0, "B3", 16);
series.DataPoints.AddDataPointForBoxAndWhiskerSeries(valueCell);
valueCell = workbook.GetCell(0, "B4", 10);
series.DataPoints.AddDataPointForBoxAndWhiskerSeries(valueCell);
valueCell = workbook.GetCell(0, "B5", 23);
series.DataPoints.AddDataPointForBoxAndWhiskerSeries(valueCell);
valueCell = workbook.GetCell(0, "B6", 16);
series.DataPoints.AddDataPointForBoxAndWhiskerSeries(valueCell);
presentation.Save("BoxAndWhisker.pptx", SaveFormat.Pptx);
펀넬 차트 만들기
펀넬 차트는 단계별로 데이터 양이 감소하는 프로세스를 시각화하는 데 사용됩니다. 전환율 분석, 병목 현상 파악, 영업·마케팅 프로세스 효율성 추적 등에 특히 유용합니다.
다음 예제는 AddChart을 사용해 기존 프레젠테이션의 첫 슬라이드에 펀넬 차트를 추가합니다. 기본 데이터를 6개의 카테고리와 50~500 사이 값으로 교체한 뒤 업데이트된 프레젠테이션을 저장합니다. 입력 프레젠테이션에는 최소 한 개의 슬라이드가 있어야 합니다.
using Aspose.Slides;
using Aspose.Slides.Charts;
using Aspose.Slides.Export;
using var presentation = new Presentation("test.pptx");
var slide = presentation.Slides[0];
var chart = slide.Shapes.AddChart(ChartType.Funnel, 50, 50, 500, 400);
chart.ChartData.Categories.Clear();
chart.ChartData.Series.Clear();
var workbook = chart.ChartData.ChartDataWorkbook;
workbook.Clear(0);
var categoryCell = workbook.GetCell(0, "A1", "Category 1");
chart.ChartData.Categories.Add(categoryCell);
categoryCell = workbook.GetCell(0, "A2", "Category 2");
chart.ChartData.Categories.Add(categoryCell);
categoryCell = workbook.GetCell(0, "A3", "Category 3");
chart.ChartData.Categories.Add(categoryCell);
categoryCell = workbook.GetCell(0, "A4", "Category 4");
chart.ChartData.Categories.Add(categoryCell);
categoryCell = workbook.GetCell(0, "A5", "Category 5");
chart.ChartData.Categories.Add(categoryCell);
categoryCell = workbook.GetCell(0, "A6", "Category 6");
chart.ChartData.Categories.Add(categoryCell);
var series = chart.ChartData.Series.Add(ChartType.Funnel);
var valueCell = workbook.GetCell(0, "B1", 50);
series.DataPoints.AddDataPointForFunnelSeries(valueCell);
valueCell = workbook.GetCell(0, "B2", 100);
series.DataPoints.AddDataPointForFunnelSeries(valueCell);
valueCell = workbook.GetCell(0, "B3", 200);
series.DataPoints.AddDataPointForFunnelSeries(valueCell);
valueCell = workbook.GetCell(0, "B4", 300);
series.DataPoints.AddDataPointForFunnelSeries(valueCell);
valueCell = workbook.GetCell(0, "B5", 400);
series.DataPoints.AddDataPointForFunnelSeries(valueCell);
valueCell = workbook.GetCell(0, "B6", 500);
series.DataPoints.AddDataPointForFunnelSeries(valueCell);
presentation.Save("Funnel.pptx", SaveFormat.Pptx);
결과:

선버스트 차트 만들기
선버스트 차트는 계층 데이터를 동심원 형태로 시각화해 전체 대비 부분 관계를 보여줍니다. 중첩된 카테고리와 하위 카테고리를 명확하고 컴팩트하게 표현할 때 적합합니다.
다음 예제는 8개의 잎을 4개의 줄기와 2개의 가지로 그룹화한 선버스트 차트를 생성합니다. SetGroupingItem 메서드로 1단계에 줄기, 2단계에 가지를 할당합니다. 카테고리 라벨이 구간을 식별하고, 값이 상대 크기를 결정합니다.
using Aspose.Slides;
using Aspose.Slides.Charts;
using Aspose.Slides.Export;
using var presentation = new Presentation();
var slide = presentation.Slides[0];
var chart = slide.Shapes.AddChart(ChartType.Sunburst, 20, 20, 500, 300);
chart.ChartData.Categories.Clear();
chart.ChartData.Series.Clear();
var workbook = chart.ChartData.ChartDataWorkbook;
workbook.Clear(0);
// 브랜치 1
var categoryCell = workbook.GetCell(0, "C1", "Leaf1");
var leaf = chart.ChartData.Categories.Add(categoryCell);
leaf.GroupingLevels.SetGroupingItem(1, "Stem1");
leaf.GroupingLevels.SetGroupingItem(2, "Branch1");
categoryCell = workbook.GetCell(0, "C2", "Leaf2");
chart.ChartData.Categories.Add(categoryCell);
categoryCell = workbook.GetCell(0, "C3", "Leaf3");
leaf = chart.ChartData.Categories.Add(categoryCell);
leaf.GroupingLevels.SetGroupingItem(1, "Stem2");
categoryCell = workbook.GetCell(0, "C4", "Leaf4");
chart.ChartData.Categories.Add(categoryCell);
// 브랜치 2
categoryCell = workbook.GetCell(0, "C5", "Leaf5");
leaf = chart.ChartData.Categories.Add(categoryCell);
leaf.GroupingLevels.SetGroupingItem(1, "Stem3");
leaf.GroupingLevels.SetGroupingItem(2, "Branch2");
categoryCell = workbook.GetCell(0, "C6", "Leaf6");
chart.ChartData.Categories.Add(categoryCell);
categoryCell = workbook.GetCell(0, "C7", "Leaf7");
leaf = chart.ChartData.Categories.Add(categoryCell);
leaf.GroupingLevels.SetGroupingItem(1, "Stem4");
categoryCell = workbook.GetCell(0, "C8", "Leaf8");
chart.ChartData.Categories.Add(categoryCell);
var series = chart.ChartData.Series.Add(ChartType.Sunburst);
series.Labels.DefaultDataLabelFormat.ShowCategoryName = true;
var valueCell = workbook.GetCell(0, "D1", 4);
series.DataPoints.AddDataPointForSunburstSeries(valueCell);
valueCell = workbook.GetCell(0, "D2", 5);
series.DataPoints.AddDataPointForSunburstSeries(valueCell);
valueCell = workbook.GetCell(0, "D3", 3);
series.DataPoints.AddDataPointForSunburstSeries(valueCell);
valueCell = workbook.GetCell(0, "D4", 6);
series.DataPoints.AddDataPointForSunburstSeries(valueCell);
valueCell = workbook.GetCell(0, "D5", 9);
series.DataPoints.AddDataPointForSunburstSeries(valueCell);
valueCell = workbook.GetCell(0, "D6", 9);
series.DataPoints.AddDataPointForSunburstSeries(valueCell);
valueCell = workbook.GetCell(0, "D7", 4);
series.DataPoints.AddDataPointForSunburstSeries(valueCell);
valueCell = workbook.GetCell(0, "D8", 3);
series.DataPoints.AddDataPointForSunburstSeries(valueCell);
presentation.Save("Sunburst.pptx", SaveFormat.Pptx);
결과:

히스토그램 차트 만들기
히스토그램 차트는数値값이 구간(빈)별로 어떻게 분포하는지를 보여줍니다. 주문 처리 시간과 같은 월간 보고서에서는 동일한 빈 너비와 임계값을 사용해 구간을 일관되게 유지하고 분포를 비교하기 쉽도록 합니다.
가로축의 AggregationType 을 AxisAggregationType 의 모드로 설정합니다. ByBinWidth 에서는 BinWidth 가 적용되고, ByNumberOfBins 에서는 NumberOfBins 가 적용됩니다. Automatic 을 사용하면 차트가 자동으로 빈을 선택합니다.
고정 빈 너비 사용
다음 예제는 10분 간격으로 처리 시간을 그룹화하고, 10분 이하와 40분 초과에 별도 빈을 둡니다. IsUnderflowBin 과 IsOverflowBin 로 이러한 빈을 활성화합니다. 명시적인 UnderflowBin 및 OverflowBin 임계값을 제공할 경우, IsAutomaticUnderflowBin 과 IsAutomaticOverflowBin 를 false 로 설정합니다.
using Aspose.Slides;
using Aspose.Slides.Charts;
using Aspose.Slides.Export;
using var presentation = new Presentation();
var slide = presentation.Slides[0];
var chart = slide.Shapes.AddChart(ChartType.Histogram, 20, 20, 680, 200);
chart.HasLegend = false;
chart.HasTitle = false;
chart.ChartData.Categories.Clear();
chart.ChartData.Series.Clear();
var workbook = chart.ChartData.ChartDataWorkbook;
workbook.Clear(0);
var series = chart.ChartData.Series.Add(ChartType.Histogram);
double[] values = { 5, 10, 10, 11, 15, 20, 20, 21, 25, 30, 30, 31, 35, 40, 40, 41, 50 };
for (var i = 0; i < values.Length; i++)
{
var valueCell = workbook.GetCell(0, i, 0, values[i]);
series.DataPoints.AddDataPointForHistogramSeries(valueCell);
}
var axis = chart.Axes.HorizontalAxis;
axis.AggregationType = AxisAggregationType.ByBinWidth;
axis.BinWidth = 10;
axis.IsUnderflowBin = true;
axis.IsAutomaticUnderflowBin = false;
axis.UnderflowBin = 10;
axis.IsOverflowBin = true;
axis.IsAutomaticOverflowBin = false;
axis.OverflowBin = 40;
presentation.Save("Histogram-bin-width.pptx", SaveFormat.Pptx);
PowerPoint에서 표시되는 프레젠테이션은 3, 4, 4, 4, 2 개의 빈 카운트를 보여줍니다. 언더플로우 빈은 5, 10, 10을 포함하므로 임계값이 포함됩니다. 오버플로우 빈은 41, 50만 포함하므로 임계값이 제외됩니다; 40은 앞선 구간에 남습니다. 내부 빈은 하한 초과·상한 이하 값만 포함합니다.

빈 개수 지정
고정 구간이 아닌 고정 상세 수준을 원한다면 동일 데이터에 대해 5개의 빈을 요청합니다. 이 예제는 언더플로우·오버플로우 빈을 비활성화합니다. 차트는 데이터 범위에서 너비를 계산하므로 보고서마다 경계가 달라질 수 있습니다.
using Aspose.Slides;
using Aspose.Slides.Charts;
using Aspose.Slides.Export;
using var presentation = new Presentation();
var slide = presentation.Slides[0];
var chart = slide.Shapes.AddChart(ChartType.Histogram, 20, 20, 680, 200);
chart.HasLegend = false;
chart.HasTitle = false;
chart.ChartData.Categories.Clear();
chart.ChartData.Series.Clear();
var workbook = chart.ChartData.ChartDataWorkbook;
workbook.Clear(0);
var series = chart.ChartData.Series.Add(ChartType.Histogram);
double[] values = { 5, 10, 10, 11, 15, 20, 20, 21, 25, 30, 30, 31, 35, 40, 40, 41, 50 };
for (var i = 0; i < values.Length; i++)
{
var valueCell = workbook.GetCell(0, i, 0, values[i]);
series.DataPoints.AddDataPointForHistogramSeries(valueCell);
}
var axis = chart.Axes.HorizontalAxis;
axis.AggregationType = AxisAggregationType.ByNumberOfBins;
axis.NumberOfBins = 5;
presentation.Save("Histogram-bin-count.pptx", SaveFormat.Pptx);
다섯 개의 빈은 각각 4, 4, 4, 4, 1 개의 카운트를 가집니다. 위의 고정 너비 결과와 분포를 비교해 보십시오: 입력값은 동일하지만 경계가 다릅니다.

레이더 차트 만들기
레이더 차트는 다변량 데이터를 2차원 형식으로 표시해 여러 변수를 동시에 비교할 수 있게 해 줍니다. 여러 성능 지표나 속성의 패턴·강점·약점을 파악하는 데 특히 유용합니다.
다음 예제는 AddChart을 사용해 기본 시리즈·카테고리를 가진 레이더 차트를 만들고 PPTX 로 저장합니다.
using Aspose.Slides;
using Aspose.Slides.Charts;
using Aspose.Slides.Export;
using var presentation = new Presentation();
var slide = presentation.Slides[0];
slide.Shapes.AddChart(ChartType.Radar, 20, 20, 500, 300);
presentation.Save("Radar-chart.pptx", SaveFormat.Pptx);
결과:

다중 카테고리 차트 만들기
다중 카테고리 차트는 두 개 이상의 카테고리 그룹을 포함하는 데이터를 표시해 여러 차원에서 값을 비교할 수 있게 합니다. 복합적이고 다층적인 데이터셋에서 추세와 관계를 분석할 때 특히 도움이 됩니다.
다음 예제는 4쌍으로 배열된 8개의 카테고리를 가진 군집 세로 막대 차트를 생성합니다. SetGroupingItem 메서드가 각 쌍에 1단계 라벨을 부여해 개별 라벨과 그룹 라벨이 모두 표시되는 카테고리 축을 만듭니다.
using Aspose.Slides;
using Aspose.Slides.Charts;
using Aspose.Slides.Export;
using var presentation = new Presentation();
var slide = presentation.Slides[0];
var chart = slide.Shapes.AddChart(ChartType.ClusteredColumn, 20, 20, 500, 300);
chart.ChartData.Series.Clear();
chart.ChartData.Categories.Clear();
var workbook = chart.ChartData.ChartDataWorkbook;
workbook.Clear(0);
var worksheetIndex = 0;
var categoryCell = workbook.GetCell(0, "c2", "A");
var category = chart.ChartData.Categories.Add(categoryCell);
category.GroupingLevels.SetGroupingItem(1, "Group1");
categoryCell = workbook.GetCell(0, "c3", "B");
category = chart.ChartData.Categories.Add(categoryCell);
categoryCell = workbook.GetCell(0, "c4", "C");
category = chart.ChartData.Categories.Add(categoryCell);
category.GroupingLevels.SetGroupingItem(1, "Group2");
categoryCell = workbook.GetCell(0, "c5", "D");
category = chart.ChartData.Categories.Add(categoryCell);
categoryCell = workbook.GetCell(0, "c6", "E");
category = chart.ChartData.Categories.Add(categoryCell);
category.GroupingLevels.SetGroupingItem(1, "Group3");
categoryCell = workbook.GetCell(0, "c7", "F");
category = chart.ChartData.Categories.Add(categoryCell);
categoryCell = workbook.GetCell(0, "c8", "G");
category = chart.ChartData.Categories.Add(categoryCell);
category.GroupingLevels.SetGroupingItem(1, "Group4");
categoryCell = workbook.GetCell(0, "c9", "H");
category = chart.ChartData.Categories.Add(categoryCell);
var seriesNameCell = workbook.GetCell(0, "D1", "Series 1");
var series = chart.ChartData.Series.Add(seriesNameCell, ChartType.ClusteredColumn);
var valueCell = workbook.GetCell(worksheetIndex, "D2", 10);
series.DataPoints.AddDataPointForBarSeries(valueCell);
valueCell = workbook.GetCell(worksheetIndex, "D3", 20);
series.DataPoints.AddDataPointForBarSeries(valueCell);
valueCell = workbook.GetCell(worksheetIndex, "D4", 30);
series.DataPoints.AddDataPointForBarSeries(valueCell);
valueCell = workbook.GetCell(worksheetIndex, "D5", 40);
series.DataPoints.AddDataPointForBarSeries(valueCell);
valueCell = workbook.GetCell(worksheetIndex, "D6", 50);
series.DataPoints.AddDataPointForBarSeries(valueCell);
valueCell = workbook.GetCell(worksheetIndex, "D7", 60);
series.DataPoints.AddDataPointForBarSeries(valueCell);
valueCell = workbook.GetCell(worksheetIndex, "D8", 70);
series.DataPoints.AddDataPointForBarSeries(valueCell);
valueCell = workbook.GetCell(worksheetIndex, "D9", 80);
series.DataPoints.AddDataPointForBarSeries(valueCell);
presentation.Save("AsposeChart.pptx", SaveFormat.Pptx);
결과:

지도 차트 만들기
지도 차트는 국가·주·도시와 같은 특정 위치에 정보를 매핑해 지리 데이터를 시각화합니다. 지역별 추세·인구 통계·공간 분포 등을 명확하고 시각적으로 매력적인 형태로 분석할 때 특히 유용합니다.
다음 예제는 AddChart을 사용해 기본 지리 데이터를 가진 지도 차트를 만들고 PowerPoint에서 볼 수 있도록 저장합니다.
using Aspose.Slides;
using Aspose.Slides.Charts;
using Aspose.Slides.Export;
using var presentation = new Presentation();
var slide = presentation.Slides[0];
var chart = slide.Shapes.AddChart(ChartType.Map, 20, 20, 500, 300);
presentation.Save("mapChart.pptx", SaveFormat.Pptx);
결과:

Note
위 그림은 PowerPoint에서 연 파일을 연 모습을 보여줍니다. Aspose.Slides는 지도 차트와 데이터를 올바르게 기록하지만, 자체적으로 지도 차트를 그리지는 않습니다. 슬라이드가 이미지·PDF·SVG 로 변환될 때 차트 영역은 비어 있게 됩니다. 같은 슬라이드에 있는 다른 도형은 영향을 받지 않습니다.복합 차트 만들기
복합 차트(또는 콤보 차트)는 하나의 그래프에 두 개 이상의 차트 유형을 결합합니다. 이 차트를 통해 두 개 이상의 데이터 세트를 강조·비교·분석해 관계를 파악할 수 있습니다.

다음 예제는 4개의 카테고리에 걸쳐 두 개의 군집 세로 막대 시리즈와 하나의 꺾은선 시리즈를 결합합니다. 열은 기본 수직 축을 사용하고, PlotOnSecondAxis 로 꺾은선을 오른쪽 보조 수직 축에 배치합니다. 도우미 함수가 제목·범례·축 라벨·격자를 구성합니다.
using System.Drawing;
using Aspose.Slides;
using Aspose.Slides.Charts;
using Aspose.Slides.Export;
CreateComboChart();
static void CreateComboChart()
{
using var presentation = new Presentation();
var chart = CreateChartWithFirstSeries(presentation.Slides[0]);
AddSecondSeriesToChart(chart);
AddThirdSeriesToChart(chart);
SetPrimaryAxesFormat(chart);
SetSecondaryAxesFormat(chart);
presentation.Save("combo-chart.pptx", SaveFormat.Pptx);
}
static IChart CreateChartWithFirstSeries(ISlide slide)
{
var chart = slide.Shapes.AddChart(ChartType.ClusteredColumn, 50, 50, 600, 400);
chart.HasTitle = true;
chart.ChartTitle.AddTextFrameForOverriding("Chart Title");
chart.ChartTitle.Overlay = false;
var portionFormat = chart.ChartTitle.TextFrameForOverriding.Paragraphs[0].ParagraphFormat.DefaultPortionFormat;
portionFormat.FontBold = NullableBool.False;
portionFormat.FontHeight = 18f;
chart.Legend.Position = LegendPositionType.Bottom;
chart.Legend.TextFormat.PortionFormat.FontHeight = 12f;
chart.ChartData.Series.Clear();
chart.ChartData.Categories.Clear();
var workbook = chart.ChartData.ChartDataWorkbook;
var worksheetIndex = 0;
var categoryCell = workbook.GetCell(worksheetIndex, 1, 0, "Category 1");
chart.ChartData.Categories.Add(categoryCell);
categoryCell = workbook.GetCell(worksheetIndex, 2, 0, "Category 2");
chart.ChartData.Categories.Add(categoryCell);
categoryCell = workbook.GetCell(worksheetIndex, 3, 0, "Category 3");
chart.ChartData.Categories.Add(categoryCell);
categoryCell = workbook.GetCell(worksheetIndex, 4, 0, "Category 4");
chart.ChartData.Categories.Add(categoryCell);
var seriesNameCell = workbook.GetCell(worksheetIndex, 0, 1, "Series 1");
var series = chart.ChartData.Series.Add(seriesNameCell, chart.Type);
series.ParentSeriesGroup.Overlap = -25;
series.ParentSeriesGroup.GapWidth = 220;
var valueCell = workbook.GetCell(worksheetIndex, 1, 1, 4.3);
series.DataPoints.AddDataPointForBarSeries(valueCell);
valueCell = workbook.GetCell(worksheetIndex, 2, 1, 2.5);
series.DataPoints.AddDataPointForBarSeries(valueCell);
valueCell = workbook.GetCell(worksheetIndex, 3, 1, 3.5);
series.DataPoints.AddDataPointForBarSeries(valueCell);
valueCell = workbook.GetCell(worksheetIndex, 4, 1, 4.5);
series.DataPoints.AddDataPointForBarSeries(valueCell);
return chart;
}
static void AddSecondSeriesToChart(IChart chart)
{
var workbook = chart.ChartData.ChartDataWorkbook;
const int worksheetIndex = 0;
var seriesNameCell = workbook.GetCell(worksheetIndex, 0, 2, "Series 2");
var series = chart.ChartData.Series.Add(seriesNameCell, ChartType.ClusteredColumn);
series.ParentSeriesGroup.Overlap = -25;
series.ParentSeriesGroup.GapWidth = 220;
var valueCell = workbook.GetCell(worksheetIndex, 1, 2, 2.4);
series.DataPoints.AddDataPointForBarSeries(valueCell);
valueCell = workbook.GetCell(worksheetIndex, 2, 2, 4.4);
series.DataPoints.AddDataPointForBarSeries(valueCell);
valueCell = workbook.GetCell(worksheetIndex, 3, 2, 1.8);
series.DataPoints.AddDataPointForBarSeries(valueCell);
valueCell = workbook.GetCell(worksheetIndex, 4, 2, 2.8);
series.DataPoints.AddDataPointForBarSeries(valueCell);
}
static void AddThirdSeriesToChart(IChart chart)
{
var workbook = chart.ChartData.ChartDataWorkbook;
const int worksheetIndex = 0;
var seriesNameCell = workbook.GetCell(worksheetIndex, 0, 3, "Series 3");
var series = chart.ChartData.Series.Add(seriesNameCell, ChartType.Line);
var valueCell = workbook.GetCell(worksheetIndex, 1, 3, 2.0);
series.DataPoints.AddDataPointForLineSeries(valueCell);
valueCell = workbook.GetCell(worksheetIndex, 2, 3, 2.0);
series.DataPoints.AddDataPointForLineSeries(valueCell);
valueCell = workbook.GetCell(worksheetIndex, 3, 3, 3.0);
series.DataPoints.AddDataPointForLineSeries(valueCell);
valueCell = workbook.GetCell(worksheetIndex, 4, 3, 5.0);
series.DataPoints.AddDataPointForLineSeries(valueCell);
series.PlotOnSecondAxis = true;
}
static void SetPrimaryAxesFormat(IChart chart)
{
var horizontalAxis = chart.Axes.HorizontalAxis;
horizontalAxis.TextFormat.PortionFormat.FontHeight = 12f;
horizontalAxis.Format.Line.FillFormat.FillType = FillType.NoFill;
SetAxisTitle(horizontalAxis, "X Axis");
var verticalAxis = chart.Axes.VerticalAxis;
verticalAxis.TextFormat.PortionFormat.FontHeight = 12f;
verticalAxis.Format.Line.FillFormat.FillType = FillType.NoFill;
SetAxisTitle(verticalAxis, "Y Axis 1");
var majorGridLinesFormat = verticalAxis.MajorGridLinesFormat.Line.FillFormat;
majorGridLinesFormat.FillType = FillType.Solid;
majorGridLinesFormat.SolidFillColor.Color = Color.FromArgb(217, 217, 217);
}
static void SetSecondaryAxesFormat(IChart chart)
{
var secondaryHorizontalAxis = chart.Axes.SecondaryHorizontalAxis;
secondaryHorizontalAxis.Position = AxisPositionType.Bottom;
secondaryHorizontalAxis.CrossType = CrossesType.Maximum;
secondaryHorizontalAxis.IsVisible = false;
secondaryHorizontalAxis.MajorGridLinesFormat.Line.FillFormat.FillType = FillType.NoFill;
secondaryHorizontalAxis.MinorGridLinesFormat.Line.FillFormat.FillType = FillType.NoFill;
var secondaryVerticalAxis = chart.Axes.SecondaryVerticalAxis;
secondaryVerticalAxis.Position = AxisPositionType.Right;
secondaryVerticalAxis.TextFormat.PortionFormat.FontHeight = 12f;
secondaryVerticalAxis.Format.Line.FillFormat.FillType = FillType.NoFill;
secondaryVerticalAxis.MajorGridLinesFormat.Line.FillFormat.FillType = FillType.NoFill;
secondaryVerticalAxis.MinorGridLinesFormat.Line.FillFormat.FillType = FillType.NoFill;
SetAxisTitle(secondaryVerticalAxis, "Y Axis 2");
}
static void SetAxisTitle(IAxis axis, string axisTitle)
{
axis.HasTitle = true;
axis.Title.Overlay = false;
var titlePortionFormat = axis.Title.AddTextFrameForOverriding(axisTitle).Paragraphs[0].ParagraphFormat.DefaultPortionFormat;
titlePortionFormat.FontBold = NullableBool.False;
titlePortionFormat.FontHeight = 12f;
}
차트 업데이트
Aspose.Slides for .NET은 차트 데이터를 수정하고, 서식과 스타일을 변경하여 PowerPoint 차트를 업데이트할 수 있게 합니다. 이 기능을 통해 프레젠테이션을 동적 콘텐츠와 동기화하고, 차트가 최신 데이터와 시각적 표준을 정확히 반영하도록 간소화할 수 있습니다.
다음 예제는 기존 프레젠테이션 첫 슬라이드에 있는 “My chart” 라는 차트를 업데이트합니다. 각 시리즈에 3개의 데이터 포인트가 있는 두 개의 컬럼 시리즈가 필요하며, 카테고리 라벨은 A 열에, 시리즈 이름은 첫 번째 워크시트 첫 행에 있어야 합니다. 예제는 GetCell 으로 워크북 셀을 변경하고, 시리즈 값을 업데이트하며, 세 번째 시리즈를 추가하고, 차트를 Type 로 군집 원통형으로 바꿉니다.
using Aspose.Slides;
using Aspose.Slides.Charts;
using Aspose.Slides.Export;
const string chartName = "My chart";
using var presentation = new Presentation("ExistingChart.pptx");
var slide = presentation.Slides[0];
foreach (IShape shape in slide.Shapes)
{
if (shape is IChart chart && chart.Name == chartName)
{
var worksheetIndex = 0;
var workbook = chart.ChartData.ChartDataWorkbook;
workbook.GetCell(worksheetIndex, 1, 0, "Modified Category 1");
workbook.GetCell(worksheetIndex, 2, 0, "Modified Category 2");
var series = chart.ChartData.Series[0];
workbook.GetCell(worksheetIndex, 0, 1, "New_Series 1");
series.DataPoints[0].Value.Data = 90;
series.DataPoints[1].Value.Data = 123;
series.DataPoints[2].Value.Data = 44;
series = chart.ChartData.Series[1];
workbook.GetCell(worksheetIndex, 0, 2, "New_Series 2");
series.DataPoints[0].Value.Data = 23;
series.DataPoints[1].Value.Data = 67;
series.DataPoints[2].Value.Data = 99;
var seriesNameCell = workbook.GetCell(worksheetIndex, 0, 3, "Series 3");
series = chart.ChartData.Series.Add(seriesNameCell, chart.Type);
var valueCell = workbook.GetCell(worksheetIndex, 1, 3, 20);
series.DataPoints.AddDataPointForBarSeries(valueCell);
valueCell = workbook.GetCell(worksheetIndex, 2, 3, 50);
series.DataPoints.AddDataPointForBarSeries(valueCell);
valueCell = workbook.GetCell(worksheetIndex, 3, 3, 30);
series.DataPoints.AddDataPointForBarSeries(valueCell);
chart.Type = ChartType.ClusteredCylinder;
}
}
presentation.Save("AsposeChartModified.pptx", SaveFormat.Pptx);
차트 데이터 범위 설정
기존 차트가 사용하고 있는 범위를 확인하려면 Retrieve a Chart’s Data Range 를 참고하십시오.
Aspose.Slides for .NET은 워크시트의 특정 데이터 범위를 차트 데이터 소스로 정의할 수 있는 유연성을 제공합니다. 이를 통해 차트에 어떤 셀을 시리즈·카테고리로 사용할지 직접 지정할 수 있어, 워크시트의 최신 데이터 변경 사항을 차트에 쉽게 반영하고 동기화할 수 있습니다.
다음 예제는 SetRange 을 사용해 기존 프레젠테이션 첫 슬라이드의 “My chart” 차트 데이터 소스를 Sheet1!A1:B4 로 설정합니다. 차트 워크북에 해당 워크시트가 존재하고, 첫 행에 시리즈 헤더, A 열에 카테고리 라벨, B 열에 세 개의 값이 채워진 범위가 있어야 합니다.
using Aspose.Slides;
using Aspose.Slides.Charts;
using Aspose.Slides.Export;
const string chartName = "My chart";
using var presentation = new Presentation("ExistingChart.pptx");
var slide = presentation.Slides[0];
foreach (IShape shape in slide.Shapes)
{
if (shape is IChart chart && chart.Name == chartName)
{
chart.ChartData.SetRange("Sheet1!A1:B4");
}
}
presentation.Save("SetDataRange.pptx", SaveFormat.Pptx);
차트의 기본 마커 사용
차트에 기본 마커를 사용하면 각 차트 시리즈에 서로 다른 기본 마커 기호가 자동으로 할당됩니다.
다음 예제는 AddChart 을 사용해 두 개의 꺾은선 시리즈와 범례가 있는 차트를 만들고, Marker 설정으로 자동 할당된 마커 기호를 유지합니다. 첫 번째 시리즈에는 음수 값과 null 로 표시된 누락 값이 포함되고, 두 번째 시리즈는 모든 카테고리에 값을 가집니다.
using Aspose.Slides;
using Aspose.Slides.Charts;
using Aspose.Slides.Export;
using var presentation = new Presentation();
var slide = presentation.Slides[0];
var chart = slide.Shapes.AddChart(ChartType.LineWithMarkers, 10, 10, 400, 400);
chart.ChartData.Series.Clear();
chart.ChartData.Categories.Clear();
var workbook = chart.ChartData.ChartDataWorkbook;
var seriesNameCell = workbook.GetCell(0, 0, 1, "Series 1");
var series = chart.ChartData.Series.Add(seriesNameCell, chart.Type);
var categoryCell = workbook.GetCell(0, 1, 0, "C1");
chart.ChartData.Categories.Add(categoryCell);
var valueCell = workbook.GetCell(0, 1, 1, 24);
series.DataPoints.AddDataPointForLineSeries(valueCell);
categoryCell = workbook.GetCell(0, 2, 0, "C2");
chart.ChartData.Categories.Add(categoryCell);
valueCell = workbook.GetCell(0, 2, 1, 23);
series.DataPoints.AddDataPointForLineSeries(valueCell);
categoryCell = workbook.GetCell(0, 3, 0, "C3");
chart.ChartData.Categories.Add(categoryCell);
valueCell = workbook.GetCell(0, 3, 1, -10);
series.DataPoints.AddDataPointForLineSeries(valueCell);
categoryCell = workbook.GetCell(0, 4, 0, "C4");
chart.ChartData.Categories.Add(categoryCell);
valueCell = workbook.GetCell(0, 4, 1, null);
series.DataPoints.AddDataPointForLineSeries(valueCell);
seriesNameCell = workbook.GetCell(0, 0, 2, "Series 2");
var secondSeries = chart.ChartData.Series.Add(seriesNameCell, chart.Type);
valueCell = workbook.GetCell(0, 1, 2, 30);
secondSeries.DataPoints.AddDataPointForLineSeries(valueCell);
valueCell = workbook.GetCell(0, 2, 2, 10);
secondSeries.DataPoints.AddDataPointForLineSeries(valueCell);
valueCell = workbook.GetCell(0, 3, 2, 60);
secondSeries.DataPoints.AddDataPointForLineSeries(valueCell);
valueCell = workbook.GetCell(0, 4, 2, 40);
secondSeries.DataPoints.AddDataPointForLineSeries(valueCell);
chart.HasLegend = true;
chart.Legend.Overlay = false;
presentation.Save("DefaultMarkersInChart.pptx", SaveFormat.Pptx);
FAQ
Aspose.Slides for .NET이 지원하는 차트 유형은 무엇입니까?
Aspose.Slides for .NET은 막대, 꺾은선, 원형, 영역, 산점도, 히스토그램, 레이더 등 다양한 차트 유형을 지원합니다. 이를 통해 데이터 시각화 요구에 가장 적합한 차트 유형을 선택할 수 있습니다.
슬라이드에 새 차트를 추가하려면 어떻게 해야 하나요?
차트를 추가하려면 먼저 Presentation 클래스 인스턴스를 만든 뒤, 인덱스로 원하는 슬라이드를 가져오고, 차트 유형과 초기 데이터를 지정해 차트를 추가하는 메서드를 호출합니다. 이렇게 하면 차트가 프레젠테이션에 직접 삽입됩니다.
차트에 표시되는 데이터를 어떻게 업데이트할 수 있나요?
IChartDataWorkbook 에 접근해 기본 시리즈·카테고리를 지우고 사용자 정의 데이터를 추가하면 차트 데이터를 업데이트할 수 있습니다. 이를 통해 최신 데이터를 반영하도록 차트를 프로그래밍 방식으로 새로 고칠 수 있습니다.
차트의 외관을 사용자 지정할 수 있나요?
예, Aspose.Slides for .NET은 풍부한 사용자 지정 옵션을 제공합니다. 색상·폰트·라벨·범례·그 외 서식 요소를 변경해 차트의 외관을 특정 디자인 요구에 맞게 조정할 수 있습니다.