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
| Pole | Znaczenie |
|---|---|
SheetIndex / SheetName | Tożsamość arkusza lokalna dla widoku |
Row / Col | Współrzędne komórki numerowane od jedynki |
StyleIndex | Zapisany indeks klasycznego XF lub indeks formatu komórki XLSX |
Kind | Klasyfikacja: tekst, liczba, data-czas, wartość logiczna, formuła, błąd lub pusta komórka |
Value | Zapisana wartość skalarna lub wartość pamięci podręcznej formuły bez ponownego obliczania |
HasFormulaCache / FormulaCache | Obecność 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 |
FormulaEvaluation | A 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 |
Formula | Puste 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;