Arbeta med diagram

Översikt

Aspose.Cells FOSS uses a method-per-chart-type API. Instead of a generic add(ChartType.X, ...) anrop, har varje diagramtyp sin egen dedikerade metod på arbetsbladets charts samling:

MetodDiagramtyp
ws.charts.add_bar(top_row, left_col, bottom_row, right_col)Grupperad kolumn (stapeldiagram)
ws.charts.add_line(top_row, left_col, bottom_row, right_col)Linje
ws.charts.add_pie(top_row, left_col, bottom_row, right_col)Cirkeldiagram
ws.charts.add_area(top_row, left_col, bottom_row, right_col)Ytdiagram

Alla fyra positionsparametrar beskriver det rektangulära området i bladet där diagrammet kommer att bäddas in. Rad- och kolumnindex är nollbaserade. Varje metod returnerar en Chart objekt som du konfigurerar vidare innan du sparar.

Begränsning: Endast diagramtyperna LINE, BAR, PIE, AREA och STOCK kan sparas till XLSX. Anropar wb.save() med en arbetsbok som innehåller någon annan diagramtyp (t.ex. SCATTER, WATERFALL, RADAR, TREEMAP, HISTOGRAM) kommer att utlösa NotImplementedError.


Lägga till ett stapeldiagram

Exemplet nedan skriver ett litet intäkts‑per‑produkt‑dataset och lägger sedan till ett stapeldiagram placerat under datan.

from aspose.cells_foss import Workbook, Cell

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

##--- Data ---
ws.cells["A1"].value = "Product"
ws.cells["B1"].value = "Revenue"

products = ["Widget A", "Widget B", "Widget C", "Widget D", "Widget E"]
revenues = [12_500, 18_200, 9_800, 21_400, 15_600]

for i, (product, revenue) in enumerate(zip(products, revenues), start=2):
    ws.cells[f"A{i}"].value = product
    ws.cells[f"B{i}"].value = revenue

##--- Chart (rows 7–22, columns A–H, all zero-based) ---
##top_row=6, left_col=0, bottom_row=22, right_col=7
chart = ws.charts.add_bar(6, 0, 22, 7)

chart.title = "Revenue by Product"
chart.n_series.add("B2:B6", category_data="A2:A6", name="Revenue (USD)")
chart.show_legend = True
chart.legend_position = "bottom"

workbook.save("column_chart.xlsx")
print("Saved column_chart.xlsx")

Data täcker raderna 1–6 (nollbaserade rader 0–5), så top_row=6 placerar the diagrammet omedelbart nedanför utan att överlappa data.


Lägga till ett linjediagram

Linjediagram fungerar bra för att visa trender över tid. Funktionssignaturen är identisk med add_bar — endast metodnamnet ändras.

from aspose.cells_foss import Workbook, Cell

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

##--- Monthly trend data ---
ws.cells["A1"].value = "Month"
ws.cells["B1"].value = "Page Views"
ws.cells["C1"].value = "Conversions"

months = ["Jan", "Feb", "Mar", "Apr", "May", "Jun"]
page_views   = [4_200, 5_100, 4_800, 6_300, 7_100, 6_800]
conversions  = [  210,   255,   230,   340,   390,   360]

for i, (month, pv, cv) in enumerate(zip(months, page_views, conversions), start=2):
    ws.cells[f"A{i}"].value = month
    ws.cells[f"B{i}"].value = pv
    ws.cells[f"C{i}"].value = cv

##--- Line chart below the data ---
chart = ws.charts.add_line(8, 0, 24, 8)

chart.title = "Monthly Website Metrics"
chart.n_series.add("B2:B7", category_data="A2:A7", name="Page Views")
chart.n_series.add("C2:C7", category_data="A2:A7", name="Conversions")
chart.show_legend = True
chart.legend_position = "bottom"

workbook.save("line_chart.xlsx")
print("Saved line_chart.xlsx")

Diagramtitel och legend

Ställ in diagramtitel genom att tilldela en vanlig sträng direkt till chart.title. Egenskapen egenskapen accepterar en str — försök inte att komma åt en underegenskap som .title.text, vilket inte finns i detta bibliotek.

##Correct
chart.title = "Quarterly Sales"

##Wrong — raises AttributeError
##chart.title.text = "Quarterly Sales"

Legendsynlighet och position styrs av två egenskaper:

chart.show_legend = True          # display the legend
chart.legend_position = "bottom"  # "bottom", "top", "left", "right"

För att dölja legenden helt, sätt chart.show_legend = False. Värdet legend_position ignoreras när legenden är dold.


Konfiguration av dataserier

Använd chart.n_series.add() för att fästa dataintervall till ett diagram. Skicka alla argument som nyckelordsargument för att undvika förvirring kring positionsordning:

chart.n_series.add("B2:B6", category_data="A2:A6", name="Revenue")

