Dokumentacja HotXLS

Metoda CreateReadOnlyView

Tworzy lekki widok tylko do odczytu nad załadowanym modelem skoroszytu klasycznego XLS lub XLSX

Składnia

function CreateReadOnlyView: IXLSReadOnlyWorkbookView;

CreateReadOnlyView jest deklarowane przez klasyczny IXLSWorkbook w lxHandle oraz XLSX IXLSXWorkbookOwner w lxHandleX; wspólny interfejs widoku, opcje i typy migawek są zadeklarowane w lxStandard

Stan i czas życia widoku

Utworzenie widoku zajmuje stały czas i nie przechodzi przez arkusze, komórki, style, nazwy ani rysunki

Każdy widok ma własny ActiveSheetIndexnumerowany od jedynki, dzięki czemu kilka widoków może wybierać różne arkusze bez zmieniania klasycznego ActiveSheetIndex oraz XLSX ActiveIndex, IsSelectedi ActiveTab

Dopóki widok istnieje, utrzymuje dzierżawę odczytu, a modyfikacje skoroszytu natychmiast kończą się błędem EXLSWorkbookWriteGuardUnavailable przed zmianą modelu

Przy używaniu widoków utrzymuj skoroszyty klasyczne przez IXLSWorkbook , a skoroszyty XLSX przez IXLSXWorkbookOwner ; interfejs właściciela i każdy widok utrzymują wtedy ten sam skoroszyt z licznikiem odwołań i mogą być zwalniane w dowolnej kolejności

Nie wywołuj Free na konkretnym TXLSWorkbook lub TXLSXWorkbook , dopóki interfejs właściciela lub widok nadal się do niego odwołują

Migawki komórek

TryReadCell używa współrzędnych wiersza i kolumny numerowanych od jedynki na aktywnym arkuszu widoku i zwraca False tylko wtedy, gdy pod tą współrzędną nie istnieje zapisana komórka

Odczyt brakującej komórki nie tworzy magazynu ani nie zwiększa generacji skoroszytu

TXLSReadOnlyCellSnapshot jest właścicielem swojej nazwy arkusza, wartości, tekstu formuły, informacji o pamięci podręcznej i obliczeniu, współrzędnych, rodzaju i indeksu stylu oraz nigdy nie ujawnia zapisywalnego obiektu skoroszytu

PoleZnaczenie
SheetIndex / SheetNameTożsamość arkusza lokalna dla widoku
Row / ColWspółrzędne komórki numerowane od jedynki
StyleIndexZapisany indeks klasycznego XF lub indeks formatu komórki XLSX
KindKlasyfikacja: tekst, liczba, data-czas, wartość logiczna, formuła, błąd lub pusta komórka
ValueZapisana wartość skalarna lub wartość pamięci podręcznej formuły bez ponownego obliczania
HasFormulaCache / FormulaCacheObecność pamięci podręcznej formuły, jej pochodzenie, rodzaj wartości i należąca do migawki wartość z pamięci podręcznejTXLSFormulaCacheState), value kind (TXLSFormulaCacheValueKind), and owned cached value
FormulaEvaluationA TXLSFormulaEvaluationInfo record whose TXLSFormulaEvaluationState Czy obliczanie było niepodlegające zastosowaniu, niewymagane, wykonane czy zakończone błędem, a także kod wyniku ewaluatora i należąca do migawki wartość wyniku
FormulaPuste domyślnie, wypełniane tylko wtedy, gdy tekst formuły jest jawnie włączony

Polityka formuł

Domyślnie komórki z formułami używają istniejącej zapisanej pamięci podręcznej i nigdy nie obliczają, nie wywołują funkcji użytkownika, nie aktualizują stanu zmienności ani nie zapisują pamięci podręcznej z powrotem do skoroszytu

Add xlsvIncludeFormulaText Dodaj Options do TXLSReadOnlyViewOptions = set of TXLSReadOnlyViewOption, gdy wymagany jest tekst formuły; klasyczny silnik tworzy na żądanie prywatny dla widoku dekoder, a XLSX kopiuje swój zapisany ciąg formuły i żadna z tych ścieżek nie inicjalizuje ani nie modyfikuje kalkulatora skoroszytu

Formuła bez załadowanej lub obliczonej pamięci podręcznej zgłasza HasFormulaCache=False i pozostawia Value jako Unassigned

Dodaj xlsvEvaluateFormulas , aby obliczać formuły przez prywatne dla widoku kalkulator, stan rekurencji, pamięć podręczną skalarów, pamięć podręczną macierzy tablic i pamięć podręczną skompilowanych formuł XLSX; powstałe Value i FormulaEvaluation.Value nigdy nie zastępują zapisanej pamięci podręcznej skoroszytu ani pól czasu wykonania skompilowanych formuł

Standardowe błędy arkuszy kalkulacyjnych są zwracane jako wartości błędów Variant z xlfesCalculated, natomiast nieobsługiwane lub wewnętrzne niepowodzenia obliczania zgłaszają xlfesFailed i zachowują pierwotną zapisaną pamięć podręczną w FormulaCache

Powtarzane odczyty przez jeden widok ponownie używają jego prywatnej pamięci podręcznej obliczeń dla generacji dzierżawy, podczas gdy różne widoki pozostają niezależne i mogą równolegle obliczać tę samą współdzieloną formułę

Obliczanie formuł zewnętrznych XLSX czyta wyłącznie pamięć podręczną externalLink lokalną dla pliku i nigdy nie dereferencjuje słabej rejestracji aktywnego skoroszytu ani nie wykonuje zewnętrznego wejścia-wyjścia

Wątki i wydajność

Używaj jednego widoku na wątek roboczy; osobne widoki mogą skanować różne arkusze lub równolegle obliczać tę samą formułę, natomiast wywołujący nie mogą modyfikować aktywnego arkusza ani opcji jednego widoku z innego wątku

Po utworzeniu zwykłe odczyty komórek nie wchodzą do monitora ani sekcji krytycznej, ponieważ dzierżawa zapobiega równoległej modyfikacji skoroszytu

Walidacja wydania utrzymuje każdy bezczynny widok poniżej 64 KiB stanu stałego, sto bezczynnych widoków poniżej 8 MiB, a tworzenie widoku niezależnym od rozmiaru skoroszytu z progiem p95 wynoszącym jedną milisekundę na modelu o milionie komórek

Zestaw testów wydajności ogranicza również wpływ bezczynnego widoku na istniejące jednowątkowe skanowania kursorem do pięciu procent i wymaga, aby osiem widoków skanujących niezależne arkusze osiągnęło co najmniej pięciokrotność przepustowości pojedynczego widoku na maszynie walidacyjnej

Przykład

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;

Dla XLSX utrzymuj konkretny skoroszyt przez jego interfejs właściciela przed tworzeniem widoków

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;

Zobacz także