클래식 XLS와 XLSX는 호출자가 셀을 변경하기 전에 수식 입력을 분류하기 위한 동일한 부작용 없는 계약을 노출합니다
공유 정책
TXLSFormulaEmptyStringMode =
(xlfesmClearCell, xlfesmPreserveString);
TXLSFormulaUnknownSymbolMode =
(xlfusmReject, xlfusmPreserve);
TXLSFormulaEntryPolicy = record
EmptyStringMode: TXLSFormulaEmptyStringMode;
UnknownFunctionMode: TXLSFormulaUnknownSymbolMode;
UnknownNameMode: TXLSFormulaUnknownSymbolMode;
end;
property FormulaEntryPolicy: TXLSFormulaEntryPolicy;
클래식 IXLSWorkbook 와 TXLSWorkbook 는 TXLSXWorkbook와 함께 이 속성을 노출합니다. XLSDefaultFormulaEntryPolicy 는 빈 입력을 지우고 알 수 없는 함수와 알 수 없는 정의된 이름을 거부합니다
통합 문서 속성은 값으로 복사되고 할당 시 원자적으로 유효성이 검사되므로, 지원되지 않는 열거형 값은 이전 정책을 변경하지 않고 EArgumentOutOfRangeException 을 발생시킵니다
유효성 검사 결과
function ValidateFormulaEntry(Row, Col: Integer;
const Formula: WideString): TXLSFormulaEntryValidationResult;
TXLSFormulaEntryValidationResult = record
Issue: TXLSFormulaEntryIssue;
Action: TXLSFormulaEntryAction;
Symbol: WideString;
end;
Issue 는 오류 없음, 알 수 없는 함수, 알 수 없는 이름, 구문 오류, 대상 형식 제한, 잘못된 대상 좌표를 구별합니다
Action 은 셀 지우기, 문자열 저장, 수식 저장 또는 거부를 선택하고, 알 수 없는 함수나 이름이 인식된 경우 Symbol 이 이를 식별합니다
빈 텍스트와 수식
정확히 빈 입력은 xlfeaClearCell 에 따라 xlfeaStoreString 또는 EmptyStringMode
빈 문자열을 반환하는 수식, 가령 =""처럼 빈 문자열을 반환하는 수식은 수식으로 유지되며, 대상 형식이 이를 표현할 수 있으면 xlfeaStoreFormula 를 반환합니다
수식 텍스트는 앞의 등호를 포함하거나 생략할 수 있습니다
이제 일반적인 클래식 XLS 또는 XLSX 셀 Value 속성을 통해 정확히 빈 문자열을 할당하면 이 모드가 직접 적용됩니다. 기본값은 기존 값이나 수식을 제거하고, xlfesmPreserveString 은 셀 내용을 길이가 0인 상수 문자열로 대체합니다
Null 과 Unassigned 는 두 모드 모두에서 항상 셀을 지우는 반면, ="" 와 같은 실제 수식은 독립적으로 저장되거나 계산된 빈 문자열 결과를 가진 수식으로 유지됩니다
XLSX 문자열 및 Variant 행 또는 열 작성기는 지워진 구멍을 구체화하지 않고 동일한 규칙을 적용하며, 남은 값이 그곳에서 표현 가능한 한 압축 저장소를 유지합니다
네이티브 XLS, XLSX, ODS 판독기와 XLS에서 XLSX로, XLSX에서 XLS로의 변환기는 저장된 값을 신뢰할 수 있는 입력으로 취급하므로, 대상 통합 문서가 기본 사용자 입력 정책을 유지하더라도 파일 수준의 상수 빈 문자열은 그대로 유지됩니다
알 수 없는 기호와 대상 형식
통합 문서 로컬 또는 프로세스 전체에 등록된 사용자 함수와 할당된 OnUserFunction 또는 OnUserFunctionEx 콜백은 처리기를 호출하지 않고도 유효성 검사 중에 알려진 것으로 간주되며, 등록되지 않은 호출은 함수 이름을 Symbol
엄격 모드는 알 수 없는 함수나 이름에 대해 xlfeaReject 를 반환합니다. 일반적인 셀 Formula 속성을 통한 할당은 값, 수식 캐시 또는 종속성을 변경하기 전에 거부합니다
보존 모드는 진단을 유지하고 일반적인 셀 API를 통해 수식을 저장합니다. 클래식 XLS는 BIFF 추가 기능 사용자 함수 토큰을 통해 알 수 없는 호출을 직렬화하고, 저장, 다시 열기, XLS/XLSX 변환 과정에서 알 수 없는 이름 텍스트를 유지합니다
클래식 XLS는 또한 BIFF 작성기를 통해 알려진 수식을 컴파일하고, 식을 표현할 수 없을 때 xlfeiTargetFormatUnsupported 를 반환합니다. XLSX는 자체 수식 모델이 지원하는 알려진 최신 수식 함수를 허용합니다
XLSX 유효성 검사는 LAMBDA, 어휘적 LET 호출 가능 요소, 람다를 참조하는 정의된 이름, 보고서 자리 표시자, 등록된 외부 통합 문서 링크, 그리고 중첩 형태와 현재 행 형태를 포함하는 유효한 한정 또는 비한정 구조적 참조를 인식합니다
호환 모드는 확인되지 않은 외부 구조적 참조를 나중 처리를 위해 유지할 수도 있지만, 엄격 모드는 여전히 확인되지 않은 테이블 이름을 거부합니다
계산 및 대량 감사
람다 및 사용자 함수 디스패치 후에도 처리되지 않은 채 보존된 알 수 없는 함수 또는 보존된 알 수 없는 이름은 코드 $1D, 즉 Excel의 #NAME? 오류인 Variant 오류로 평가됩니다. 동일한 형식화된 오류는 종속 수식과 컨텍스트 기반 평가를 통해 전파됩니다
구현되지 않은 알려진 내장 함수는 알 수 없는 호출과 구별된 상태로 유지됩니다. 한편, 통합 문서 로컬 또는 프로세스 전체 사용자 함수의 등록, 교체, 제거, 지우기와 정의된 이름 수식의 변경은 오래된 종속성 및 계산 상태를 무효화합니다
function AuditFormulaSymbols: TXLSFormulaSymbolIssues; overload;
function AuditFormulaSymbols(
out AStats: TXLSFormulaSymbolAuditStats):
TXLSFormulaSymbolIssues; overload;
TXLSFormulaSymbolIssueKind = (xlfsiUnknownFunction, xlfsiUnknownName,
xlfsiSyntaxError);
TXLSFormulaSymbolLocationKind = (xlfslCell, xlfslDefinedName);
TXLSFormulaSymbolIssue = record
Kind: TXLSFormulaSymbolIssueKind;
LocationKind: TXLSFormulaSymbolLocationKind;
Sheet: Integer;
Row: Integer;
Col: Integer;
DefinedNameIndex: Integer;
DefinedName: WideString;
Formula: WideString;
Symbol: WideString;
end;
TXLSWorkbook and TXLSXWorkbook 도 동일한 벌크 감사(audit) 오버로드를 제공합니다. 각 문제는 알 수 없는 함수, 알 수 없는 이름 또는 구문 오류를 식별하며, 여기에 워크시트 셀 위치(LocationKind = xlfslCell와LocationKind = xlfslDefinedName는 동일한 대량 감사 오버로드를 제공합니다. 각 문제는 워크시트 셀 위치 또는 정의된 이름 위치, 원본 수식, 확인되지 않은 기호와 함께 알 수 없는 함수, 알 수 없는 이름 또는 구문 오류를 식별합니다
감사는 텍스트를 검사하는 대신 구문 분석된 수식 트리나 저장된 BIFF 토큰을 순회하므로 문자열 내부의 함수 같은 텍스트는 보고되지 않습니다. XLSX 컴파일은 확인된 수식 텍스트, 워크시트, 로캘, 정의된 이름 세대, 사용자 함수 레지스트리 세대, 콜백 가용성을 키로 하는 작업 로컬 캐시를 사용합니다
EntryCount 는 감사된 수식을 보고하고, UniqueFormulaCount 는 독립적으로 컴파일되거나 검사된 수식을 보고하며, CacheHitCount 는 작업 캐시가 처리한 반복 항목을 보고합니다
워크시트 변경 없음
유효성 검사는 셀을 만들거나 편집하지 않고, 캐시된 값을 변경하지 않고, 종속성 그래프를 업데이트하지 않고, 통합 문서를 변경됨으로 표시하지 않고, 등록된 사용자 함수 처리기를 호출하지 않습니다
직접 유효성 검사는 변경 없이 유지됩니다. 일반적인 수식 할당은 내부적으로 동일한 결정을 적용하고, 유효성 검사와 대상 형식 준비가 성공한 후에만 커밋합니다
Delphi 예제
Policy := Workbook.FormulaEntryPolicy;
Policy.UnknownFunctionMode := xlfusmReject;
Policy.UnknownNameMode := xlfusmReject;
Workbook.FormulaEntryPolicy := Policy;
Validation := Sheet.ValidateFormulaEntry(4, 2, FormulaText);
if Validation.Action = xlfeaStoreFormula then
Sheet.Cells[4, 2].Formula := FormulaText;
Issues := Workbook.AuditFormulaSymbols(Stats);
for I := 0 to High(Issues) do
if Issues[I].Kind = xlfsiUnknownFunction then
LogUnknownSymbol(Issues[I].Symbol);참고 항목