Einleitung

Aspose.Cells FOSS für C++ ist als zwei Schichten aufgebaut. Die Schicht, die der meiste Code berührt, ist die Fassade: Workbook, Worksheet, Cell und Style, was in den Ankündigungs- und Funktionsbeiträgen für diese Plattform behandelt wird. Darunter befindet sich eine zweite Schicht, im Aspose::Cells_FOSS::Core-Namespace, bestehend aus einfachen Datenaufzeichnungen — WorkbookModel, WorksheetModel, CellRecord, StyleValue und etwa vier Dutzend verwandter *Model- und *Value-Typen. Diese Aufzeichnungen enthalten den tatsächlich geparsten Tabellenkalkulationsstatus: Zellwerte, die mit CellAddress indiziert sind, Stilattribute als StyleValue, Arbeitsbuch- und Arbeitsblatteinstellungen, Seiteneinrichtung, Filter und Ladediagnostik. Die Fassadenklassen lesen aus dieser Schicht und schreiben in sie, anstatt selbst Zustand zu speichern.

Die Brücke zwischen den beiden Schichten ist explizit und öffentlich. Workbook::GetModel() liefert ein Core::WorkbookModel, Worksheet::GetModel() liefert ein Core::WorksheetModel und Style::ToCore() / Style::FromCore() konvertieren ein veränderbares Style zu und von einem Core::StyleValue. DocumentProperties::GetModel() und ExtendedDocumentProperties::GetModel() tun dasselbe für Dokumentmetadaten. Ein Verbraucher greift in einem engeren Anwendungsfall direkt auf diese Schicht zu als beim alltäglichen Zellen-Bearbeitung API: das Prüfen des DiagnosticBag, das während des Ladens oder Speicherns eines Arbeitsbuchs aufgezeichnet wurde, das Normalisieren eines Stils über das Arbeitsbuch-ebene StyleRepository, oder das direkte Arbeiten mit den reinen Daten-Zellen- und Zeilen-Aufzeichnungen anstelle der Cell / Row Wrapper-Objekte.

Alles, was hier beschrieben wird, wird im selben MIT-lizenzierten, von Abhängigkeiten freien Quellbaum wie der Rest von Aspose.Cells FOSS für C++ ausgeliefert, gebaut mit CMake und als Header und Quellcode eingebunden, statt als vorgefertigtes Binärpaket. Wenn Sie noch nicht mit der Fassaden-API gearbeitet haben, beginnen Sie zuerst mit dem Beitrag zu den Workbook/Worksheet/Cell-Features — dieser Beitrag setzt dieses Grundlagenwissen voraus und konzentriert sich auf das, was darunter liegt.


Was enthalten ist

Der Modellbaum für Arbeitsbuch und Arbeitsblatt

Core::WorkbookModel ist der Stammdatensatz. GetWorksheets() liefert ein std::deque<WorksheetModel>, GetSettings() ein WorkbookSettingsModel, GetProperties() ein WorkbookPropertiesModel, GetDocumentProperties() ein DocumentPropertiesModel, GetDiagnostics() ein DiagnosticBag, GetStyles() ein StyleRepository, GetSharedStrings() ein SharedStringRepository und GetDefaultStyle() / SetDefaultStyle() ein StyleValue. Es verfolgt außerdem GetActiveSheetIndex() und ein std::vector<DefinedNameModel> von GetDefinedNames(). Workbook::GetModel() ist der Einstiegspunkt zu diesem Datensatz.

Core::WorksheetModel, erreicht über Worksheet::GetModel(), speichert Zellen als std::unordered_map<CellAddress, CellRecord> über GetCells(), Zeilen als std::unordered_map<int, RowModel> über GetRows(), Spaltenbereiche als std::vector<ColumnRangeModel> über GetColumns() und zusammengeführte Bereiche als std::vector<MergeRegion> über GetMergeRegions(). Es trägt außerdem GetHyperlinks(), GetValidations(), GetConditionalFormattings(), GetPageSetup(), GetView(), GetProtection(), GetAutoFilter(), GetTabColor() und GetVisibility() (ein SheetVisibility-Wert: Visible, Hidden oder VeryHidden).