Du kan lägga till flera serier i ett enda diagram genom att anropa n_series.add mer mer än en gång. Varje anrop lägger till en ny serie:

from aspose.cells_foss import Workbook, Cell

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

##Headers
ws.cells["A1"].value = "Quarter"
ws.cells["B1"].value = "North"
ws.cells["C1"].value = "South"
ws.cells["D1"].value = "East"

data = [
    ("Q1", 8_400, 6_100, 7_200),
    ("Q2", 9_200, 7_400, 8_100),
    ("Q3", 10_500, 8_900, 9_600),
    ("Q4", 11_800, 9_300, 10_200),
]

for i, row in enumerate(data, start=2):
    ws.cells[f"A{i}"].value = row[0]
    ws.cells[f"B{i}"].value = row[1]
    ws.cells[f"C{i}"].value = row[2]
    ws.cells[f"D{i}"].value = row[3]

chart = ws.charts.add_bar(6, 0, 22, 8)
chart.title = "Regional Sales by Quarter"

chart.n_series.add("B2:B5", category_data="A2:A5", name="North")
chart.n_series.add("C2:C5", category_data="A2:A5", name="South")
chart.n_series.add("D2:D5", category_data="A2:A5", name="East")

chart.show_legend = True
chart.legend_position = "bottom"

workbook.save("multi_series_chart.xlsx")
print("Saved multi_series_chart.xlsx")

Kategoridata

Kategorietiketter kan ställas in på diagramnivå eller på individuell serienivå.

Kategoridata på diagramnivå gäller för alla serier som standard:

chart.category_data = "A2:A5"

Kategoridata på serienivå (via category_data nyckelordsargument till n_series.add) åsidosätter diagramnivåinställningen för den specifika serien:

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

När varje serie delar samma kategorintervall, ange chart.category_data en gång är mer koncist. När serier har olika kategorintervall — till exempel, två dataset med olika tidsperioder — använd per-serie nyckelordsargumentet istället.


Diagramplacering

De fyra positionsparametrarna till varje add_* metod definierar en avgränsande rektangel i arket, mätt i nollbaserade rad- och kolumnindex:

add_bar(top_row, left_col, bottom_row, right_col)
ParameterBetydelse
top_rowNollbaserat index för den första rad som diagrammet upptar
left_colNollbaserat index för den vänstra kolumnen
bottom_rowNollbaserat index för den sista raden som diagrammet upptar
right_colNollbaserat index för den högra kolumnen

Ett vanligt mönster är att placera diagrammet direkt under data. Om dina data slutar på Excel-rad 6 (nollbaserat radindex 5), starta diagrammet vid top_row=6:

from aspose.cells_foss import Workbook, Cell

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

##Data in rows 1–5 (zero-based 0–4)
labels = ["Alpha", "Beta", "Gamma", "Delta", "Epsilon"]
values = [30, 45, 28, 60, 52]

ws.cells["A1"].value = "Category"
ws.cells["B1"].value = "Score"

for i, (label, val) in enumerate(zip(labels, values), start=2):
    ws.cells[f"A{i}"].value = label
    ws.cells[f"B{i}"].value = val

##Data ends at zero-based row 5 (Excel row 6).
##Place chart from row 6 to row 22, columns A–H (0–7).
chart = ws.charts.add_bar(6, 0, 22, 7)
chart.title = "Category Scores"
chart.n_series.add("B2:B6", category_data="A2:A6", name="Score")
chart.show_legend = False

workbook.save("positioned_chart.xlsx")
print("Saved positioned_chart.xlsx")

Gör diagrammet tillräckligt högt för att vara läsbart: en höjd på minst 15 rader (bottom_row - top_row >= 15) och en bredd på minst 6 kolumner är en rimlig utgångspunkt.


Vanliga misstag

FelRättVarför
ws.charts.add(ChartType.COLUMN, ...)ws.charts.add_bar(...)Anropa inte ws.charts.add(ChartType.X, ...) direkt för ej stödda typer — det kommer att kasta ett fel NotImplementedError för 11 av 16 diagramtyper. Använd add_bar(), add_line(), add_pie(), add_area(), eller add_stock() istället.
chart.title.text = "My Chart"chart.title = "My Chart"chart.title är en enkel strängegenskap, inte ett objekt med en .text underegenskap.
chart.n_series.add("B2:B5", "A2:A5", "Revenue")chart.n_series.add("B2:B5", category_data="A2:A5", name="Revenue")De andra och tredje parametrarna måste skickas som nyckelordsargument för att undvika tvetydighet.
chart = ws.charts.add_bar(0, 0, 15, 7) (överlappande data)Placera top_row under sista dataradenEtt diagram som överlappar data döljer värden och orsakar förvirrande layouter.
chart.legend_position = "bottom" utan chart.show_legend = TrueSätt chart.show_legend = True förstlegend_position har ingen effekt när show_legend är False.

Se även

 Svenska