Por que criar gráficos programaticamente?

Pipelines de relatórios automatizados frequentemente precisam de gráficos incorporados em pastas de trabalho do Excel, como resumos trimestrais, painéis de resultados de ML ou métricas operacionais. Fazer isso sem o Microsoft Excel significa sem custo de licenciamento e sem interação com a interface gráfica.

Aspose.Cells FOSS for Python fornece uma API de gráficos limpa e Pythonic: um método por tipo de gráfico, uma string simples para o título e configuração de séries baseada em argumentos nomeados. A API completa está descrita abaixo.


Instalar

pip install aspose-cells-foss

Importe as classes que você precisa:

from aspose.cells_foss import Workbook, Cell

Gráficos são acessados via ws.charts; não é necessário importar um módulo de gráfico separado.


Visão geral da API de Gráficos

O que você querComo fazer isso
Adicionar um gráfico de colunasws.charts.add_bar(top_row, left_col, bottom_row, right_col)
Adicionar um gráfico de linhasws.charts.add_line(top_row, left_col, bottom_row, right_col)
Adicionar um gráfico de barrasws.charts.add_bar(top_row, left_col, bottom_row, right_col)
Adicionar um gráfico de pizzaws.charts.add_pie(top_row, left_col, bottom_row, right_col)
Definir o títulochart.title = "My Chart" (string simples; não .title.text)
Definir categorias do eixo xchart.category_data = "A2:A6"
Adicionar uma série nomeadachart.n_series.add("B2:B6", category_data="A2:A6", name="Revenue")
Exibir legendachart.show_legend = True
Definir posição da legendachart.legend_position = "bottom"

Todos os índices de linhas e colunas são baseados em zero. O add_* métodos retornam o Chart objeto diretamente (não um índice).


Gráfico de Colunas: Passo a Passo

Vamos criar um gráfico de colunas que mostra a receita e despesas trimestrais.

Passo 1: Crie a pasta de trabalho e escreva os dados

from aspose.cells_foss import Workbook, Cell

wb = Workbook()
ws = wb.worksheets[0]
ws.name = "Q1-Q4 Report"

##Headers
ws.cells["A1"].value = "Quarter"
ws.cells["B1"].value = "Revenue"
ws.cells["C1"].value = "Expenses"

##Data
quarters = ["Q1", "Q2", "Q3", "Q4"]
revenue  = [50000, 62000, 71000, 89000]
expenses = [32000, 38000, 41000, 47000]

for i, (q, r, e) in enumerate(zip(quarters, revenue, expenses), start=2):
    ws.cells[f"A{i}"].value = q
    ws.cells[f"B{i}"].value = r
    ws.cells[f"C{i}"].value = e

Passo 2: Adicione o gráfico

Posicione o gráfico abaixo dos dados (a partir da linha 7, abrangendo as colunas 0-8):

chart = ws.charts.add_bar(6, 0, 22, 8)

Passo 3: Configure o título e a legenda

chart.title = "Quarterly Revenue vs Expenses"
chart.show_legend = True
chart.legend_position = "bottom"

Etapa 4: Adicionar série de dados

Cada série precisa de um intervalo de valores, intervalo de categorias e um nome:

chart.category_data = "A2:A5"
chart.n_series.add("B2:B5", category_data="A2:A5", name="Revenue")
chart.n_series.add("C2:C5", category_data="A2:A5", name="Expenses")

Etapa 5: Salvar

wb.save("quarterly_report.xlsx")
print("Chart saved to quarterly_report.xlsx")

Exemplo completo em um bloco:

from aspose.cells_foss import Workbook, Cell

wb = Workbook()
ws = wb.worksheets[0]
ws.name = "Q1-Q4 Report"

##Data
ws.cells["A1"].value = "Quarter"
ws.cells["B1"].value = "Revenue"
ws.cells["C1"].value = "Expenses"

data = [("Q1", 50000, 32000), ("Q2", 62000, 38000),
        ("Q3", 71000, 41000), ("Q4", 89000, 47000)]
for i, (q, r, e) in enumerate(data, start=2):
    ws.cells[f"A{i}"].value = q
    ws.cells[f"B{i}"].value = r
    ws.cells[f"C{i}"].value = e

chart = ws.charts.add_bar(6, 0, 22, 8)
chart.title = "Quarterly Revenue vs Expenses"
chart.category_data = "A2:A5"
chart.n_series.add("B2:B5", category_data="A2:A5", name="Revenue")
chart.n_series.add("C2:C5", category_data="A2:A5", name="Expenses")
chart.show_legend = True
chart.legend_position = "bottom"

wb.save("quarterly_report.xlsx")

Gráfico de Linha: Tendência Mensal

O mesmo padrão funciona para add_line():

from aspose.cells_foss import Workbook, Cell

wb = Workbook()
ws = wb.worksheets[0]

months  = ["Jan", "Feb", "Mar", "Apr", "May", "Jun"]
actuals = [42000, 47500, 53000, 49000, 61000, 68000]
targets = [45000, 45000, 50000, 55000, 60000, 65000]

ws.cells["A1"].value = "Month"
ws.cells["B1"].value = "Actual"
ws.cells["C1"].value = "Target"

for i, (m, a, t) in enumerate(zip(months, actuals, targets), start=2):
    ws.cells[f"A{i}"].value = m
    ws.cells[f"B{i}"].value = a
    ws.cells[f"C{i}"].value = t

chart = ws.charts.add_line(8, 0, 24, 8)
chart.title = "Monthly Revenue: Actual vs Target"
chart.category_data = "A2:A7"
chart.n_series.add("B2:B7", category_data="A2:A7", name="Actual")
chart.n_series.add("C2:C7", category_data="A2:A7", name="Target")
chart.show_legend = True
chart.legend_position = "right"

wb.save("monthly_trend.xlsx")

Gráfico de Pizza: Participação de Mercado

from aspose.cells_foss import Workbook, Cell

wb = Workbook()
ws = wb.worksheets[0]

segments = ["Product A", "Product B", "Product C", "Product D"]
shares   = [40, 25, 20, 15]

ws.cells["A1"].value = "Segment"
ws.cells["B1"].value = "Share %"
for i, (s, v) in enumerate(zip(segments, shares), start=2):
    ws.cells[f"A{i}"].value = s
    ws.cells[f"B{i}"].value = v

chart = ws.charts.add_pie(6, 0, 20, 7)
chart.title = "Market Share by Product"
chart.category_data = "A2:A5"
chart.n_series.add("B2:B5", category_data="A2:A5", name="Share")
chart.show_legend = True
chart.legend_position = "right"

wb.save("market_share.xlsx")

Erros Comuns a Evitar

ErradoDireita
ws.charts.add(ChartType.COLUMN, 5, 0, 15, 5)ws.charts.add_bar(5, 0, 15, 5)
chart.title.text = "Revenue"chart.title = "Revenue"
chart.n_series.add("B2:B5", True) (posicional)chart.n_series.add("B2:B5", category_data="A2:A5", name="Revenue")
from aspose.cells.charts import ChartTypeNão necessário; use ws.charts.add_bar() diretamente
chart.n_series.category_data = "A2:A5"chart.category_data = "A2:A5" (nível do gráfico)

Recursos