Arbeiten mit Diagrammen

Übersicht

Aspose.Cells FOSS verwendet eine methoden‑pro‑Diagrammtyp‑API. Anstelle eines generischen add(ChartType.X, ...) Aufrufs hat jeder Diagrammtyp seine eigene dedizierte Methode in der charts‑Sammlung des Arbeitsblatts:

MethodeDiagrammtyp
ws.charts.add_bar(top_row, left_col, bottom_row, right_col)Gruppierte Säule (Balkendiagramm)
ws.charts.add_line(top_row, left_col, bottom_row, right_col)Linie
ws.charts.add_pie(top_row, left_col, bottom_row, right_col)Kreis
ws.charts.add_area(top_row, left_col, bottom_row, right_col)Fläche

Alle vier Positionsparameter beschreiben den rechteckigen Bereich im Blatt, in dem das Diagramm eingebettet wird. Zeilen‑ und Spaltenindizes sind nullbasiert. Jede Methode gibt ein Chart‑Objekt zurück, das Sie vor dem Speichern weiter konfigurieren.

Einschränkung: Nur die Diagrammtypen LINE, BAR, PIE, AREA und STOCK können in XLSX gespeichert werden. Der Aufruf von wb.save() mit einer Arbeitsmappe, die einen anderen Diagrammtyp enthält (z. B. SCATTER, WATERFALL, RADAR, TREEMAP, HISTOGRAM), löst NotImplementedError aus.


Ein Säulendiagramm hinzufügen

Das nachstehende Beispiel erstellt einen kleinen Umsatz‑nach‑Produkt‑Datensatz und fügt anschließend ein Säulendiagramm hinzu, das unter den Daten positioniert ist.

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")

Die Daten belegen die Zeilen 1–6 (nullbasierte Zeilen 0–5), sodass top_row=6 das Diagramm sofort darunter platziert, ohne die Daten zu überlappen.


Ein Liniendiagramm hinzufügen

Liniendiagramme eignen sich gut, um Trends im Zeitverlauf darzustellen. Die Aufrufsignatur ist identisch zu add_bar — nur der Methodenname ändert sich.

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")

Diagrammtitel und Legende

Setzen Sie den Diagrammtitel, indem Sie einen einfachen String direkt chart.title zuweisen. Die Eigenschaft akzeptiert ein str — versuchen Sie nicht, auf eine Untereigenschaft wie .title.text zuzugreifen, die in dieser Bibliothek nicht existiert.

##Correct
chart.title = "Quarterly Sales"

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

Die Sichtbarkeit und Position der Legende werden durch zwei Eigenschaften gesteuert:

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

Um die Legende vollständig auszublenden, setzen Sie chart.show_legend = False. Der
legend_position‑Wert wird ignoriert, wenn die Legende ausgeblendet ist.


Datenreihen‑Konfiguration

Verwenden Sie chart.n_series.add(), um Datenbereiche an ein Diagramm anzuhängen. Übergeben Sie alle Argumente als keyword arguments, um Verwechslungen durch Positionsreihenfolge zu vermeiden:

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

Sie können mehrere Serien zu einem einzelnen Diagramm hinzufügen, indem Sie n_series.add mehrmals aufrufen. Jeder Aufruf fügt eine neue Serie hinzu:

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")

Kategoriedaten

Kategorielabels können auf Diagrammebene oder auf Ebene der einzelnen Serien festgelegt werden.

Kategoriedaten auf Diagrammebene gilt standardmäßig für alle Reihen:

chart.category_data = "A2:A5"

Serienbezogene Kategoriedaten (über das Schlüsselwortargument category_data zu n_series.add) überschreibt die Diagrammebene‑Einstellung für diese bestimmte Serie:

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

Wenn jede Serie denselben Kategorienbereich teilt, das Setzen von chart.category_data
einmal ist prägnanter. Wenn Serien unterschiedliche Kategorienbereiche haben — zum Beispiel,
zwei Datensätze mit unterschiedlichen Zeiträumen — verwenden Sie das pro‑Serie‑Schlüsselwortargument
stattdessen.


Diagrammpositionierung

Die vier Positionsparameter jeder add_*‑Methode definieren ein Begrenzungsrechteck im Blatt, gemessen in nullbasierten Zeilen‑ und Spaltenindizes:

add_bar(top_row, left_col, bottom_row, right_col)
ParameterBedeutung
top_rowNullbasierter Index der ersten vom Diagramm belegten Zeile
left_colNullbasierter Index der linken Spalte
bottom_rowNullbasierter Index der letzten vom Diagramm belegten Zeile
right_colNullbasierter Index der rechten Spalte

Ein gängiges Muster besteht darin, das Diagramm direkt unter den Daten zu platzieren.
Wenn Ihre Daten in Excel‑Zeile 6 enden (nullbasierter Zeilenindex 5), beginnen Sie das Diagramm bei 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")

Machen Sie das Diagramm hoch genug, um lesbar zu sein: eine Höhe von mindestens 15 Zeilen
(bottom_row - top_row >= 15) und eine Breite von mindestens 6 Spalten ist ein vernünftiger
Ausgangspunkt.


Häufige Fehler

FalschRichtigWarum
ws.charts.add(ChartType.COLUMN, ...)ws.charts.add_bar(...)Rufen Sie ws.charts.add(ChartType.X, ...) nicht direkt für nicht unterstützte Typen auf — es wird NotImplementedError für 11 von 16 Diagrammtypen auslösen. Verwenden Sie stattdessen add_bar(), add_line(), add_pie(), add_area() oder add_stock().
chart.title.text = "My Chart"chart.title = "My Chart"chart.title ist eine einfache Zeichenketten‑Eigenschaft, kein Objekt mit einer .text‑Unter‑Eigenschaft.
chart.n_series.add("B2:B5", "A2:A5", "Revenue")chart.n_series.add("B2:B5", category_data="A2:A5", name="Revenue")Der zweite und dritte Parameter müssen als Schlüsselwort‑Argumente übergeben werden, um Mehrdeutigkeiten zu vermeiden.
chart = ws.charts.add_bar(0, 0, 15, 7) (überlappt Daten)Platzieren Sie top_row unter der letzten DatenzeileEin Diagramm, das Daten überlappt, verdeckt Werte und führt zu verwirrenden Layouts.
chart.legend_position = "bottom" ohne chart.show_legend = TrueSetzen Sie chart.show_legend = True zuerstlegend_position hat keine Wirkung, wenn show_legend False ist.

Siehe auch

 Deutsch