Giới thiệu

Aspose.Cells FOSS cho C++ được xây dựng thành hai lớp. Lớp mà hầu hết mã tiếp xúc là lớp facade: Workbook, Worksheet, Cell, và Style, là những gì các bài thông báo và tính năng cho nền tảng này đề cập. Bên dưới là lớp thứ hai, nằm trong không gian tên Aspose::Cells_FOSS::Core, bao gồm các bản ghi dữ liệu thuần — WorkbookModel, WorksheetModel, CellRecord, StyleValue, và khoảng bốn chục loại *Model và *Value liên quan. Các bản ghi này chứa trạng thái bảng tính đã được phân tích thực tế: giá trị ô được khóa bởi CellAddress, các thuộc tính kiểu dáng dưới dạng StyleValue, cài đặt sổ làm việc và trang tính, thiết lập trang, bộ lọc và chẩn đoán tải. Các lớp facade đọc và ghi vào lớp này thay vì tự lưu trữ trạng thái.

Cầu nối giữa hai lớp là rõ ràng và công khai. Workbook::GetModel() trả về một Core::WorkbookModel, Worksheet::GetModel() trả về một Core::WorksheetModel, và Style::ToCore() / Style::FromCore() chuyển đổi một Style có thể thay đổi sang và từ một Core::StyleValue. DocumentProperties::GetModel() và ExtendedDocumentProperties::GetModel() thực hiện tương tự cho siêu dữ liệu tài liệu. Người tiêu dùng sẽ truy cập lớp này một cách trực tiếp trong một số trường hợp hẹp hơn so với API chỉnh sửa ô hàng ngày: kiểm tra DiagnosticBag được ghi lại khi một sổ làm việc được tải hoặc lưu, chuẩn hoá một kiểu dáng thông qua StyleRepository ở mức sổ làm việc, hoặc làm việc trực tiếp với các bản ghi ô và hàng kiểu dữ liệu thuần thay vì các đối tượng bao bọc Cell / Row.

Tất cả những gì được mô tả ở đây được phân phối trong cùng một cây nguồn không có phụ thuộc, được cấp phép MIT như phần còn lại của Aspose.Cells FOSS cho C++, được xây dựng bằng CMake và bao gồm dưới dạng header và mã nguồn thay vì một binary đã được biên dịch trước. Nếu bạn chưa làm việc với API facade, hãy bắt đầu với bài viết về các tính năng Workbook/Worksheet/Cell trước — bài viết này giả định rằng nền tảng đã được nắm vững và tập trung vào những gì nằm dưới nó.


Những gì được bao gồm

Cây mô hình Workbook và Worksheet

Core::WorkbookModel là bản ghi gốc. GetWorksheets() trả về một std::deque<WorksheetModel>, GetSettings() một WorkbookSettingsModel, GetProperties() một WorkbookPropertiesModel, GetDocumentProperties() một DocumentPropertiesModel, GetDiagnostics() một DiagnosticBag, GetStyles() một StyleRepository, GetSharedStrings() một SharedStringRepository, và GetDefaultStyle() / SetDefaultStyle() một StyleValue. Nó cũng theo dõi GetActiveSheetIndex() và một std::vector<DefinedNameModel> từ GetDefinedNames(). Workbook::GetModel() là điểm vào của bản ghi này.

Core::WorksheetModel, được truy cập qua Worksheet::GetModel(), lưu các ô dưới dạng std::unordered_map<CellAddress, CellRecord> thông qua GetCells(), các hàng dưới dạng std::unordered_map<int, RowModel> thông qua GetRows(), các phạm vi cột dưới dạng std::vector<ColumnRangeModel> thông qua GetColumns(), và các phạm vi hợp nhất dưới dạng std::vector<MergeRegion> thông qua GetMergeRegions(). Nó cũng chứa GetHyperlinks(), GetValidations(), GetConditionalFormattings(), GetPageSetup(), GetView(), GetProtection(), GetAutoFilter(), GetTabColor(), và GetVisibility() (một giá trị SheetVisibility: Visible, Hidden, hoặc VeryHidden).

CellAddress là kiểu khóa có thể băm được dùng cho bản đồ ô đó. Nó phân tích văn bản kiểu A1 thành chỉ mục hàng/cột bắt đầu từ 0 và ngược lại — đây là một trong số ít các lớp trong cụm này có phạm vi kiểm thử trực tiếp trong repo FOSS:

#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 chứa CellValue, CellValueKind của một ô, một chuỗi công thức tùy chọn, một StyleValue, và một cờ GetIsExplicitlyStored() phân biệt ô thực sự được ghi với ô chỉ tồn tại vì mặc định hàng hoặc cột chạm tới nó. RowModel mang chiều cao tùy chọn, một cờ ẩn, và một chỉ mục kiểu dáng tùy chọn; ColumnRangeModel mang ba thuộc tính tương tự cộng với khoảng cột tối thiểu/tối đa mà nó áp dụng. MergeRegion là một hình chữ nhật đơn giản first-row/first-column/total-rows/total-columns.

Dữ liệu Kiểu dáng dưới dạng Giá trị Thuần

StyleValue là đối tác Core của lớp mặt nạ Style có thể thay đổi — Style::ToCore() chuyển một Style thành một, và Style::FromCore() xây dựng một Style từ một. Nó nhóm GetFont() (FontValue), GetPattern() (FillPatternKind), GetForegroundColor() / GetBackgroundColor() (ColorValue), GetBorders() (BordersValue), GetAlignment() (AlignmentValue), GetProtection() (ProtectionValue), và GetNumberFormat() (NumberFormatValue), cộng thêm một StyleValue::Default() tĩnh và một Clone(). FontValue phản chiếu trường Font theo từng trường: name, size, bold, italic, underline, strike-through, và một ColorValue. ColorValue tự nó là một tuple ARGB thuần (GetA(), GetR(), GetG(), GetB(), Equals(), GetHashCode()) — không giống như lớp mặt nạ Color nó không có nhà máy kiểu FromArgb(), vì vậy một ColorValue thường được lấy từ một kiểu hiện có thay vì được tạo trực tiếp.

BordersValue chứa năm thành viên BorderSideValue — left, right, top, bottom, và diagonal — mỗi cặp một giá trị enum BorderStyle với một ColorValue. AlignmentValue mô hình hoá việc căn chỉnh ngang và dọc, gói văn bản, mức thụt lề, xoay văn bản, thu nhỏ để vừa, và thứ tự đọc. ProtectionValue và NumberFormatValue hỗ trợ các cờ bảo vệ ô và cặp id định dạng số/chuỗi tùy chỉnh mà Style cung cấp.

StyleRepository, được truy cập qua WorkbookModel::GetStyles(), cung cấp một thao tác: Normalize(style) -> StyleValue. Sổ làm việc sử dụng nó nội bộ trong quá trình tải và lưu để nội bộ hoá các kiểu tương đương thay vì sao chép các bản ghi StyleValue giống hệt — nó không phải là bộ nhớ đệm kiểu đa mục đích với tra cứu dựa trên chỉ mục trong giao diện API hiện tại.

Thuộc tính Tài liệu và Cài đặt Cấp Sổ làm việc

DocumentPropertiesModel nhóm GetCore() (CoreDocumentPropertiesModel: title, subject, creator, keywords, description, last-modified-by, revision, category, content status, và các dấu thời gian created/modified) và GetExtended() (ExtendedDocumentPropertiesModel: application, app version, company, manager, doc security, hyperlink base, và các cờ scale-crop / links-up-to-date / shared-doc). DocumentProperties::GetModel() và ExtendedDocumentProperties::GetModel() kết nối từ các lớp facade tới các bản ghi này.

WorkbookPropertiesModel phản chiếu WorkbookProperties — code name, show-objects, filter privacy, backup-file, và các cờ liên quan — và lồng WorkbookProtectionModel (lock structure/windows/revision, workbook và mật khẩu revisions), WorkbookViewModel (vị trí và kích thước cửa sổ, sheet đầu tiên hiển thị, hiển thị thanh cuộn và tab sheet, tỷ lệ tab, trạng thái thu nhỏ, nhóm ngày auto-filter), và CalculationPropertiesModel (chế độ tính toán, cài đặt lặp lại, độ chính xác đầy đủ, tính toán đồng thời). WorkbookSettingsModel mang một giá trị DateSystem (Windows1900 hoặc Mac1904) và một culture hiển thị — đối tượng cấp mô hình của WorkbookSettings::GetDate1904() / GetCulture(). Hầu hết các loại *Model trong nhóm này phơi bày CopyFrom(source) và HasStoredState(), mà serializer dùng để phân biệt giá trị được đặt rõ ràng với giá trị mặc định chưa đặt trước khi ghi XML.

Mô hình tính năng Worksheet

