수식 토큰 및 사용자 함수
HotXLS는 두 통합 문서 엔진 모두에서 무손실 검사 및 보호된 다시 쓰기를 위한 호출자 소유 수식 토큰 스트림과 사용자 지정 계산을 위한 계층적 사용자 함수 레지스트리를 노출합니다
토큰 모델
TXLSFormulaTokenClass, TXLSFormulaTokenKind 및 TXLSFormulaTokenSource는 각 TXLSFormulaToken을 분류하고 구문 분석된 텍스트, 클래식 BIFF 바이트 또는 기타 지원되는 소스에서 왔는지 기록합니다
| TXLSFormulaToken | Kind, Opcode, BaseOpcode, TokenClass, RawBytes, TextValue, NumberValue, IntegerValue, ArgumentCount, FunctionIndex, ExternSheetIndex, Row1, Col1, Row2, Col2, Row1Relative, Col1Relative, Row2Relative, Col2Relative, ReferenceUsesOffsets, Supported, ArrayRows, ArrayCols, ArrayValueCount 및 ArrayValues |
| TXLSFormulaTokenStream | DecodeBiff, Clone, CloneSyntaxTree, BindContext, CanCompileFor, CanWriteBiffAt, ReplaceReference, Count, Items, Source, FormulaText, FullyDecoded, Rgce, RgbExtra, BiffWritable 및 BiffVersion |
| TXLSCompiledFormula | CreateTokenStream은 컴파일된 수식 토큰 스트림의 호출자 소유 복제본을 반환합니다 |
| TXLSFormula | ArrayFormulaMode, FormulaLocale, MaxRow, MaxCol, FuncNamebyPtg, FuncArgsCntByPtg, GetCompiled, GetCompiledPreservingUnknownNames, GetCompiledR1C1, GetTokenStream, GetTranslated, GetStoreData, GetStoreDataExt, CanStoreData, BindUserDefinedFunctions, GetTExpData, SetMode, IsKnownFunction, GetFunctionNames 및 FunctionArgumentClass |
두 워크북 엔진 모두 하나의 공유 TXLSFormula 인스턴스를 통해 수식을 컴파일하고 번역합니다. GetCompiled은 A1 스타일 텍스트를 구문 트리로 파싱하고, GetCompiledR1C1은 수식이 들어 있는 셀의 좌표를 기준으로 R1C1 참조를 해석하며, GetTranslated은 클래식 BIFF 바이트에서 트리를 다시 만들고, GetStoreData 계열은 토큰 바이트를 저장용으로 다시 씁니다. MaxRow와 MaxCol은 컴파일러가 받아들이는 참조 그리드의 한계입니다. XLSX 엔진은 이 값을 BIFF8 기본값에서 XLSX 그리드까지 올리고, BIFF8에 맞지 않는 참조에는 ptg 형태가 없으므로 BIFF8 writer는 인코딩 불가로 보고합니다
ArrayFormulaMode는 ARRAY 레코드(배열 수식)의 rgce를 쓰는 동안 켜지는 플래그입니다. 이 플래그가 켜지면 값 클래스 참조와 배열 상수가 Excel이 직접 쓰는 것처럼 배열 클래스(tAreaA / tArrayA)로 직렬화됩니다. 값 클래스 피연산자인 채로 두면 Excel은 이 배열 수식을 진짜 배열 수식으로 취급하지 않고 암시적 교차로 평가합니다. 그래서 엔진들은 ARRAY 레코드 자신의 rgce에 이 플래그를 켭니다
저장된 단순 리프에 대한 제한된 검사
TXLSCompiledFormula.ReadSimpleLeafInfo(ExpectedOwner, MaxBytes, MaxTextCharacters, AllowUnboundBiff)는 복제, 디컴파일, 평가, 토큰이나 배열의 구체화 없이 주 구문 트리와 보관된 토큰 스트림을 그 자리에서 검사합니다. AllowUnboundBiff 기본값은 False입니다
지원되는 형태는 절대 REF3D 또는 RANGE3D 리프 하나와 문자열 리터럴 하나이며, 스트림이 보관된 경우 정확히 하나의 일관된 토큰이어야 합니다. 수식식, 상대 또는 오프셋 참조, 배열, 외부 배열 데이터, 알 수 없는 토큰, 주 리프와 보관 리프의 불일치, 외부 바인딩 소유자는 캐시된 값이나 계산 상태를 바꾸지 않고 fslkUnsupported를 반환합니다
| TXLSFormulaSimpleLeafKind | fslkUnsupported, fslkRange, fslkLiteral 중 하나입니다. 다른 결과 필드를 쓰기 전에 Kind를 먼저 확인하세요 |
| TXLSFormulaLeafOwnerState | flosNoRetainedStream은 토큰 스트림 출처가 없음을, flosUnboundStream은 가져온 언바운드 BIFF를, flosSameOwner는 정확히 일치하는 바운드 소유자를 보고하고, flosForeignOwner는 다른 바운드 소유자를 거부합니다 |
| TXLSFormulaSimpleLeafInfo | 문자열이 없는 값 레코드로 Kind, OwnerState, RangeType, ExternId, FirstRow, FirstCol, LastRow, LastCol, TextCharacters, StoredTextCharacters, ReadBytes, SyntaxNodes, TokenCount를 담습니다 |
| Range coordinates and identity | 좌표는 0 기반입니다. ExternId는 BIFF 와이어 인덱스가 아니라 1 기반 논리 구문 트리 ID입니다. 호출자는 이를 고정된 통합 문서를 통해 해석하고 외부 통합 문서, 시트 범위 초과, 누락된 시트, 지원되는 캡처 범위를 벗어난 좌표는 거부해야 합니다 |
| Source costs | TextCharacters는 UTF-16 코드 단위로 셈 리터럴 출력 길이이며 범위면 0입니다. StoredTextCharacters는 보관된 소스 텍스트, 토큰 텍스트, 검사한 구문 텍스트를 합산합니다. ReadBytes는 이들의 2바이트 텍스트 비용과 보관된 원시 바이트 길이를, 별도 보관된 표현을 포함해 합산합니다. 이 카운터들은 총 힙 사용량이 아니라 제한된 검사 입력을 기술합니다 |
| Syntax and token counts | SyntaxNodes는 일반 컴파일 리프면 1이고 주 리프와 보관 리프를 모두 검사하면 2입니다. TokenCount는 스트림이 없으면 0, 지원되는 일관된 보관 스트림이 있으면 1입니다 |
| TXLSFormulaTokenStream.ReadSimpleLeafInfo | 하위 계층은 같은 소유자와 할당량, 선택적 ComparedLeaf, 선택적 ReferenceContext를 받고 스트림 자체의 비공개 구문, 토큰, 원시 바이트를 직접 검사합니다. ComparedLeaf는 주 리프 일관성 검사를 더하고, ReferenceContext는 복사 없이 직렬화된 텍스트 수식 extern 인덱스를 매핑합니다 |
| TXLSCompiledFormula.ReadSimpleLiteral | 같은 인수를 받아 리프 검사를 반복하고, 남은 바이트와 문자 할당량이 출력도 커버할 때만 호출자 소유 WideString을 반환합니다. 지원되지 않는 리프나 부족한 남은 용량은 EInvalidOperation을 발생시킵니다 |
ExpectedOwner는 소비하는 소스에 붙은 정확한 계산기여야 하고 검사와 리터럴 추출 내내 살아 있고 안정적이어야 합니다. 소유자가 없으면 EArgumentException, 음수 할당량은 EArgumentOutOfRangeException, 과도하게 큰 보관 소스 입력은 내용 비교나 출력 복사 전에 EInvalidOperation을 발생시킵니다
보관 스트림이 없는 일반 리프는 원래 소유자를 확정하지 않습니다. 언바운드로 가져온 스트림도 통합 문서 신원을 갖지 않으므로, AllowUnboundBiff=True를 명시하는 게 적절한 경우는 호출자가 이미 소스 계산기를 고정해 두고 셀을 읽기 전에 로컬 시트 신원을 검증할 때뿐입니다. 가져온 참조 검사는 현재 BIFF8 참조를 받아들이고 다른 BIFF5 extern 표현은 거부합니다
FFirstRowRel, FFirstColRel, FLastRowRel, FLastColRel이라는 이름의 레거시 구문 필드는 절대 좌표일 때 true입니다. 도우미는 독립적인 토큰 상대 플래그와 오프셋 표현도 함께 검사하므로, 소비자는 이런 역사적 이름에서 절대 좌표를 추론할 필요가 없습니다
구문 트리
CloneSyntaxTree는 구조 검사를 위해 TXLSSyntaxItem 노드로 이루어진 호출자 소유 파싱 트리를 반환합니다. 각 노드는 ItemType, 리터럴 페이로드(Value, IntValue, DecValue), 선행 Spaces, 트리 링크(Parent, Child, ChildCount), Range를 통한 TXLSRangeItem 참조 리프, 배열 상수 데이터(ArrayRows, ArrayCols, ArrayValueCount와 ArrayValues의 TXLSArraySerVal 항목)를 보고합니다. 트리는 분리된 복사본이므로 순회해도 통합 문서의 컴파일된 수식에는 전혀 영향을 주지 않으며, 변형 멤버(AddChild, PushChild, CopyObject, OffsetCopyReferences, AdjustForShift, 그리고 TXLSRangeItem.CopyObject / AdjustForShift)는 복제한 트리를 다시 컴파일하기 전에 재작성하는 도구를 위해 존재합니다
통합 문서 진입점
Tokens := Worksheet.ParseFormulaTokens('SUM(A1:A4)', 1, 1);
try
if Tokens.ReplaceReference(OldRef, NewRef) then
Worksheet.SetFormulaTokens(1, 1, Tokens);
finally
Tokens.Free;
end;
ParseFormulaTokens, GetFormulaTokens, FormulaTokensToText 및 SetFormulaTokens은 소유권을 명시적으로 유지하고 셀이 변경되기 전에 컨텍스트, BIFF 버전, 토큰 지원, 배열 소유권 및 참조 범위를 검증합니다
사용자 함수 레지스트리
TXLSUserFunctionResolver 및 TXLSUserFunctionRegistry는 RegisterHandler, UnregisterHandler, Clear, Contains, TryGetHandler 및 Count를 통해 이름별 조회를 제공합니다
Workbook.RegisterUserFunction('NETMARGIN', CalculateNetMargin);
Workbook.RegisterGlobalUserFunction('FISCALYEAR', CalculateFiscalYear);
try
Workbook.Calculate;
finally
Workbook.UnregisterUserFunction('NETMARGIN');
Workbook.UnregisterGlobalUserFunction('FISCALYEAR');
end;
IXLSWorkbook, TXLSWorkbook 및 TXLSXWorkbook은 RegisterUserFunction, UnregisterUserFunction, ClearUserFunctions, RegisteredUserFunctionCount, RegisterGlobalUserFunction, UnregisterGlobalUserFunction, ClearGlobalUserFunctions 및 RegisteredGlobalUserFunctionCount를 노출합니다
동등한 유닛 수준 진입점은 XLSRegisterGlobalUserFunction, XLSUnregisterGlobalUserFunction, XLSClearGlobalUserFunctions, XLSRegisteredGlobalUserFunctionCount 및 XLSGlobalUserFunctionRegistered입니다
TXLSCalculator.OnUserFunctionResolve는 레거시 이벤트 대체보다 먼저 참여하며, 레지스트리 핸들러는 레지스트리 잠금 외부에서 호출되므로 핸들러가 안전하게 자체 등록을 해제할 수 있습니다
위험한 외부·매크로 스타일 함수 이름은 인자 평가와 핸들러 조회 전에 차단됩니다. 통합 문서 또는 개별 컨텍스트 평가에 AllowUnsafeFormulaCallbacks를 명시적으로 활성화한 경우는 예외이고, 일반적인 사용자 함수 이름은 기본적으로 계속 사용할 수 있습니다
수식 진단
TXLSXFormulaIssueKind, TXLSXFormulaLocation 및 TXLSXFormulaIssue는 누락된 함수, 외부 참조 및 순환 종속성 구성 요소에 대해 TXLSXWorkbook.AnalyzeFormulaIssues에서 반환됩니다
매크로 시트 검사
TXLSSheetKind은 TXLSWorksheet.SheetKind를 통해 워크시트, 매크로 시트, 차트 시트, VBA 모듈 및 알 수 없는 시트 레코드를 구분합니다. TXLSMacroRisk, TXLSMacroCommandInfo 및 TXLSMacroCommandArray는 TXLSWorksheet.ScanMacroCommands의 형식화된 결과를 설명합니다
병합된 자동 맞춤 및 정렬 형식
TXLSMergedAutoFitStrategy 및 TXLSXMergedAutoFitStrategy는 병합된 범위에 대해 처음, 마지막 또는 균형 확장을 선택하며, TXLSSortOrientation, TXLSSortFormulaMode 및 TXLSSortCompareEvent는 세로 또는 가로 안정 정렬과 수식 이동을 제어합니다