创建动态图表
动态(或交互式)图表在更改数据范围时具有更改的能力。换句话说,当数据源更改时,动态图表可以自动反映更改。为了触发数据源的更改,可以使用Excel表的筛选选项,或者使用控件如下拉列表或下拉菜单。
本文演示了如何使用Aspose.Cells for Python via .NET的API,通过上述两种方法创建动态图表。
使用Excel表
ListObjects提供了以内置功能进行排序和筛选数据的能力。排序和筛选选项都通过自动添加到表头行的下拉列表提供。由于这些功能(排序和筛选),ListObject似乎是充当动态图表数据源的理想候选,因为当排序或筛选改变时,图表中的数据表现也将反映当前状态。
为了使演示简单易懂,我们将从头开始创建Workbook,并按照下面概述的步骤逐步进行。
- 创建一个空的Workbook。
- 访问Workbook中第一个Worksheet的Cells。
- 向单元格插入一些数据。
- 根据插入的数据创建ListObject。
- 根据ListObject的数据范围创建Chart。
- 将结果保存在磁盘上。
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函数(或公式)创建动态数据范围,并使用控件(如下拉列表)触发数据更改。在这种情况下,我们将使用VLOOKUP函数根据下拉列表的选择来获取适当的值。选择更改时,VLOOKUP函数将刷新单元格值。如果一系列单元格使用VLOOKUP函数,则用户交互时可以刷新整个范围,因此它可以用作动态图表的数据源。
为了使演示简单易懂,我们将从头开始创建工作簿,并按照下面的步骤一步步地前进。
- 创建一个空的Workbook。
- 访问Workbook中第一个Worksheet的Cells。
- 通过创建命名范围在单元格中插入一些数据。这些数据将作为动态图表的系列。
- 根据先前步骤中创建的命名范围创建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") |