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