Изчислителен механизъм на Excel
Общ преглед
HotXLS включва вграден механизъм за анализ и изчисляване на формули; този механизъм оценява формулите на клетките програмно във вашия процес, елиминирайки необходимостта да извиквате Excel или външни OLE контролери за разрешаване на изчислените стойности на работната книга
Изпълнение на изчислението
Преди запис или експорт задействайте пълно преизчисляване на работната книга чрез главния интерфейс на работната книга
procedure Calculate;
Механизмът поддържа стандартните семейства функции — математически, за дати, логически, низови и статистически; той последователно разрешава зависимости на клетки и следва вериги от препратки, за да предотврати циклични препратки
Контекстно изчисляване на формули
TXLSWorksheet и TXLSXWorksheet разкриват EvaluateFormulaAt, с който текстът на формула се изчислява в избрани ред и колона с номерация от 1, без да се записва временна клетка и без да се променя състоянието на изчисленията на работната книга
A1 и R1C1 стилове на препратки, локални имена, структурни препратки, зависимости на формули, корени на масиви, типизирани Excel стойности за грешка, volatile статус, изрично разрешаване на външни препратки, отменяне и стабилни категории неуспех споделят нормалния evaluator на работната книга
CreateFormulaEvaluationTemplate компилира неизменим anchor само веднъж и го преизползва за множество целеви клетки; структурните A1 препратки, чувствителни към целевия ред, се разрешават за всеки целеви контекст, а ограниченията на извикване ограничават дължината на формулата, стъпките по синтактични елементи, дълбочината на рекурсията и байтовете на генерираните масиви
Вижте Контекстно изчисляване на формули за типовете резултати, стандартните бюджети, правилата за живот и примери за Delphi и C++Builder
Масивни оператори
Аритметичните, сравнителните и конкатениращите оператори, унарното отрицание и процентът приемат както изчислени масиви, така и скаларни стойности
Скаларът се разпространява (broadcast) върху всеки елемент, а масив с един ред или една колона се разпространява върху съвместимо измерение; несъвместимите форми връщат #VALUE!
Грешките се запазват в съответните им резултатни клетки, така че едно деление на нула или невалиден елемент не отхвърля стойностите, изчислени за останалите клетки
COMBINA и PERMUTATIONA споделят скаларна и broadcast-масивна семантика с отрязани неотрицателни целочислени аргументи и проверявано препълване, а MUNIT връща компактна двумерна единична матрица от тип Double
FormulaArrayMemoryLimit е 64 MiB по подразбиране и ограничава данните на генерираните матрици; MUNIT допълнително валидира оставащата spill зона на листа, вместо да налага фиксиран таван за размерността
Проверка за наличие на формула
ISFORMULA(reference) проверява притежанието на формула, без да изчислява цитираната клетка, така че формулата остава откриваема, дори когато кешираният ѝ резултат е грешка или празен низ
Правоъгълен диапазон връща булев масив със същата форма; членовете на споделени формули и на класически или XLSX масивни формули връщат true, докато при dynamic spill само anchor-ът е клетка с формула
Директните стойности и скаларните дефинирани имена връщат #VALUE!, невалидните препратки запазват #REF!, а генерираните булеви масиви са ограничени от FormulaArrayMemoryLimit
XLSX записва _xlfn.ISFORMULA и възстановява чистото име при отваряне, ODS използва стандартния синтаксис of:=ISFORMULA, а Classic XLS изходът отхвърля неподдържаната future функция, преди да запише данните
Съвременни текстови функции
UNICHAR отрязва числовите входове към нула и преобразува валидните Unicode скаларни стойности в UTF-16, включително surrogate двойки за supplementary полетата и всички private-use диапазони
Нулевите и извъндиапазонните входове връщат #VALUE!, докато изолирани surrogate кодови точки и Unicode noncharacters връщат #N/A; диапазонните и генерираните масивни входове запазват тези грешки поотделно за всеки елемент
BAHTTEXT преобразува крайни числа в текст на тайландски бат и сатанг, закръгля средните стойности в посока далеч от нулата с два знака след десетичната запетая, запазва отрицателния знак, когато закръглената величина стане нула, и разгъва научната нотация без свиване през целочислен тип
XLSX записва UNICHAR като _xlfn.UNICHAR и възстановява чистото име при повторно отваряне; BAHTTEXT използва стандартната си функционална идентичност и остава без префикс във формулите за XLS и XLSX
Регресия и прогнозиране
LINEST и LOGEST приемат една или повече колони или редове с предиктори и връщат коефициентите в реда на Excel, последвани от незадължителния свободен член
Когато аргументът за статистика е true, двете функции връщат пълния петредов резултат, съдържащ грешки на коефициентите, статистики на напасването, F статистика, степени на свобода, регресионна сума на квадратите и остатъчна сума на квадратите
TREND и GROWTH използват същия многопроменлив модел и запазват формата на ред или колона на подадените нови стойности на предикторите
Преизчисляване на зависимости в класически XLS
TXLSWorkbook.Recalculate изгражда граф на зависимостите на формулите при първото си извикване и изчислява формулите в ред „прецедентите първо“, а не в физическия ред на клетките
Последващите извиквания преизползват графа и преизчисляват само транзитивните зависими на променените стойности плюс volatile формулите; редакциите на формули, имената, структурата на листовете и пренаписването на препратки безопасно инвалидат и възстановяват графа
Цикличните препратки използват класическите настройки на работната книга EnableIteration, MaxIterations и MaxIterationChange, а UseFullPrecision=False прилага точността на показваните числа към кешираните резултати и произтичащите от тях изчисления
Зависимости от дефинирани имена
Инкременталното изчисление следва имена с обхват на работната книга и на листа през вложени формули и multi-area препратки
Ацикличните формули на имена внасят точните си клетъчни зависимости, докато рекурсивните цикли на имена се обработват с безопасен Fallback към volatile преизчисляване
What-If таблици с данни
Както класическите XLS, така и съвременните XLSX листове могат да създават, изчисляват, четат, записват, копират и структурно променят What-If таблици с данни с една или две променливи
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! за нейните изходи, в съответствие със семантиката на записаната работна книга
Потребителски функции
Разширявайте механизъма за формули с персонализирана бизнес логика; регистрирайте своите собствени функции чрез събитията по-долу
Опасни външни имена и имена в macro стил се отхвърлят, преди аргументите или обработчиците да се изпълнят, освен ако работната книга или отделното контекстно изчисляване изрично не разреши AllowUnsafeFormulaCallbacks
- Събитие OnUserFunction — Обработка на основни потребителски функции
- Събитие OnUserFunctionEx — Разрешаване на сложни функции с параметри на диапазон от клетки
- Callback на потребителска функция — Изисквания към сигнатурата на външните обработчици