إنشاء رسوم بيانية ديناميكية
الرسوم البيانية الديناميكية (أو التفاعلية) لها القدرة على التغيير عند تغيير نطاق البيانات. وبعبارة أخرى، يمكن للرسوم البيانية الديناميكية أن تعكس تلقائيًا التغييرات عند تغيير مصدر البيانات. من أجل تحفيز تغيير مصدر البيانات، يمكن استخدام خيارات التصفية لجداول البيانات في Excel أو استخدام عنصر تحكم مثل مربع القائمة المنسدلة أو قائمة البحث.
يوضح هذا المقال استخدام Aspose.Cells for .NET APIs لإنشاء رسوم بيانية ديناميكية باستخدام الطريقتين المذكورتين.
استخدام جداول Excel
توفر الـListObjects الوظائف المدمجة لفرز وتصفية البيانات بمشاركة المستخدم. يتم توفير خيارات فرز وتصفية من خلال قوائم القائمة المنسدلة التي تتم إضافتها تلقائيًا إلى الصف الرأسي لـListObject. بسبب هذه الميزات (الفرز والتصفية)، يبدو أن الـListObject يبدو كخيار مثالي ليكون مصدر البيانات لرسم بياني ديناميكي لأنه عند تغيير الفرز أو التصفية، سيتم تغيير تمثيل البيانات في الرسم البياني ليعكس الحالة الحالية للـListObject.
من أجل الإبقاء على العرض التوضيحي بسيطًا وسهل الفهم، سنقوم بإنشاء الـWorkbook من البداية والمضي قدمًا خطوة بخطوة كما هو موضح أدناه.
- إنشاء Workbook فارغة.
- الوصول إلى Cells لأول Worksheet في Workbook.
- إدراج بعض البيانات في الخلايا.
- إنشاء ListObject استنادًا إلى البيانات المدرجة.
- إنشاء Chart استنادًا إلى نطاق البيانات ListObject.
- حفظ النتيجة على القرص.
// For complete examples and data files, please go to https://github.com/aspose-cells/Aspose.Cells-for-.NET | |
// The path to the documents directory. | |
string dataDir = RunExamples.GetDataDir(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType); | |
// Create an instance of Workbook | |
var book = new Workbook(); | |
// Access first worksheet from the collection | |
var sheet = book.Worksheets[0]; | |
// Access cells collection of the first worksheet | |
var cells = sheet.Cells; | |
// Insert data column wise | |
cells["A1"].PutValue("Category"); | |
cells["A2"].PutValue("Fruit"); | |
cells["A3"].PutValue("Fruit"); | |
cells["A4"].PutValue("Fruit"); | |
cells["A5"].PutValue("Fruit"); | |
cells["A6"].PutValue("Vegetables"); | |
cells["A7"].PutValue("Vegetables"); | |
cells["A8"].PutValue("Vegetables"); | |
cells["A9"].PutValue("Vegetables"); | |
cells["A10"].PutValue("Beverages"); | |
cells["A11"].PutValue("Beverages"); | |
cells["A12"].PutValue("Beverages"); | |
cells["B1"].PutValue("Food"); | |
cells["B2"].PutValue("Apple"); | |
cells["B3"].PutValue("Banana"); | |
cells["B4"].PutValue("Apricot"); | |
cells["B5"].PutValue("Grapes"); | |
cells["B6"].PutValue("Carrot"); | |
cells["B7"].PutValue("Onion"); | |
cells["B8"].PutValue("Cabage"); | |
cells["B9"].PutValue("Potatoe"); | |
cells["B10"].PutValue("Coke"); | |
cells["B11"].PutValue("Coladas"); | |
cells["B12"].PutValue("Fizz"); | |
cells["C1"].PutValue("Cost"); | |
cells["C2"].PutValue(2.2); | |
cells["C3"].PutValue(3.1); | |
cells["C4"].PutValue(4.1); | |
cells["C5"].PutValue(5.1); | |
cells["C6"].PutValue(4.4); | |
cells["C7"].PutValue(5.4); | |
cells["C8"].PutValue(6.5); | |
cells["C9"].PutValue(5.3); | |
cells["C10"].PutValue(3.2); | |
cells["C11"].PutValue(3.6); | |
cells["C12"].PutValue(5.2); | |
cells["D1"].PutValue("Profit"); | |
cells["D2"].PutValue(0.1); | |
cells["D3"].PutValue(0.4); | |
cells["D4"].PutValue(0.5); | |
cells["D5"].PutValue(0.6); | |
cells["D6"].PutValue(0.7); | |
cells["D7"].PutValue(1.3); | |
cells["D8"].PutValue(0.8); | |
cells["D9"].PutValue(1.3); | |
cells["D10"].PutValue(2.2); | |
cells["D11"].PutValue(2.4); | |
cells["D12"].PutValue(3.3); | |
// Create ListObject, Get the List objects collection in the first worksheet | |
var listObjects = sheet.ListObjects; | |
// Add a List based on the data source range with headers on | |
var index = listObjects.Add(0, 0, 11, 3, true); | |
sheet.AutoFitColumns(); | |
// Create chart based on ListObject | |
index = sheet.Charts.Add(ChartType.Column, 21, 1, 35, 18); | |
var chart = sheet.Charts[index]; | |
chart.SetChartDataRange("A1:D12", true); | |
chart.NSeries.CategoryData = "A2:B12"; | |
// Save spreadsheet | |
book.Save(dataDir + "output_out.xlsx"); |
استخدام الصيغ الديناميكية
في حالة عدم رغبتك في استخدام ListObject كمصدر بيانات للمخطط الديناميكي، الخيار الآخر هو استخدام الوظائف (أو الصيغ) في Excel لإنشاء نطاق بيانات ديناميكي، وعنصر تحكم (مثل ComboBox) لتغيير البيانات. في هذ scenar تستخدم الوظيفة VLOOKUP لجلب القيم المناسبة استنادا إلى اختيار ComboBox. عند تغيير التحديد، ستقوم وظيفة VLOOKUP بتحديث قيمة الخلية. إذا كانت مجموعة من الخلايا تستخدم وظيفة VLOOKUP، فيمكن تحديث المجموعة بأكملها عند تفاعل المستخدم، لذا يمكن استخدامها كمصدر للمخطط الديناميكي.
من أجل إبقاء العرض التوضيحي بسيطًا للفهم، سنقوم بإنشاء دفتر العمل من البداية والمضي قدمًا خطوة بخطوة كما هو موضح أدناه.
- إنشاء Workbook فارغة.
- الوصول إلى Cells لأول Worksheet في Workbook.
- إدراج بعض البيانات في الخلايا عن طريق إنشاء نطاق مسمى. ستكون هذه البيانات مصدرًا للمخطط الديناميكي.
- إنشاء ComboBox استنادًا إلى النطاق المسمى الذي تم إنشاؤه في الخطوة السابقة.
- إدراج بعض البيانات الإضافية في الخلايا التي ستعتبر مصدرًا لوظيفة VLOOKUP.
- إدراج وظيفة VLOOKUP (بمعلمات مناسبة) في مجموعة من الخلايا. ستعتبر هذه المجموعة مصدرًا للمخطط الديناميكي.
- إنشاء Chart استنادًا إلى النطاق الذي تم إنشاؤه في الخطوة السابقة.
- حفظ النتيجة على القرص.
// For complete examples and data files, please go to https://github.com/aspose-cells/Aspose.Cells-for-.NET | |
// The path to the documents directory. | |
string dataDir = RunExamples.GetDataDir(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType); | |
// Create a workbook object | |
var workbook = new Workbook(); | |
// Get the first worksheet | |
var worksheet = workbook.Worksheets[0]; | |
// Create a range in the second worksheet | |
var range = worksheet.Cells.CreateRange("C21", "C24"); | |
// Name the range | |
range.Name = "MyRange"; | |
// Fill different cells with data in the range | |
range[0, 0].PutValue("North"); | |
range[1, 0].PutValue("South"); | |
range[2, 0].PutValue("East"); | |
range[3, 0].PutValue("West"); | |
ComboBox comboBox = worksheet.Shapes.AddComboBox(15, 0, 2, 0, 17, 64); | |
comboBox.InputRange = "=MyRange"; | |
comboBox.LinkedCell = "=B16"; | |
comboBox.SelectedIndex = 0; | |
Cell cell = worksheet.Cells["B16"]; | |
Style style = cell.GetStyle(); | |
style.Font.Color = Color.White; | |
cell.SetStyle(style); | |
worksheet.Cells["C16"].Formula = "=INDEX(Sheet1!$C$21:$C$24,$B$16,1)"; | |
// Put some data for chart source | |
// Data Headers | |
worksheet.Cells["D15"].PutValue("Jan"); | |
worksheet.Cells["D20"].PutValue("Jan"); | |
worksheet.Cells["E15"].PutValue("Feb"); | |
worksheet.Cells["E20"].PutValue("Feb"); | |
worksheet.Cells["F15"].PutValue("Mar"); | |
worksheet.Cells["F20"].PutValue("Mar"); | |
worksheet.Cells["G15"].PutValue("Apr"); | |
worksheet.Cells["G20"].PutValue("Apr"); | |
worksheet.Cells["H15"].PutValue("May"); | |
worksheet.Cells["H20"].PutValue("May"); | |
worksheet.Cells["I15"].PutValue("Jun"); | |
worksheet.Cells["I20"].PutValue("Jun"); | |
// Data | |
worksheet.Cells["D21"].PutValue(304); | |
worksheet.Cells["D22"].PutValue(402); | |
worksheet.Cells["D23"].PutValue(321); | |
worksheet.Cells["D24"].PutValue(123); | |
worksheet.Cells["E21"].PutValue(300); | |
worksheet.Cells["E22"].PutValue(500); | |
worksheet.Cells["E23"].PutValue(219); | |
worksheet.Cells["E24"].PutValue(422); | |
worksheet.Cells["F21"].PutValue(222); | |
worksheet.Cells["F22"].PutValue(331); | |
worksheet.Cells["F23"].PutValue(112); | |
worksheet.Cells["F24"].PutValue(350); | |
worksheet.Cells["G21"].PutValue(100); | |
worksheet.Cells["G22"].PutValue(200); | |
worksheet.Cells["G23"].PutValue(300); | |
worksheet.Cells["G24"].PutValue(400); | |
worksheet.Cells["H21"].PutValue(200); | |
worksheet.Cells["H22"].PutValue(300); | |
worksheet.Cells["H23"].PutValue(400); | |
worksheet.Cells["H24"].PutValue(500); | |
worksheet.Cells["I21"].PutValue(400); | |
worksheet.Cells["I22"].PutValue(200); | |
worksheet.Cells["I23"].PutValue(200); | |
worksheet.Cells["I24"].PutValue(100); | |
// Dynamically load data on selection of Dropdown value | |
worksheet.Cells["D16"].Formula = "=IFERROR(VLOOKUP($C$16,$C$21:$I$24,2,FALSE),0)"; | |
worksheet.Cells["E16"].Formula = "=IFERROR(VLOOKUP($C$16,$C$21:$I$24,3,FALSE),0)"; | |
worksheet.Cells["F16"].Formula = "=IFERROR(VLOOKUP($C$16,$C$21:$I$24,4,FALSE),0)"; | |
worksheet.Cells["G16"].Formula = "=IFERROR(VLOOKUP($C$16,$C$21:$I$24,5,FALSE),0)"; | |
worksheet.Cells["H16"].Formula = "=IFERROR(VLOOKUP($C$16,$C$21:$I$24,6,FALSE),0)"; | |
worksheet.Cells["I16"].Formula = "=IFERROR(VLOOKUP($C$16,$C$21:$I$24,7,FALSE),0)"; | |
// Create Chart | |
int index = worksheet.Charts.Add(ChartType.Column, 0, 3, 12, 9); | |
Chart chart = worksheet.Charts[index]; | |
chart.NSeries.Add("='Sheet1'!$D$16:$I$16", false); | |
chart.NSeries[0].Name = "=C16"; | |
chart.NSeries.CategoryData = "=$D$15:$I$15"; | |
// Save result on disc | |
workbook.Save(dataDir + "output_out.xlsx"); |