Метод CreateReadOnlyView
Створює легке подання лише для читання над завантаженою моделлю книги класичного XLS або XLSX
Синтаксис
function CreateReadOnlyView: IXLSReadOnlyWorkbookView;
CreateReadOnlyView оголошено класичним IXLSWorkbook у lxHandle та XLSX IXLSXWorkbookOwner у lxHandleX; спільний інтерфейс подання, параметри та типи знімків оголошено у lxStandard
Стан і час життя подання
Створення подання займає сталий час і не обходить аркуші, комірки, стилі, імена чи малюнки
Кожне подання має власний ActiveSheetIndex з нумерацією від одиниці, тож кілька подань можуть обирати різні аркуші, не змінюючи класичний ActiveSheetIndex та XLSX ActiveIndex, IsSelected і ActiveTab
Поки подання існує, воно утримує оренду читання, а зміни книги негайно завершуються збоєм EXLSWorkbookWriteGuardUnavailable до зміни моделі
Під час використання подань утримуйте книги класичного XLS через IXLSWorkbook, а книги XLSX — через IXLSXWorkbookOwner; інтерфейс власника та кожне подання утримують ту саму книгу з підрахунком посилань і можуть звільнятися в будь-якому порядку
Не викликайте Free у конкретного TXLSWorkbook чи TXLSXWorkbook, поки інтерфейс власника або подання ще посилаються на нього
Знімки комірок
TryReadCell використовує координати рядка та стовпця з нумерацією від одиниці на активному аркуші подання й повертає False лише тоді, коли за цією координатою немає збереженої комірки
Читання відсутньої комірки не створює сховище і не збільшує покоління книги
TXLSReadOnlyCellSnapshot володіє ім'ям аркуша, значенням, текстом формули, відомостями кешу та обчислення, координатами, видом та індексом стилю й ніколи не розкриває доступний для запису об'єкт книги
| Поле | Значення |
|---|---|
SheetIndex / SheetName | Ідентичність аркуша в межах подання |
Row / Col | Координати комірки з нумерацією від одиниці |
StyleIndex | Збережений індекс класичного XF або індекс формату комірки XLSX |
Kind | Класифікація: текст, число, дата-час, логічне значення, формула, помилка чи порожня комірка |
Value | Збережене скалярне значення або значення кешу формули без перерахунку |
HasFormulaCache / FormulaCache | Наявність кешу формули, його походження, вид значення та власне кешоване значення |
FormulaEvaluation | Чи було обчислення незастосовним, незапитуваним, виконаним чи таким, що завершився збоєм, а також код результату обчислювача та власне значення результату |
Formula | Порожньо типово та заповнюється лише за явного увімкнення тексту формули |
Політика формул
Типово комірки з формулами використовують наявний збережений кеш і ніколи не обчислюють, не викликають користувацьку функцію, не оновлюють стан зміненості та не записують кеш назад до книги
Додайте xlsvIncludeFormulaText до Options, коли потрібен текст формули; класичний рушій за потреби створює приватний для подання декодер, а XLSX копіює свій збережений рядок формули, і жоден із шляхів не ініціалізує та не змінює калькулятор книги
Формула без завантаженого чи обчисленого кешу повідомляє HasFormulaCache=False і залишає Value рівним Unassigned
Додайте xlsvEvaluateFormulas, щоб обчислювати формули через приватні для подання калькулятор, стан рекурсії, скалярний кеш, кеш матриць масивів і кеш скомпільованих формул XLSX; отримані Value та FormulaEvaluation.Value ніколи не заміщують збережений кеш книги й поля часу виконання скомпільованих формул
Стандартні помилки електронних таблиць повертаються як помилкові значення Variant з xlfesCalculated, а збої обчислення непідтримуваних чи внутрішніх випадків повідомляють xlfesFailed і утримують початковий збережений кеш у FormulaCache
Повторні читання через одне подання повторно використовують його приватний кеш обчислень для покоління оренди, тоді як різні подання залишаються незалежними й можуть обчислювати одну й ту саму спільну формулу паралельно
Обчислення зовнішніх формул XLSX читає лише локальний для файлу кеш externalLink і ніколи не розіменовує слабку реєстрацію активної книги та не виконує зовнішній ввід-вивід
Потоки та продуктивність
Використовуйте одне подання на робочий потік; окремі подання можуть сканувати різні аркуші або обчислювати одну й ту саму формулу паралельно, але викличний код не повинен змінювати активний аркуш чи параметри одного подання з іншого потоку
Після створення звичайні читання комірок не входять до монітора чи критичної секції, оскільки оренда запобігає паралельній зміні книги
Перевірка випуску утримує кожне бездіяльне подання нижче 64 КіБ сталого стану, сто бездіяльних подань — нижче 8 МіБ, а створення подання — незалежним від розміру книги з межею p95 в одну мілісекунду на моделі з мільйоном комірок
Набір тестів продуктивності також обмежує вплив бездіяльного подання на наявні однопоточні сканування курсором п'ятьма відсотками та вимагає, щоб вісім подань, які сканують незалежні аркуші, досягали щонайменше п'ятикратної пропускної здатності одного подання на перевірному вузлі
Приклад
var
Workbook: IXLSWorkbook;
View: IXLSReadOnlyWorkbookView;
Cell: TXLSReadOnlyCellSnapshot;
begin
Workbook := TXLSWorkbook.Create;
Workbook.Sheets.Add;
Workbook.Sheets[1].Cells[1, 1].Value := 'ready';
View := Workbook.CreateReadOnlyView;
View.Options := [xlsvEvaluateFormulas];
if View.TryReadCell(1, 1, Cell) then
Memo1.Lines.Add(VarToStr(Cell.Value));
end;
Для XLSX утримуйте конкретну книгу через її інтерфейс власника перед створенням подань
var
Owner: IXLSXWorkbookOwner;
Workbook: TXLSXWorkbook;
View: IXLSReadOnlyWorkbookView;
begin
Workbook := TXLSXWorkbook.Create;
Owner := Workbook;
Workbook.Sheets.Add('Data').Cells[1, 1].Value := 42;
View := Owner.CreateReadOnlyView;
end;