Введение

Управление электронными таблицами — это часть Aspose.Cells FOSS для C++, с которой большинство программ сталкиваются в первую очередь: Workbook, владеющий файлом, объекты Worksheet внутри него и коллекция Cells, содержащая значения, формулы и форматирование. Эта статья рассматривает эту поверхность более подробно, чем общее введение — как создаются и навигируются workbooks и worksheets, как читаются и записываются значения ячеек и формулы, как Style, Font, Color и Borders комбинируются для форматирования вывода, и как PageSetup, Hyperlink, DefinedName и Validation добавляют структуру вокруг сырой сетки ячеек.

Каждый класс, рассмотренный здесь, является частью нативного C++ API, объявленного в заголовочных файлах aspose/cells_foss/. Нет COM-интероперабельности и зависимости от установленного Microsoft Excel — библиотека читает и записывает формат пакета .xlsx напрямую, что также объясняет, почему текущий релиз поддерживает только .xlsx, как при загрузке, так и при сохранении.

Приведённые ниже примеры построены друг на друге: создаётся workbook, заполняются worksheets и ячейки, применяется стилизация, после чего файл сохраняется и загружается вновь для подтверждения корректности кругового прохода. Весь код адаптирован из собственных наборов совместимости, золотых и модульных тестов библиотеки, поэтому он отражает операции, проверенные на реальном выводе .xlsx.


Ключевые возможности

Управление workbook и worksheet

Workbook начинается с одного worksheet в его WorksheetCollection. Worksheets добавляются с помощью Add(), ищутся по индексу или имени и переименовываются с помощью SetName(). WorksheetCollection также отслеживает, какой лист активен:

#include "aspose/cells_foss/Workbook.h"
#include "aspose/cells_foss/Worksheet.h"

using namespace Aspose::Cells_FOSS;

Workbook workbook;
Worksheet& sheet = workbook.GetWorksheets()[0];
sheet.SetName("Data");

int summaryIndex = workbook.GetWorksheets().Add("Summary");
workbook.GetWorksheets().SetActiveSheetIndex(0);

int sheetCount = workbook.GetWorksheets().GetCount(); // 2

Сохранение и повторная загрузка происходят через тот же тип Workbook. Workbook::Save() принимает путь к файлу, а Workbook может быть сконструирован напрямую из пути или из буфера байтов в памяти, что обеспечивает обратную передачу значений ячеек и формул:

workbook.Save("report.xlsx");

Workbook loaded("report.xlsx");
Worksheet& reloadedSheet = loaded.GetWorksheets()["Data"];

Значения ячеек и формулы

Cells, получаемый через Worksheet::GetCells(), индексирует ячейки по ссылке в стиле A1. Cell::PutValue() принимает строки, целые числа, числа с плавающей точкой и логические значения, SetFormula() хранит строку формулы Excel, а GetValue() возвращает CellValue с типизированными аксессорами (AsString(), AsInteger(), AsDouble(), AsBool(), AsDateTime()):

Cells& cells = sheet.GetCells();
cells["A1"].PutValue("Category");
cells["B1"].PutValue("Amount");
cells["A2"].PutValue("Travel");
cells["B2"].PutValue(482.50);
cells["A3"].PutValue("Supplies");
cells["B3"].PutValue(129.99);
cells["B4"].SetFormula("=SUM(B2:B3)");

CellValue amount = cells["B2"].GetValue();
if (amount.IsDouble()) {
    double value = amount.AsDouble();
}

std::string formula = cells["B4"].GetFormula();

Cell::GetType() сообщает о сохранённом CellValueType (Blank, String, Number, Boolean, DateTime или Formula), а GetDisplayStringValue() возвращает значение, отформатированное так, как оно выглядело бы в Excel, учитывая любой числовой формат, применённый через Style.

Стилизация с использованием Style, Font, Color и Borders

Cell::GetStyle() возвращает объект Style, который можно изменять и повторно применять с помощью SetStyle(). Style предоставляет Font, набор Borders, шаблон заливки и цвет, выравнивание и числовой формат:

#include "aspose/cells_foss/Style.h"
#include "aspose/cells_foss/Color.h"

Cell headerCell = sheet.GetCells()["A1"];
Style style = headerCell.GetStyle();

Font font = style.GetFont();
font.SetBold(true);
font.SetColor(Color::FromArgb(255, 255, 255, 255));
style.SetFont(font);

style.SetPattern(FillPattern::Solid);
style.SetForegroundColor(Color::FromArgb(255, 34, 120, 212));
style.SetHorizontalAlignment(HorizontalAlignmentType::Center);

Borders borders = style.GetBorders();
Border bottomBorder = borders.GetBottom();
bottomBorder.SetLineStyle(BorderStyleType::Thin);
borders.SetBottom(bottomBorder);
style.SetBorders(borders);

style.SetNumberFormat("#,##0.00");
headerCell.SetStyle(style);

Style является типом значения: чтение его обратно с помощью GetStyle() отражает всё, что было последним установленным через SetStyle(), что упрощает создание одного стиля и применение его к строке заголовка или диапазону ячеек данных.

Настройка страницы и конфигурация печати

Worksheet::GetPageSetup() возвращает объект PageSetup, охватывающий размер бумаги, ориентацию, поля, масштабирование, заголовки печати и разрывы страниц:

#include "aspose/cells_foss/PageSetup.h"