CellAddress ist der hashbare Schlüsseltyp, der für diese Zellenzuordnung verwendet wird. Es analysiert A1-stiligen Text in nullbasierte Zeilen-/Spaltenindizes und zurück — dies ist eine der wenigen Klassen in diesem Cluster mit direkter Testabdeckung im FOSS-Repo:

#include "aspose/cells_foss/core/CellAddress.h"

using namespace Aspose::Cells_FOSS;

Core::CellAddress parsed = Core::CellAddress::Parse("AB3");
// parsed.GetRowIndex()    == 2    (zero-based row index)
// parsed.GetColumnIndex() == 27   (zero-based column index)
// parsed.ToString()       == "AB3"

CellRecord enthält die CellValue, CellValueKind einer Zelle, eine optionale Formelzeichenfolge, ein StyleValue und ein GetIsExplicitlyStored()-Flag, das eine tatsächlich geschriebene Zelle von einer unterscheidet, die nur existiert, weil ein Zeilen- oder Spaltenstandard sie berührt. RowModel trägt eine optionale Höhe, ein verborgenes Flag und einen optionalen Stil-Index; ColumnRangeModel trägt dieselben drei plus die minimale/maximale Spaltenbreite, auf die es angewendet wird. MergeRegion ist ein einfaches Rechteck aus erster Zeile/erster Spalte/gesamten Zeilen/gesamten Spalten.

Stildaten als einfache Werte

StyleValue ist das Core-Gegenstück zur veränderlichen Style-Fassade — Style::ToCore() konvertiert ein Style zu einem, und Style::FromCore() erstellt ein Style daraus. Es gruppiert GetFont() (FontValue), GetPattern() (FillPatternKind), GetForegroundColor() / GetBackgroundColor() (ColorValue), GetBorders() (BordersValue), GetAlignment() (AlignmentValue), GetProtection() (ProtectionValue) und GetNumberFormat() (NumberFormatValue), plus ein statisches StyleValue::Default() und ein Clone(). FontValue spiegelt Font Feld für Feld wider: name, size, bold, italic, underline, strike-through und ein ColorValue. ColorValue selbst ist ein einfaches ARGB-Tupel (GetA(), GetR(), GetG(), GetB(), Equals(), GetHashCode()) — im Gegensatz zur Fassade Color Klasse hat es keine FromArgb()-Style-Factory, sodass ein ColorValue normalerweise aus einem bestehenden Stil gewonnen wird, anstatt direkt konstruiert zu werden.

BordersValue enthält fünf BorderSideValue-Mitglieder — links, rechts, oben, unten und diagonal — von denen jedes einen BorderStyle-Enum-Wert mit einem ColorValue verbindet. AlignmentValue modelliert horizontale und vertikale Ausrichtung, Zeilenumbruch, Einzugsebene, Textrotation, Verkleinerung-auf-Fit und Lesereihenfolge. ProtectionValue und NumberFormatValue unterstützen die Zellen-Schutz-Flags sowie das Zahlenformat-ID/benutzerdefinierte-Zeichenfolge-Paar, das Style bereitstellt.

StyleRepository, erreicht über WorkbookModel::GetStyles(), stellt eine Operation bereit: Normalize(style) -> StyleValue. Die Arbeitsmappe verwendet sie intern beim Laden und Speichern, um äquivalente Stile zu internieren statt identische StyleValue-Datensätze zu duplizieren — sie ist kein universeller Stil-Cache mit indexbasierter Suche in der aktuellen API-Oberfläche.

Dokumenteigenschaften und Arbeitsmappen-Einstellungen

