Введение
Управление электронными таблицами — это часть 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, и библиотеку можно использовать, модифицировать и распространять в коммерческих и открытых проектах без сборов за время выполнения.