PageSetup& pageSetup = sheet.GetPageSetup();
pageSetup.SetOrientation(PageOrientationType::Landscape);
pageSetup.SetPaperSize(PaperSizeType::PaperA4);
pageSetup.SetFitToPagesWide(1);
pageSetup.SetFitToPagesTall(0);
pageSetup.SetPrintArea("$A$1:$D$20");
pageSetup.SetPrintTitleRows("$1:$1");
pageSetup.SetLeftMargin(0.5);
pageSetup.SetCenterFooter("Page &P of &N");
pageSetup.AddHorizontalPageBreak(20);

Поля доступны как в сырых единицах (GetLeftMargin()), так и в дюймах (GetLeftMarginInch()), а GetHorizontalPageBreaks() / GetVerticalPageBreaks() возвращают текущие позиции разрывов страниц, установленные на листе.

Гиперссылки, определённые имена и проверка данных

Worksheet::GetHyperlinks() возвращает HyperlinkCollection. Add() принимает целевую ячейку или диапазон плюс адрес и возвращает индекс новой гиперссылки, который используется для получения объекта Hyperlink для дальнейших изменений:

#include "aspose/cells_foss/Hyperlink.h"

sheet.GetCells()["A1"].PutValue("Documentation");
int linkIndex = sheet.GetHyperlinks().Add("A1", 1, 1, "https://example.com/docs");
Hyperlink link = sheet.GetHyperlinks()[linkIndex];
link.SetTextToDisplay("Documentation");
link.SetScreenTip("Open the docs site");

Workbook::GetDefinedNames() управляет именованными диапазонами тем же способом — Add() возвращает индекс в DefinedNameCollection:

#include "aspose/cells_foss/DefinedName.h"

int nameIndex = workbook.GetDefinedNames().Add("Total", "=Data!$B$2:$B$3");
DefinedName total = workbook.GetDefinedNames()[nameIndex];
total.SetComment("Sum of tracked expenses");

Worksheet::GetValidations() следует той же схеме коллекций для правил проверки данных, ограниченных CellArea:

#include "aspose/cells_foss/Validation.h"
#include "aspose/cells_foss/CellArea.h"

int ruleIndex = sheet.GetValidations().Add(CellArea::CreateCellArea("B2", "B3"));
Validation amountRule = sheet.GetValidations()[ruleIndex];
amountRule.SetType(ValidationType::Decimal);
amountRule.SetOperator(OperatorType::GreaterThan);
amountRule.SetFormula1("0");
amountRule.SetErrorTitle("Invalid Amount");
amountRule.SetErrorMessage("Enter a positive number");

Свойства документа и настройки рабочей книги

Workbook::GetDocumentProperties() раскрывает основные и расширенные поля метаданных OOXML (заголовок, автор, компания, менеджер и т.п.), а Workbook::GetSettings() управляет поведением на уровне рабочей книги, например системой дат:

#include "aspose/cells_foss/DocumentProperties.h"

workbook.GetDocumentProperties().SetCompany("Example Corp");
workbook.GetDocumentProperties().SetManager("Finance Team");

workbook.GetSettings().SetDate1904(false);

Эти значения проходят цикл сохранения и загрузки так же, как содержимое ячеек, что полезно для отчетов, которым требуется согласованная метаданные в сгенерированных файлах.


Быстрый старт

Aspose.Cells FOSS для C++ собирается из исходного кода с помощью CMake. Клонируйте репозиторий и либо добавьте его как подкаталог, либо подтяните его с помощью FetchContent:

git clone https://github.com/aspose-cells-foss/Aspose.Cells-FOSS-for-Cpp.git
cmake_minimum_required(VERSION 3.15)
project(MyProject CXX)
set(CMAKE_CXX_STANDARD 17)

add_subdirectory(path/to/Aspose.Cells-FOSS-for-Cpp)

add_executable(MyApp main.cpp)
target_link_libraries(MyApp PRIVATE Aspose.Cells.Foss.Cpp)

Минимальный пример управления электронными таблицами — создание, стилизация, сохранение и повторная загрузка:

#include "aspose/cells_foss/Workbook.h"
#include "aspose/cells_foss/Worksheet.h"
#include "aspose/cells_foss/Cell.h"

using namespace Aspose::Cells_FOSS;

int main() {
    Workbook workbook;
    Worksheet& sheet = workbook.GetWorksheets()[0];
    sheet.SetName("Expenses");

    Cells& cells = sheet.GetCells();
    cells["A1"].PutValue("Category");
    cells["B1"].PutValue("Amount");
    cells["A2"].PutValue("Travel");
    cells["B2"].PutValue(482.50);
    cells["A3"].PutValue("Supplies");
    cells["B3"].PutValue(129.99);
    cells["B4"].SetFormula("=SUM(B2:B3)");

    workbook.Save("expenses.xlsx");

    Workbook loaded("expenses.xlsx");
    Cells& loadedCells = loaded.GetWorksheets()["Expenses"].GetCells();
    double total = loadedCells["B4"].GetValue().AsDouble();

    return 0;
}

Поддерживаемые форматы

ФорматРасширениеЧтениеЗапись
Xlsx.xlsx✓✓

LoadFormat и SaveFormat оба предоставляют единственное значение Xlsx в этом выпуске; конструкторы Workbook(path) и Workbook(bytes) загружают входные данные .xlsx, а Workbook::Save() записывает выходные данные .xlsx в путь, поток или буфер в памяти.


Открытый исходный код и лицензирование

Aspose.Cells FOSS для C++ выпускается под лицензией MIT. Исходный код доступен на GitHub, и библиотеку можно использовать, модифицировать и распространять в коммерческих и открытых проектах без сборов за время выполнения.


Начало работы

Связанные ресурсы