DocumentPropertiesModel gruppiert GetCore() (CoreDocumentPropertiesModel: title, subject, creator, keywords, description, last-modified-by, revision, category, content status und created/modified timestamps) und GetExtended() (ExtendedDocumentPropertiesModel: application, app version, company, manager, doc security, hyperlink base und die scale-crop / links-up-to-date / shared-doc Flags). DocumentProperties::GetModel() und ExtendedDocumentProperties::GetModel() bilden die Brücke von den Fassadeklassen zu diesen Datensätzen.

WorkbookPropertiesModel spiegelt WorkbookProperties — code name, show-objects, filter privacy, backup-file und zugehörige Flags — und verschachtelt WorkbookProtectionModel (lock structure/windows/revision, workbook and revisions password), WorkbookViewModel (window position and size, first visible sheet, scroll-bar and sheet-tab visibility, tab ratio, minimized state, auto-filter date grouping) und CalculationPropertiesModel (calculation mode, iteration settings, full precision, concurrent calculation). WorkbookSettingsModel trägt einen DateSystem Wert (Windows1900 oder Mac1904) und eine Anzeige-Kultur — das modell-ebene Gegenstück zu WorkbookSettings::GetDate1904() / GetCulture(). Die meisten *Model Typen in dieser Gruppe exponieren CopyFrom(source) und HasStoredState(), die der Serializer verwendet, um einen explizit gesetzten Wert von einem nicht gesetzten Standard zu unterscheiden, bevor XML geschrieben wird.

Arbeitsblatt-Feature-Modelle

WorksheetProtectionModel spiegelt WorksheetProtection Feld für Feld und fügt die gespeicherten Passwortfelder — GetPasswordHash(), GetAlgorithmName(), GetHashValue(), GetSaltValue(), GetSpinCount() — hinzu, die die Fassade WorksheetProtection nicht direkt sichtbar macht. WorksheetViewModel enthält Gitterlinien-, Kopf- und Null-Sichtbarkeit, Rechts-nach-Links-Layout und Zoom-Skala. PageSetupModel verschachtelt PageMarginsModel (linke/rechte/obere/untere/Kopf-/Fußzeilen-Ränder als Double), PrintOptionsModel (Gitterlinien, Überschriften, horizontale und vertikale Zentrierung) und HeaderFooterModel (linker/zentrierter/rechter Kopf- und Fußzeilentext) sowie Papiergröße, Ausrichtung, Maßstab, Anpassen an Breite/Höhe, Druckbereich, Drucktitel-Zeilen/Spalten und Seitenumbruch-Vektoren.

AutoFilterModel enthält einen Bereichs-String, ein std::vector<FilterColumnModel> und ein AutoFilterSortStateModel. FilterColumnModel wiederum verschachtelt AutoFilterColorFilterModel, AutoFilterDynamicFilterModel und AutoFilterTop10Model, plus eine einfache Liste von Filterwert-Strings und ein std::vector<AutoFilterCustomFilterModel>. ConditionalFormattingModel kombiniert ein std::vector<CellArea> mit einem std::vector<FormatConditionModel> — jede Bedingung trägt ihren Typ, Operator, Formeln, Felder für Farbskala/Datenbalken/Icon-Set und ein StyleValue für das resultierende Format. ValidationModel und HyperlinkModel spiegeln die Validation und Hyperlink Fassaden als einfache Datensätze wider, und DefinedNameModel spiegelt DefinedName. SheetVisibility ist das modell-ebene Enum hinter Worksheet::GetVisibilityType().

Einige der Fassaden-Features, die diese Datensätze unterstützen — insbesondere AutoFilter und ConditionalFormattingCollection — werden in der Produktdokumentation als noch in aktiver Entwicklung in diesem Release gekennzeichnet. Betrachten Sie die obigen Strukturen als das strukturelle Ziel, um das Modell und Serializer gebaut sind, und nicht als Garantie, dass jedes Feld heute beim Speichern einer Arbeitsmappe rundlaufend ist.

