Quản lý chuỗi dữ liệu biểu đồ trong bài thuyết trình bằng .NET
Tổng quan
Một biểu đồ lưu trữ dữ liệu đã vẽ trong một workbook dữ liệu biểu đồ. Một IChartSeries đại diện cho một tập các giá trị liên quan, và mỗi IChartDataPoint trong chuỗi tham chiếu tới một hoặc nhiều ô workbook. Các đối tượng IChartCategory cung cấp các nhãn hoặc giá trị nhóm được các chuỗi chia sẻ. Vì vậy tên chuỗi, danh mục và giá trị điểm đều được kết nối tới các đối tượng IChartDataCell thay vì chỉ được lưu dưới dạng văn bản hiển thị.
Đối với một biểu đồ danh mục điển hình, workbook mặc định sử dụng hàng 0 cho tên chuỗi, cột 0 cho tên danh mục và các ô còn lại cho giá trị chuỗi. Chỉ số worksheet, hàng và cột được truyền vào IChartDataWorkbook.GetCell là dựa trên zero. Bố cục này hữu ích khi bạn tạo biểu đồ với dữ liệu mặc định, nhưng không nên giả định rằng mọi biểu đồ hiện có đều sử dụng nó. Đối với một bài thuyết trình đã tải, hãy kiểm tra các ô được chuỗi, danh mục và điểm dữ liệu tham chiếu trước khi thay đổi giá trị workbook.
Cài đặt biểu đồ có ba phạm vi khác nhau:
- Cài đặt cấp chuỗi, chẳng hạn như IChartSeries.Format, cung cấp dạng hiển thị mặc định cho tất cả các điểm trong một chuỗi.
- Cài đặt cấp điểm dữ liệu, chẳng hạn như IChartDataPoint.Format, ghi đè dạng hiển thị của chuỗi cho một điểm.
- Cài đặt nhóm áp dụng cho các chuỗi tương thích thuộc cùng một IChartSeriesGroup. Truy cập nhóm qua IChartSeries.ParentSeriesGroup khi bạn cần đặt các tùy chọn như độ chồng chéo hoặc độ rộng khoảng trống.
Khi không có màu nền điểm hoặc chuỗi nào được đặt một cách rõ ràng, kiểu biểu đồ và chủ đề sẽ quyết định dạng hiển thị tự động. Khi cả định dạng chuỗi và điểm đều có, định dạng điểm sẽ được ưu tiên cho điểm đó.

Đặt Độ Trùng Lặp Chuỗi Biểu Đồ
IChartSeries.Overlap báo cáo mức độ các thanh hoặc cột chồng lên nhau trong biểu đồ 2D, từ -100 tới 100 phần trăm. Đây là một phép chiếu chỉ đọc của cài đặt trên nhóm chuỗi cha. Đặt IChartSeriesGroup.Overlap để cập nhật mọi chuỗi tương thích trong nhóm đó. Tùy chọn này áp dụng cho các loại biểu đồ hiển thị các thanh hoặc cột được nhóm lại; nó không ảnh hưởng đến các nhóm chuỗi không liên quan trong biểu đồ kết hợp.
Ví dụ sau đặt độ trùng lặp cho nhóm chứa chuỗi đầu tiên:
using Aspose.Slides;
using Aspose.Slides.Charts;
using Aspose.Slides.Export;
const int firstSlideIndex = 0;
const int firstSeriesIndex = 0;
const sbyte overlapPercent = 30;
using var presentation = new Presentation();
var slide = presentation.Slides[firstSlideIndex];
// Biểu đồ mới chứa các chuỗi mẫu, danh mục và giá trị.
var chart = slide.Shapes.AddChart(ChartType.ClusteredColumn, 20, 20, 500, 200);
var series = chart.ChartData.Series[firstSeriesIndex];
series.ParentSeriesGroup.Overlap = overlapPercent;
presentation.Save("series_overlap.pptx", SaveFormat.Pptx);
Kết quả:

