Это аналог Excel (без графического интерфейса). Реализует упрощенную логику работы отдельного листа электронных таблиц. Позволяет хранить данные (текст и формулы) в ячейках, вычислять значения ячеек. Формулы могут содержать числа и ссылки на другие ячейки в качестве операндов. Поддерживаются операции: сложение, вычитание, умножение, деление и унарный минус. Кроме того, поддерживается печать таблицы в поток вывода. При парсинге формул проверяются циклические зависимости. При вычислении значений используется кэш. Для синтаксического разбора формул используется библиотека ANTLR.
Ячейка таблицы определяется ее индексом, то есть строкой вида "A1", "C14" или "RD2". Более того, ячейка с индексом "A1" - это ячейка в левом верхнем углу таблицы. Количество строк и столбцов в таблице не превышает 16384. То есть предельным положением ячейки является (16383, 16383) с индексом XFD16384. Если позиция ячейки выходит за эти границы, то она недопустима по определению.
Метод bool IsValid() структуры Position проверяет позицию на валидность.
Структура Positions в файле common.h. Он содержит поля row и col - номера строк и столбцов ячейки в представлении программы. Используется для доступа к ячейкам.
Функции для преобразования индекса в строку Position::fromString() и из строки Position::toString().
void SetCell(Position pos, std::string text)устанавливает содержимое ячейки по индексу позиции.const CellInterface* GetCell(Position pos) constиCellInterface* GetCell(Position pos)возвращают указатель на ячейку по позиции. Если ячейка пуста, возвращается значение nullptr.void ClearCell(Position pos)очищает ячейку по индексу (размер минимальной печатной области может изменяться).
Печать происходит по минимальной печатной области с вершиной в ячейке A1, содержащей все непустые ячейки.
Структура размеров определена в файле common.h. Он содержит количество строк и столбцов в минимальной области, доступной для печати.
void PrintTexts(std::ostream& output) - печатает текст ячеек в поток вывода по минимальной печатной области. void PrintValues(std::ostream& output) - печатает значения ячеек в поток вывода по минимальной печатной области. Получить размеры минимальной печатной области можно с помощью метода Size GetPrintableSize() const.
auto sheet = CreateSheet();
sheet->SetCell("A1"_pos, "=A4");
sheet->SetCell("A4"_pos, "27");
sheet->SetCell("C5"_pos, "=B3");
sheet->SetCell("B3"_pos, "Ready");
auto a1 = sheet->GetCell({0, 0});
std::cout << "A1 value = " << a1->GetValue() << std::endl; // A1 value = 27
std::cout << "A1 text = " << a1->GetText() << std::endl; // A1 text = =A4
sheet->PrintTexts(std::cout);
sheet->PrintValues(std::cout);результат
A1 value = 27
A1 text = =A4
=A4
Ready
27
=B3Для сборки программы необходим C++, поддерживающий стандарт C++17 и выше, Cmake не ниже версии 3.8, ANTLR4. ANTLR написан на Java, поэтому для его работы вам понадобится комплект разработки JDK. Вы также можете использовать OpenJDK. Установите JDK в свою систему. Инструкцию по установке ANTLR можно найти на сайте antlr.org. Более подробные рекомендации представлены в руководстве Getting Started.
- Для компиляции этого кода понадобится библиотека
ANTLR4 C++ Runtime. Скачайте архивantlr4-cpp-runtime*.zipиз разделаDownloadна сайте antlr.org.- Создайте папку
buildдля сборки программы- Повторите следующую структуру проекта:
Spreadsheet/
├── antlr4_runtime/
│ └── Содержимое архива antlr4-cpp-runtime*.zip.
├── build/
├── antlr-4.13.0-complete.jar
├── CMakeLists.txt
├── FindANTLR.cmake
├── Formula.g4
├── Остальные файлы проекта
└── ...
- Откройте консоль в папке
buildи введите в консоли :cmake ..,- с нужными парамеетрами- Введите команду :
makeилиmake -j<кол-во ядер процессора>для ускорения процесса сборки- В папке
buildпоявится исполняемый файлspreadsheet(spreadsheet.exeдля Windows)