Diagnostik und gemeinsamer Zustand

DiagnosticBag, erreicht über WorkbookModel::GetDiagnostics(), sammelt DiagnosticEntry Datensätze — jeder mit einem GetCode(), einem GetSeverity() (DiagnosticSeverity: Warning, Recoverable oder LossyRecoverable), einem GetMessage(), einem GetRepairApplied() Flag und einem GetDataLossRisk() Flag — erzeugt, während eine Arbeitsmappe geparst oder serialisiert wird. Dies läuft parallel zu Workbook::GetLoadDiagnostics(), dessen Fassaden-Level LoadDiagnostics / LoadIssue Typen das gleiche DiagnosticSeverity Enum teilen; Code, der den rohen Modell-Datensatz statt des LoadIssue Wrappers benötigt, greift über GetDiagnostics() im Arbeitsmappen-Modell darauf zu.

SharedStringRepository unterstützt die xlsx shared-strings-Tabelle: GetValues() liefert den internierten String-Vektor, TryGetValue(index, value) löst einen Index zurück in Text auf, und Intern(value) fügt einen Eintrag hinzu oder verwendet einen vorhandenen — wird intern verwendet, wenn SaveOptions::SetUseSharedStrings(true) gesetzt ist. DateSerialConverter konvertiert zwischen einem DateTime und der OLE-artigen Seriennummer, die Excel in einer Zelle speichert, wobei ein DateSystem verwendet wird, sodass Arbeitsmappen mit 1900- bzw. 1904-Basis auf dasselbe Kalendarium dekodiert werden.


Schnellstart

Fügen Sie die Bibliothek zu einem CMake-Projekt als Unterverzeichnis hinzu und linken Sie das von ihr definierte Ziel:

add_subdirectory(path/to/Aspose.Cells-FOSS-for-Cpp)
target_link_libraries(MyApp PRIVATE Aspose.Cells.Foss.Cpp)

Das nachstehende Beispiel schreibt eine Zelle über die Fassade und greift dann im zugrunde liegenden Modell auf eine Diagnose-Bag und einen CellAddress-Parse zu — dieselbe Operation, die WorksheetModel::GetCells() intern verwendet, um seine Zellkarte zu indizieren:

#include "aspose/cells_foss/Workbook.h"
#include "aspose/cells_foss/Worksheet.h"
#include "aspose/cells_foss/Cell.h"
#include "aspose/cells_foss/core/CellAddress.h"
#include <iostream>

using namespace Aspose::Cells_FOSS;

int main() {
    Workbook workbook;
    Worksheet& sheet = workbook.GetWorksheets()[0];
    sheet.SetName("Report");
    sheet.GetCells()["A1"].PutValue("Total");
    workbook.Save("report.xlsx");

    Core::CellAddress address = Core::CellAddress::Parse("A1");
    std::cout << "Row: " << address.GetRowIndex()
              << " Column: " << address.GetColumnIndex() << "\n";

    for (const auto& entry : workbook.GetModel().GetDiagnostics().GetEntries()) {
        std::cout << "Diagnostic: " << entry.GetMessage() << "\n";
    }

    return 0;
}

Unterstützte Formate

FormatErweiterungLesenSchreiben
XLSX.xlsx

Die hier beschriebene Modellebene ist die In-Memory-Repräsentation, auf der der xlsx-Reader und -Writer arbeiten; sie ist nicht an ein weiteres Dateiformat gebunden, abgesehen vom Xlsx-Import/Export, den der Rest der Bibliothek unterstützt.


Open Source & Lizenzierung

Aspose.Cells FOSS für C++ ist unter der MIT-Lizenz verfügbar. Der Quellcode, einschließlich der in diesem Beitrag referenzierten Aspose::Cells_FOSS::Core-Model-Header, befindet sich auf GitHub; kommerzielle Nutzung, Modifikation und Weiterverbreitung sind erlaubt.


Erste Schritte

Verwandte Ressourcen