Документация 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Наличие кэша формулы, его происхождение, вид значения и собственное кэшированное значениеTXLSFormulaCacheState), value kind (TXLSFormulaCacheValueKind), and owned cached value
FormulaEvaluationA TXLSFormulaEvaluationInfo record whose TXLSFormulaEvaluationState Было ли вычисление неприменимым, незапрошенным, выполненным или завершившимся сбоем, а также код результата вычислителя и собственное значение результата
FormulaПусто по умолчанию и заполняется только при явном включении текста формулы

Политика формул

По умолчанию ячейки с формулами используют существующий сохранённый кэш и никогда не вычисляют, не вызывают пользовательскую функцию, не обновляют состояние изменённости и не записывают кэш обратно в книгу

Add xlsvIncludeFormulaText Добавьте Options в TXLSReadOnlyViewOptions = set of TXLSReadOnlyViewOption, когда требуется текст формулы; классический движок по требованию создаёт закрытый для представления декодер, а 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;

См. также