HotXLS Docs

Рушій обчислень Excel

Огляд

HotXLS включає вбудований рушій для розбору та обчислення формул; цей рушій програмно обчислює формули комірок у вашому процесі, усуваючи необхідність викликати Excel або зовнішні контролери OLE для отримання обчислених значень книги

Виконання обчислень

Перед збереженням або експортом запустіть повний перерахунок книги за допомогою головного інтерфейсу книги

procedure Calculate;

Рушій підтримує стандартні родини математичних, датових, логічних, рядкових та статистичних функцій; він послідовно вирішує залежності комірок та відстежує ланцюжки посилань для запобігання циклічним посиланням

Контекстне обчислення формул

TXLSWorksheet і TXLSXWorksheet надають EvaluateFormulaAt для обчислення тексту формули у вибраному рядку та стовпці з нумерацією з одиниці, без запису тимчасової клітинки чи зміни стану обчислень робочої книги

Стилі посилань A1 і R1C1, локальні імена, структуровані посилання, залежності формул, корені масивів, типізовані значення помилок Excel, статус волатильності, явна авторизація зовнішніх посилань, скасування та стабільні категорії збоїв працюють через звичайний обчислювач робочої книги

CreateFormulaEvaluationTemplate один раз компілює незмінний якір і повторно використовує його для цільових клітинок; структуровані посилання A1, чутливі до цільового рядка, розв'язуються для кожного цільового контексту, а ліміти на виклик обмежують довжину формули, кроки елементів синтаксису, глибину рекурсії та обсяг згенерованих байтів масиву

Типи результатів, типові бюджети, правила часу життя та приклади для Delphi й C++Builder дивіться в розділі Контекстне обчислення формул

Оператори масивів

Оператори арифметики, порівняння, конкатенації, унарного мінуса та відсотка приймають як скалярні значення, так і обчислені масиви

Скаляр транслюється на кожен елемент, а масив з одного рядка або одного стовпця — на сумісний вимір; несумісні форми повертають #VALUE!

Помилки залишаються у своїх окремих результуючих клітинках, тому одне ділення на нуль або недійсний елемент не відкидає значення, обчислені для решти клітинок

COMBINA і PERMUTATIONA мають спільну семантику для скалярів і масивів із трансляцією: аргументи усікаються до невід'ємних цілих, а переповнення контролюється; MUNIT повертає компактну двовимірну одиничну матрицю типу Double

FormulaArrayMemoryLimit типово дорівнює 64 MiB і обмежує обсяг згенерованих матриць; MUNIT також перевіряє доступну область розливу (spill) аркуша, замість жорсткої фіксованої стелі розмірності

Перевірка наявності формули

ISFORMULA(reference) перевіряє належність формули, не обчислюючи клітинку, на яку посилається, тож формула залишається виявною, коли її кешований результат — помилка або порожній рядок

Прямокутний діапазон повертає логічний масив тієї ж форми; члени спільних формул і класичних чи XLSX формул масиву повертають true, тоді як клітинкою формули є лише якір динамічного розливу (spill)

Прямі значення та скалярні визначені імена повертають #VALUE!, недійсні посилання зберігають #REF!, а згенеровані логічні масиви обмежені FormulaArrayMemoryLimit

XLSX записує _xlfn.ISFORMULA та відновлює чисте ім'я при відкритті, ODS використовує стандартний синтаксис of:=ISFORMULA, а вивід класичного XLS відхиляє непідтримувану future-функцію до запису даних

Сучасні текстові функції

UNICHAR усікає числові вхідні дані в бік нуля та перетворює коректні скалярні значення Unicode у UTF-16, включно з сурогатними парами на виході для додаткових площин і всіх діапазонів приватного використання

Нуль і входи поза діапазоном повертають #VALUE!, а ізольовані сурогатні кодові позиції та Unicode noncharacters повертають #N/A; діапазони та згенеровані масиви на вході зберігають ці помилки поелементно

BAHTTEXT перетворює скінченні числа на текст у тайських батах і сатангах, округлює проміжні значення від нуля до двох десяткових знаків, зберігає знак мінуса, коли округлена величина стає нулем, і розгортає наукову нотацію без звуження через цілий тип