Thay Đổi Màu Đổ Chuỗi
Sử dụng IChartSeries.Format để đặt màu nền mặc định cho toàn bộ chuỗi. Nếu một điểm đã có màu nền rõ ràng, cài đặt IChartDataPoint.Format của nó sẽ ghi đè màu nền chuỗi cho điểm đó.
Ví dụ sau áp dụng màu xanh đậm đặc cho chuỗi đầu tiên:
using System.Drawing;
using Aspose.Slides;
using Aspose.Slides.Charts;
using Aspose.Slides.Export;
const int firstSlideIndex = 0;
const int firstSeriesIndex = 0;
using var presentation = new Presentation();
var slide = presentation.Slides[firstSlideIndex];
var chart = slide.Shapes.AddChart(ChartType.ClusteredColumn, 20, 20, 500, 200);
var series = chart.ChartData.Series[firstSeriesIndex];
series.Format.Fill.FillType = FillType.Solid;
series.Format.Fill.SolidFillColor.Color = Color.Blue;
presentation.Save("series_color.pptx", SaveFormat.Pptx);
Kết quả:

Thay Đổi Tên Chuỗi
Tên chuỗi được lưu trong workbook dữ liệu biểu đồ và thường hiển thị trong chú giải. Trong workbook mặc định được tạo cho biểu đồ cột cụm, ô B1 nằm ở hàng 0, cột 1 và chứa tên của chuỗi đầu tiên. Các hằng số được đặt tên trong ví dụ dưới đây làm cho cấu trúc này rõ ràng:
using Aspose.Slides;
using Aspose.Slides.Charts;
using Aspose.Slides.Export;
const int firstSlideIndex = 0;
const int worksheetIndex = 0;
const int seriesNameRowIndex = 0;
const int firstSeriesColumnIndex = 1;
using var presentation = new Presentation();
var slide = presentation.Slides[firstSlideIndex];
var chart = slide.Shapes.AddChart(ChartType.ClusteredColumn, 20, 20, 500, 200);
var workbook = chart.ChartData.ChartDataWorkbook;
var seriesNameCell = workbook.GetCell(worksheetIndex, seriesNameRowIndex, firstSeriesColumnIndex);
seriesNameCell.Value = "Revenue";
presentation.Save("series_name.pptx", SaveFormat.Pptx);
Bạn cũng có thể cập nhật ô đã được IChartSeries.Name tham chiếu. Cách này tránh việc giả định một hàng và cột cụ thể trong một biểu đồ hiện có:
using Aspose.Slides;
using Aspose.Slides.Charts;
using Aspose.Slides.Export;
const int firstSlideIndex = 0;
const int firstSeriesIndex = 0;
const int firstNameCellIndex = 0;
using var presentation = new Presentation();
var slide = presentation.Slides[firstSlideIndex];
var chart = slide.Shapes.AddChart(ChartType.ClusteredColumn, 20, 20, 500, 200);
var series = chart.ChartData.Series[firstSeriesIndex];
var seriesNameCell = series.Name.AsCells[firstNameCellIndex];
seriesNameCell.Value = "Revenue";
presentation.Save("series_name.pptx", SaveFormat.Pptx);
Kết quả:

Lấy Màu Nền Tự Động của Chuỗi
IChartSeries.GetAutomaticSeriesColor trả về màu được tính dựa trên chỉ số chuỗi và kiểu biểu đồ. Đây là màu được sử dụng khi màu nền chuỗi chưa được định nghĩa một cách rõ ràng. Gọi phương thức này chỉ đọc màu đã tính; nó không gán màu nền mới.
Ví dụ sau in màu tự động của mỗi chuỗi mặc định:
using System;
using Aspose.Slides;
using Aspose.Slides.Charts;
const int firstSlideIndex = 0;
using var presentation = new Presentation();
var slide = presentation.Slides[firstSlideIndex];
var chart = slide.Shapes.AddChart(ChartType.ClusteredColumn, 20, 20, 500, 200);
var seriesCount = chart.ChartData.Series.Count;
for (var seriesIndex = 0; seriesIndex < seriesCount; seriesIndex++)
{
var series = chart.ChartData.Series[seriesIndex];
var automaticColor = series.GetAutomaticSeriesColor();
Console.WriteLine($"Series {seriesIndex}: {automaticColor.Name}");
}
Đầu ra mẫu cho kiểu biểu đồ mặc định:
Series 0: ff4f81bd
Series 1: ffc0504d
Series 2: ff9bbb59
Màu sắc chính xác phụ thuộc vào kiểu biểu đồ và chủ đề.
Đặt Màu Đảo Ngược cho Chuỗi Biểu Đồ
Đối với các chuỗi thanh, cột và bong bóng, IChartSeries.InvertIfNegative có thể hiển thị các giá trị âm bằng một màu nền khác. Đặt màu nền chuỗi thường thành màu đặc, bật tính năng đảo ngược, và gán màu giá trị âm qua IChartSeries.InvertedSolidFillColor. Các số âm không thay đổi trong workbook; chỉ màu hiển thị của chúng thay đổi.
Ví dụ sau thay thế dữ liệu biểu đồ mặc định bằng một chuỗi. Hàng 0 của worksheet chứa tên chuỗi, cột 0 chứa tên danh mục, và cột 1 chứa các giá trị:
using System.Drawing;
using Aspose.Slides;
using Aspose.Slides.Charts;
using Aspose.Slides.Export;
const int firstSlideIndex = 0;
const int worksheetIndex = 0;
const int headerRowIndex = 0;
const int categoryColumnIndex = 0;
const int firstSeriesColumnIndex = 1;
const int firstDataRowIndex = 1;
var categoryNames = new[] { "Category 1", "Category 2", "Category 3" };
var seriesValues = new[] { -20, 50, -30 };
using var presentation = new Presentation();
var slide = presentation.Slides[firstSlideIndex];
var chart = slide.Shapes.AddChart(ChartType.ClusteredColumn, 20, 20, 500, 200);
var chartData = chart.ChartData;
var workbook = chartData.ChartDataWorkbook;
chartData.Series.Clear();
chartData.Categories.Clear();
var seriesNameCell = workbook.GetCell(worksheetIndex, headerRowIndex, firstSeriesColumnIndex, "Series 1");
var series = chartData.Series.Add(seriesNameCell, chart.Type);
for (var categoryIndex = 0; categoryIndex < categoryNames.Length; categoryIndex++)
{
var dataRowIndex = firstDataRowIndex + categoryIndex;
var categoryName = categoryNames[categoryIndex];
var seriesValue = seriesValues[categoryIndex];
var categoryCell = workbook.GetCell(worksheetIndex, dataRowIndex, categoryColumnIndex, categoryName);
chartData.Categories.Add(categoryCell);
var valueCell = workbook.GetCell(worksheetIndex, dataRowIndex, firstSeriesColumnIndex, seriesValue);
series.DataPoints.AddDataPointForBarSeries(valueCell);
}
var automaticSeriesColor = series.GetAutomaticSeriesColor();
series.Format.Fill.FillType = FillType.Solid;
series.Format.Fill.SolidFillColor.Color = automaticSeriesColor;
series.InvertIfNegative = true;
series.InvertedSolidFillColor.Color = Color.Red;
presentation.Save("inverted_solid_fill_color.pptx", SaveFormat.Pptx);
Kết quả:

Bạn có thể bật đảo ngược cho một điểm duy nhất qua IChartDataPoint.InvertIfNegative. Trong ví dụ dưới đây, đảo ngược bị tắt cho chuỗi và chỉ được bật cho điểm đã chọn. Điểm này cũng được gán giá trị âm để hiệu ứng hiển thị:
using System.Drawing;
using Aspose.Slides;
using Aspose.Slides.Charts;
using Aspose.Slides.Export;
const int firstSlideIndex = 0;
const int firstSeriesIndex = 0;
const int targetDataPointIndex = 2;
const int negativeValue = -30;
using var presentation = new Presentation();
var slide = presentation.Slides[firstSlideIndex];
var chart = slide.Shapes.AddChart(ChartType.ClusteredColumn, 20, 20, 500, 200);
var series = chart.ChartData.Series[firstSeriesIndex];
var automaticSeriesColor = series.GetAutomaticSeriesColor();
series.Format.Fill.FillType = FillType.Solid;
series.Format.Fill.SolidFillColor.Color = automaticSeriesColor;
series.InvertedSolidFillColor.Color = Color.Red;
series.InvertIfNegative = false;
var dataPoint = series.DataPoints[targetDataPointIndex];
dataPoint.YValue.AsCell.Value = negativeValue;
dataPoint.InvertIfNegative = true;
presentation.Save("data_point_invert_color_if_negative.pptx", SaveFormat.Pptx);
Xóa Giá Trị Điểm Dữ Liệu Cụ Thể
Để làm cho một điểm trống mà không xóa các điểm khác, đặt ô workbook hỗ trợ của nó thành null. Đối với biểu đồ cột, giá trị được vẽ có thể truy cập qua IChartDataPoint.YValue. Điểm dữ liệu vẫn ở cùng vị trí danh mục, nhưng biểu đồ sẽ xem giá trị của nó là trống theo cài đặt giá trị trống của biểu đồ.
Ví dụ sau chỉ xóa điểm thứ hai trong chuỗi đầu tiên:
using Aspose.Slides;
using Aspose.Slides.Charts;
using Aspose.Slides.Export;
const int firstSlideIndex = 0;
const int firstSeriesIndex = 0;
const int targetDataPointIndex = 1;
using var presentation = new Presentation();
var slide = presentation.Slides[firstSlideIndex];
var chart = slide.Shapes.AddChart(ChartType.ClusteredColumn, 20, 20, 500, 200);
var series = chart.ChartData.Series[firstSeriesIndex];
var dataPoint = series.DataPoints[targetDataPointIndex];
dataPoint.YValue.AsCell.Value = null;
presentation.Save("clear_data_point_value.pptx", SaveFormat.Pptx);
Biểu đồ phân tán sử dụng các ô X và Y riêng biệt, và biểu đồ bong bóng cũng sử dụng ô kích thước. Chỉ xóa ô đại diện cho giá trị bạn muốn loại bỏ. Không gọi IChartDataPointCollection.Clear khi bạn muốn giữ lại các điểm khác, vì phương thức này sẽ xóa mọi điểm dữ liệu trong bộ sưu tập.
Kiểm Soát Hiển Thị Các Ô Trống
Một ô workbook trống đại diện cho dữ liệu thiếu; một ô chứa 0 đại diện cho một giá trị số đã biết. Đặt IChartDataCell.Value thành null để làm ô trống. Số không vẫn là số không bất kể cài đặt ô trống.
Sử dụng IChart.DisplayBlanksAs để chọn cách biểu đồ hiển thị các ô trống. Cài đặt này áp dụng cho toàn bộ biểu đồ. Nó thay đổi cách các khoảng trống được vẽ, mà không điền ô workbook trống bằng số 0 hoặc giá trị nội suy.
Ví dụ tự chứa dưới đây tạo một biểu đồ đường với một chuỗi, xóa giá trị cho Ngày 3, và lưu cùng một biểu đồ với mỗi chế độ. Không cần tệp đầu vào. IChartDataWorkbook sử dụng worksheet 0, cột 0 cho nhãn danh mục, và cột 1 cho giá trị; hàng 0 chứa tên chuỗi. Dữ liệu cuối cùng là 10, 20, empty, 30, 40.
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, 40, 40, 640, 400);
var chartData = chart.ChartData;
var workbook = chartData.ChartDataWorkbook;
chartData.Series.Clear();
chartData.Categories.Clear();
var seriesNameCell = workbook.GetCell(0, 0, 1, "Measurements");
var series = chartData.Series.Add(seriesNameCell, chart.Type);
var values = new[] { 10, 20, 25, 30, 40 };
for (var i = 0; i < values.Length; i++)
{
var categoryCell = workbook.GetCell(0, i + 1, 0, $"Day {i + 1}");
chartData.Categories.Add(categoryCell);
var valueCell = workbook.GetCell(0, i + 1, 1, values[i]);
series.DataPoints.AddDataPointForLineSeries(valueCell);
}
// Để Ngày 3 thực sự trống, đồng thời giữ lại danh mục và điểm dữ liệu của nó.
workbook.GetCell(0, 3, 1).Value = null;
var modes = new[] { DisplayBlanksAsType.Gap, DisplayBlanksAsType.Zero, DisplayBlanksAsType.Span };
foreach (var mode in modes)
{
chart.DisplayBlanksAs = mode;
presentation.Save($"empty_cells_{mode}.pptx", SaveFormat.Pptx);
}
Mỗi tệp đầu ra lưu chế độ đã chỉ định trước khi lưu: empty_cells_Gap.pptx, empty_cells_Zero.pptx, và empty_cells_Span.pptx. Để lưu chỉ một phiên bản, đặt chế độ mong muốn và lưu bản trình bày một lần thay vì lặp qua các chế độ.
So sánh dưới đây cho thấy cùng một dữ liệu trong ba tệp. Ngày 3 là trống trong workbook trong mọi trường hợp:

Hiệu ứng hiển thị phụ thuộc vào loại biểu đồ. Biểu đồ đường làm cho cả ba chế độ dễ so sánh. Biểu đồ thanh và cột không có đường nối qua danh mục thiếu, vì vậy Span không thể tạo đoạn nối như trên; một cột thiếu và một cột có chiều cao 0 cũng có thể trông giống nhau. Tương tự, biểu đồ phân tán chỉ có các dấu chấm không có đường nối. Đừng mong đợi ba kết quả riêng biệt cho mọi loại biểu đồ; kiểm tra đầu ra cho loại bạn đang dùng.
Đặt Độ Rộng Khoảng Trống Giữa Các Chuỗi
Độ rộng khoảng trống là khoảng cách giữa các cụm thanh hoặc cột liền kề, biểu thị bằng phần trăm của độ rộng thanh hoặc cột. Giống như độ trùng lặp, nó thuộc về nhóm chuỗi cha chứ không phải một chuỗi riêng lẻ. Đặt IChartSeriesGroup.GapWidth một lần cho nhóm. Giá trị lớn hơn tạo nhiều không gian hơn giữa các cụm; giá trị nhỏ hơn làm chúng dày đặc hơn.
Ví dụ sau thay đổi độ rộng khoảng trống và chỉ lưu bản trình bày cuối cùng:
using Aspose.Slides;
using Aspose.Slides.Charts;
using Aspose.Slides.Export;
const int firstSlideIndex = 0;
const int firstSeriesIndex = 0;
const int gapWidthPercent = 30;
using var presentation = new Presentation();
var slide = presentation.Slides[firstSlideIndex];
var chart = slide.Shapes.AddChart(ChartType.StackedColumn, 20, 20, 500, 200);
var series = chart.ChartData.Series[firstSeriesIndex];
series.ParentSeriesGroup.GapWidth = gapWidthPercent;
presentation.Save("gap_width_30.pptx", SaveFormat.Pptx);
Kết quả:

Câu Hỏi Thường Gặp
Các loại biểu đồ nào hỗ trợ chuỗi dữ liệu?
Tất cả các loại biểu đồ được biểu diễn bởi enum ChartType đều sử dụng dữ liệu biểu đồ, nhưng chuỗi của chúng không phải luôn có cùng cấu trúc giá trị hay cùng cài đặt. Ví dụ, biểu đồ danh mục sử dụng danh mục và giá trị, biểu đồ phân tán sử dụng giá trị X và Y, và biểu đồ bong bóng bổ sung kích thước bong bóng. Hãy sử dụng phương pháp tạo điểm dữ liệu phù hợp với loại chuỗi. Các tùy chọn như độ trùng lặp và độ rộng khoảng trống chỉ áp dụng cho các nhóm thanh hoặc cột tương thích.
Nhóm chuỗi biểu đồ là gì?
Một IChartSeriesGroup chứa các chuỗi tương thích chia sẻ các cài đặt vẽ mức nhóm. Một biểu đồ kết hợp có thể chứa nhiều hơn một nhóm, vì vậy việc thay đổi nhóm thông qua một chuỗi không nhất thiết sẽ thay đổi mọi chuỗi trong biểu đồ.
Biểu đồ mới tạo có chứa dữ liệu mặc định không?
Có. Mặc định, IShapeCollection.AddChart tạo các chuỗi mẫu, danh mục và giá trị. Bạn có thể sửa các ô này hoặc xóa cả các bộ sưu tập chuỗi và danh mục trước khi thêm một bộ dữ liệu tùy chỉnh hoàn toàn. Một overload cũng có thể tạo biểu đồ mà không có dữ liệu mặc định.
Các đối tượng biểu đồ được kết nối với các ô workbook như thế nào?
Tên chuỗi, nhãn danh mục và giá trị điểm dữ liệu tham chiếu các ô trong một IChartDataWorkbook. Thay đổi một ô được tham chiếu sẽ cập nhật phần tử biểu đồ tương ứng. Khi bạn xây dựng dữ liệu tùy chỉnh, hãy giữ cho các hàng danh mục và các hàng giá trị chuỗi được căn chỉnh sao cho mỗi điểm được vẽ dưới danh mục mong muốn.
Làm sao để xóa một điểm thay vì toàn bộ chuỗi?
Đặt ô giá trị tương ứng thành null để giữ vị trí danh mục của điểm như một điểm trống. Chỉ sử dụng IChartDataPointCollection.Clear khi bạn muốn xóa tất cả các điểm trong chuỗi đó. Nếu bạn cũng xóa danh mục, hãy cập nhật mọi chuỗi để các giá trị của chúng vẫn đồng bộ với bộ sưu tập danh mục.
Các điểm trống được hiển thị như thế nào?
Kết quả phụ thuộc vào loại biểu đồ và IChart.DisplayBlanksAs. Các biểu đồ được hỗ trợ có thể hiển thị khoảng trống dưới dạng lỗ hổng, giá trị 0, hoặc bằng cách nối các điểm lân cận. Chọn cài đặt phù hợp với ý nghĩa của dữ liệu thiếu trong bản trình bày của bạn. Xem mục Kiểm Soát Hiển Thị Các Ô Trống để có ví dụ đầy đủ và so sánh hình ảnh.
Các giá trị âm được định dạng như thế nào?
Đối với các chuỗi thanh, cột và bong bóng được hỗ trợ, bật IChartSeries.InvertIfNegative và đặt IChartSeries.InvertedSolidFillColor. Bạn có thể ghi đè hành vi cho một điểm riêng lẻ bằng IChartDataPoint.InvertIfNegative. Các thuộc tính này ảnh hưởng tới định dạng, không phải các giá trị số được lưu.
Định dạng nào được ưu tiên khi cả chuỗi và điểm đều được định dạng?
Định dạng điểm dữ liệu rõ ràng sẽ được ưu tiên cho điểm đó. Các điểm khác vẫn sử dụng định dạng chuỗi rõ ràng hoặc, khi không có định dạng chuỗi, sẽ sử dụng kiểu biểu đồ và chủ đề tự động. Các thuộc tính nhóm như độ trùng lặp và độ rộng khoảng trống kiểm soát bố cục và không phải là các ghi đè định dạng cấp điểm.
Có giới hạn số chuỗi mà một biểu đồ có thể chứa không?
Aspose.Slides không áp đặt một giới hạn cố định riêng cho số chuỗi. Trong thực tế, các hạn chế của tập tin bài thuyết trình, bộ nhớ khả dụng, thời gian render và khả năng đọc hiểu của biểu đồ quyết định một giới hạn thực tế.
Nên thay đổi gì khi các cột quá gần nhau hoặc quá xa nhau?
Đặt IChartSeriesGroup.GapWidth trên nhóm chuỗi cha thích hợp. Tăng giá trị để mở rộng không gian giữa các cụm, hoặc giảm giá trị để các cụm gần nhau hơn.