WorksheetProtectionModel phản chiếu WorksheetProtection từng trường và thêm các trường mật khẩu đã lưu — GetPasswordHash(), GetAlgorithmName(), GetHashValue(), GetSaltValue(), GetSpinCount() — mà facade WorksheetProtection không hiển thị trực tiếp. WorksheetViewModel chứa các thuộc tính hiển thị đường lưới, tiêu đề và zero visibility, bố cục phải sang trái, và tỷ lệ thu phóng. PageSetupModel lồng PageMarginsModel (lề trái/phải/trên/dưới/đầu trang/cuối trang dưới dạng số thực), PrintOptionsModel (đường lưới, tiêu đề, căn giữa ngang và dọc), và HeaderFooterModel (văn bản tiêu đề và chân trang trái/giữa/phải), cùng với kích thước giấy, hướng, tỷ lệ, vừa chiều rộng/chiều cao, vùng in, tiêu đề in hàng/cột, và các vector ngắt trang.

AutoFilterModel chứa một chuỗi phạm vi, một std::vector<FilterColumnModel>, và một AutoFilterSortStateModel. FilterColumnModel lại lồng AutoFilterColorFilterModel, AutoFilterDynamicFilterModel, và AutoFilterTop10Model, cộng với một danh sách đơn giản các chuỗi giá trị bộ lọc và một std::vector<AutoFilterCustomFilterModel>. ConditionalFormattingModel ghép một std::vector<CellArea> với một std::vector<FormatConditionModel> — mỗi điều kiện mang loại, toán tử, công thức, các trường color-scale/data-bar/icon-set, và một StyleValue cho định dạng kết quả. ValidationModel và HyperlinkModel phản chiếu các facade Validation và Hyperlink dưới dạng bản ghi đơn giản, và DefinedNameModel phản chiếu DefinedName. SheetVisibility là enum cấp mô hình phía sau Worksheet::GetVisibilityType().

Một số tính năng facade mà các bản ghi này hỗ trợ — đặc biệt là AutoFilter và ConditionalFormattingCollection — đã được đề cập trong tài liệu sản phẩm là vẫn đang trong quá trình phát triển tích cực trong phiên bản này. Hãy coi các hình dạng ở trên như mục tiêu cấu trúc mà mô hình và serializer được xây dựng xung quanh thay vì là một cam kết rằng mọi trường đều có thể vòng quay qua một workbook đã lưu ngày hôm nay.

Chẩn đoán và Trạng thái Chia sẻ

DiagnosticBag, được truy cập qua WorkbookModel::GetDiagnostics(), thu thập các bản ghi DiagnosticEntry — mỗi bản ghi có một GetCode(), một GetSeverity() (DiagnosticSeverity: Warning, Recoverable, hoặc LossyRecoverable), một GetMessage(), một cờ GetRepairApplied(), và một cờ GetDataLossRisk() — được tạo ra trong quá trình một workbook được phân tích hoặc tuần tự hoá. Điều này chạy song song với Workbook::GetLoadDiagnostics(), mà các loại LoadDiagnostics / LoadIssue ở mức facade chia sẻ cùng enum DiagnosticSeverity; mã cần bản ghi mô hình thô thay vì lớp bao LoadIssue sẽ truy cập nó qua GetDiagnostics() trên mô hình workbook.

SharedStringRepository hỗ trợ bảng shared-strings của xlsx: GetValues() trả về vector chuỗi đã intern, TryGetValue(index, value) giải quyết chỉ mục trở lại văn bản, và Intern(value) thêm hoặc tái sử dụng một mục — được dùng nội bộ khi SaveOptions::SetUseSharedStrings(true) được đặt. DateSerialConverter chuyển đổi giữa một DateTime và số serial kiểu OLE mà Excel lưu trong ô, nhận một DateSystem để các workbook dựa trên 1900 và 1904 giải mã thành cùng một ngày lịch.


Bắt đầu nhanh

Thêm thư viện vào dự án CMake như một thư mục con và liên kết mục tiêu mà nó định nghĩa:

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

Ví dụ dưới đây ghi một ô thông qua façade, sau đó truy cập vào mô hình nền để lấy một diagnostic bag và một CellAddress parse — cùng một thao tác mà WorksheetModel::GetCells() sử dụng nội bộ để khóa bản đồ ô của nó:

#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;
}

Các định dạng được hỗ trợ

Định dạngPhần mở rộngĐọcGhi
XLSX.xlsx✓✓

Lớp mô hình được mô tả ở đây là biểu diễn trong bộ nhớ mà bộ đọc và ghi xlsx hoạt động trên; nó không bị ràng buộc với bất kỳ định dạng tệp bổ sung nào ngoài việc nhập/xuất Xlsx mà phần còn lại của thư viện hỗ trợ.


Mã nguồn mở & Giấy phép

Aspose.Cells FOSS cho C++ được cấp phép MIT. Mã nguồn, bao gồm các header mô hình Aspose::Cells_FOSS::Core được đề cập trong bài viết này, có trên GitHub; việc sử dụng thương mại, sửa đổi và phân phối lại được phép.


Bắt đầu

Tài nguyên liên quan