Документація HotXLS

Метод 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;

Див. також