XLSX зберігає UNICHAR як _xlfn.UNICHAR і відновлює чисте ім'я при повторному відкритті; BAHTTEXT зберігає свою стандартну ідентичність функції та залишається «чистим» в формулах XLS і XLSX

Регресія та прогнозування

LINEST і LOGEST приймають один або кілька стовпців чи рядків предикторів і повертають коефіцієнти в порядку Excel, за якими слідує необов'язковий вільний член

Коли аргумент статистики дорівнює true, обидві функції повертають повний п'ятирядковий результат, що містить помилки коефіцієнтів, статистики наближення, F-статистику, ступені свободи, регресійну суму квадратів та залишкову суму квадратів

TREND і GROWTH використовують ту саму багатозмінну модель і зберігають форму рядків чи стовпців переданих нових значень предикторів

Перерахунок залежностей у класичному XLS

TXLSWorkbook.Recalculate будує граф залежностей формул при першому виклику та обчислює формули в порядку «спочатку прецеденти», а не в фізичному порядку клітинок

Наступні виклики повторно використовують граф і перераховують лише транзитивно залежні від змінених значень формули плюс волатильні формули; редагування формул, імена, структура аркушів та переписування посилань безпечно інвалідують і перебудовують граф

Циклічні посилання використовують класичні налаштування робочої книги EnableIteration, MaxIterations і MaxIterationChange, а UseFullPrecision=False застосовує точність відображення чисел до кешованих результатів і їхніх наступних обчислень

Залежності визначених імен

Інкрементне обчислення відстежує імена з областю робочої книги та областю аркуша крізь вкладені формули та посилання на кілька областей

Ациклічні формули імен дають точні залежності клітинок, тоді як рекурсивні цикли імен безпечно повертаються до волатильного перерахунку

Таблиці даних «що якщо»

Аркуші як класичного XLS, так і сучасного XLSX можуть створювати, обчислювати, читати, записувати, копіювати та структурно змінювати таблиці даних «що якщо» з однією або двома змінними

function AddDataTable(
  const AResultRange, ARowInputCell, AColumnInputCell: WideString
): TXLSDataTable;

Діапазон результату містить лише обчислені вихідні клітинки, тоді як формули та пробні значення використовують навколишні клітинки в тому самому макеті, що й Excel

  • Таблиця з введенням по стовпцю — залиште ARowInputCell порожнім, розмістіть вихідну формулу над кожним стовпцем результату, а пробні значення — ліворуч від рядків результату
  • Таблиця з введенням по рядку — залиште AColumnInputCell порожнім, розмістіть вихідну формулу ліворуч від кожного рядка результату, а пробні значення — над стовпцями результату
  • Таблиця з двома змінними — вкажіть обидві клітинки введення, розмістіть вихідну формулу над і ліворуч від діапазону результату, пробні значення введення по рядку — над результатами, а пробні значення введення по стовпцю — ліворуч
Sheet.Range['B1', 'B1'].Value := 0;
Sheet.Range['D1', 'D1'].Formula := '=B1*2+1';
Sheet.Range['C2', 'C2'].Value := 1;
Sheet.Range['C3', 'C3'].Value := 2;
Sheet.Range['C4', 'C4'].Value := 3;

Table := Sheet.AddDataTable('D2:D4', '', 'B1');
Workbook.Recalculate;

Цей приклад із введенням по стовпцю обчислює 3, 5 і 7 у D2:D4; кожне пробне значення застосовується через ізольований контекст обчислення, тож формули, які доходять до B1 опосередковано через інші клітинки з формулами, перераховуються правильно

AddDataTable повертає nil для недійсного діапазону, недійсного посилання введення або коли обидва посилання введення порожні; колекція DataTables аркуша відкриває отримане визначення та його прапори видалених клітинок введення

Видалення клітинки введення, на яку посилається таблиця, зберігає визначення таблиці та повертає #REF! для її виходів, що відповідає семантиці збереженої робочої книги

Функції, визначені користувачем

Розширте рушій формул спеціальною бізнес-логікою; зареєструйте власні функції за допомогою подій нижче

Небезпечні зовнішні та макро-імена відхиляються до запуску аргументів чи обробників, якщо робоча книга або окреме контекстне обчислення явно не увімкне AllowUnsafeFormulaCallbacks