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