Dokumentacja HotXLS / Dokumentacja API

Automatyczne providery zapytań

Dostępne od wersji 2.384.99 poprzez fasadę skoroszytu XLSX w Windows; automatyczny wybór providera następuje wyłącznie podczas jawnego odświeżenia zapytania

Odświeżanie istniejącego zapytania

Workbook.QueryProviders.BaseDirectory := 'C:\Data';
Workbook.QueryProviders.MaxInputBytes := 64 * 1024 * 1024;
Workbook.QueryProviders.MaxResultCells := 2000000;
Workbook.QueryProviders.TimeoutSeconds := 30;
Status := Sheet.RefreshQueryTable('ImportedData', 1000000);

TXLSXWorkbook.QueryProviders: TXLSQueryProviderDispatcher udostępnia dispatcher należący do skoroszytu, pochodzący z lxQueryProviders; nie zwalniaj tego dispatchera samodzielnie

TXLSXWorksheet.RefreshQueryTable(const AName: WideString; AMaxRows: Integer = 1000000; AOnProgress: TXLSQueryRefreshProgress = nil): Integer oraz przeciążenie przyjmujące numerowane od zera AIndex wybierają istniejące zapytanie i korzystają z tego dispatchera

Istniejące przeciążenia przyjmujące jawny TXLSQueryTableProvider dalej używają tego providera bezpośrednio, łącznie z dotychczasowym odrzucaniem brakującego providera; nie przechodzą one na automatyczny dispatch

Odświeżenie zwraca 1 po sukcesie, 0 po anulowaniu albo -1 po błędzie, z kodami diagnostycznymi 1401 i 1400 pod xlsOperationRefresh; istniejące transakcyjne stosowanie wyników, walidacja schematu, literały tekstowe i zachowanie formatowania pozostają w mocy

Te wpisy diagnostyczne nazywają się xlsDiagnosticQueryRefreshCancelled i xlsDiagnosticQueryRefreshFailed; przejęcie strażnika zapisu skoroszytu następuje przed konwersją statusu, więc zamrożony widok odczytu lub inne odrzucenie przez strażnika zapisu kończy się wyjątkiem

Otwieranie i zapisywanie skoroszytu nigdy nie pobiera danych połączeń, nie wykonuje zapytań ani nie działa na zachowanych metadanych RefreshOnLoad; przed zapisaniem wyniku odśwież jawnie każde wymagane zapytanie

Wbudowane providery

BaseDirectory stanowi podstawę wyłącznie dla względnych lokalnych ścieżek tekstowych; connection stringi baz danych i adresy URL sieci Web pozostają jawnymi metadanymi połączenia

Nieokreślone kodowanie tekstu akceptuje wyłącznie wejście ASCII, chyba że obsługiwany BOM wskazuje kodowanie; wejście spoza ASCII wymaga jawnego obsługiwanego kodowania albo BOM

Dla tekstowego połączenia rozdzielanego ustaw TextPrompt = False, TextDelimited = True i dokładnie jeden separator, bez scalania kolejnych separatorów; nowo utworzone połączenia domyślnie pytają o parametry i używają separatora tabulacji, więc przy wyborze innego separatora wyczyść TextTab

Tekst o stałej szerokości

Ustaw TextPrompt = False i TextDelimited = False, a następnie dodawaj TextFields w ściśle rosnącej kolejności pozycji Position numerowanych od zera, począwszy od zera; każde pole kończy się na następnej pozycji albo na fizycznym terminatorze rekordu, a xltiftSkip wyklucza swoje pole z wyniku

Pozycje liczą zdekodowane jednostki kodu UTF-16, a nie bajty wejścia; granica przecinająca parę surrogate jest odrzucana, a CRLF, LF i CR kończą rekordy niezależnie od ustawień separatora i kwalifikatora

Dopełnienie pól jest obcinane przed konwersją, łącznie z jawnie typowanym tekstem, co odpowiada zweryfikowanemu natywnemu zachowaniu importu o stałej szerokości; cudzysłowy, tabulatory i znaki separatora wewnątrz pola pozostają literałami wejścia, a krótkie rekordy dostarczają puste pola końcowe bez zmiany zadeklarowanego schematu

Bez TextFields każdy rekord to jedno pole ogólne; TextFirstRow wybiera pierwszy rekord schematu, Query.Headers pomija wartości tego rekordu, a jawne puste rekordy pozostają wierszami

Obowiązują istniejące limity wierszy, bajtów wejścia, komórek wyniku i pól liczących 32767 jednostek kodu; nieprawidłowe metadane, błędy konwersji lub nadmierne wejście czyszczą dane etapowane przed transakcyjną aktualizacją arkusza, a anulowanie zachowuje poprzednie komórki wyniku

Connection.TextPrompt := False;
Connection.TextDelimited := False;
Connection.TextFields.Add(xltiftGeneral, 0);
Connection.TextFields.Add(xltiftText, 8);
Status := Sheet.RefreshQueryTable('Imported');

Dla połączenia Web ustaw WebHtmlTables = True i WebHtmlFormat = 'none'; obsługiwane żądania odrzucają osadzone poświadczenia, fragmenty, uwierzytelnianie i przekierowania

Wbudowane providery odrzucają nieobsługiwane metadane w swoich rodzajach połączeń; odświeżanie baz danych odrzuca polecenia OLAP lub serwerowe, pośrednictwo plików połączeń, zapisane hasła i monity o poświadczenia, odświeżanie Text odrzuca monity o plik, a odświeżanie Web wymaga anonimowych metadanych tabeli

Typowane parametry bazy danych

Polecenia tekstowe SQL obsługują pozycyjne znaczniki ? wiązane przez ADO Command, w kolejności Connection.Parameters; wartości parametrów nigdy nie zastępują tekstu SQL, a nazwy etykietują wiązania bez zmiany kolejności pozycyjnej

Kontrola wstępna zlicza znaczniki poza pojedynczymi cudzysłowami, identyfikatorami w podwójnych cudzysłowach lub odwróconych apostrofach, identyfikatorami w nawiasach kwadratowych, komentarzami liniowymi i zagnieżdżonymi komentarzami blokowymi, łącznie z podwojonymi escapami cudzysłowów i nawiasów; niedomknięte cudzysłowy lub komentarze oraz niezgodna liczba znaczników odrzucają żądanie przed otwarciem połączenia

Użyj ParameterType = 'value' z jawnym ValueKind o wartości xlcpvInteger, xlcpvDouble, xlcpvBoolean lub xlcpvString oraz z odpowiadającą mu właściwością wartości; zero, False i puste ciągi są wartościami, a xlcpvNone nie powoduje wnioskowania wartości podczas wykonania

Connection.CommandType := 2;
Connection.CommandText := 'SELECT Amount FROM Sales WHERE Amount > ?';
with Connection.Parameters.Add do
begin
  Name := 'MinimumAmount';
  ParameterType := 'value';
  ValueKind := xlcpvInteger;
  IntegerValue := 0;
  SqlType := 4;
end;
Status := Sheet.RefreshQueryTable('SalesQuery');

Użyj ParameterType = 'cell', ValueKind = xlcpvCell i CellReference dla w pełni kwalifikowanego odwołania do lokalnego arkusza, takiego jak Inputs!$A$1 czy 'Sales Input'!B2; nazwy arkuszy w cudzysłowach używają podwójnych apostrofów, a zakresy, skoroszyty zewnętrzne, nazwy i niekwalifikowane odwołania do komórek są odrzucane

Odświeżanie arkusza tworzy migawkę zapisanych wartości skalarów i dostępnych pamięci podręcznych formuł bez przeliczania ani materializacji spakowanych komórek; brakujące pamięci podręczne formuł i komórki błędów są odrzucane, a brakująca lub pusta komórka dostarcza SQL null tylko przy jawnym obsługiwanym typie SQL

Migawka komórki zachowuje swój typ Variant, co pozwala na wejścia Int64 ze znakiem, Currency, typowane daty i null bez redukowania ich do trwałych pól literałów 32-bitowych całkowitych lub Double; bezpośrednio zapisane literały dat, null i Int64 wykraczają poza natywny model metadanych parametrów, więc dla takich wartości użyj typowanych wiązań komórkowych

SqlType używa kodów typów SQL z ODBC, jawnie mapowanych na typy ADO; nie jest to wartość ADO DataTypeEnum

Kody typów SQLAkceptowane wartości i kontrakt wiązania
0Wnioskowanie z jawnego rodzaju literału lub oryginalnego Variantu komórki: liczba całkowita, Int64 ze znakiem, Single, Double, Currency, Boolean, data albo ciąg Unicode; null wymaga jawnego typu SQL
4, 5, -5INTEGER, SMALLINT i BIGINT, z dokładnymi wartościami liczbowymi całkowitymi i walidacją docelowego zakresu ze znakiem
7, 8, 6REAL, DOUBLE i FLOAT; wyłącznie wejścia liczbowe, z bezstratną konwersją całkowite–zmiennoprzecinkowe i dokładną konwersją Single dla REAL
-7BIT akceptuje wartości Boolean bez koercji liczbowej czy tekstowej
-8, -9, -10Unicode CHAR, VARCHAR i LONGVARCHAR zachowują ciągi UTF-16, łącznie z pustymi
1, 12, -1Nieunikodowe CHAR, VARCHAR i LONGVARCHAR akceptują wyłącznie ciągi ASCII; dla innych znaków użyj typu Unicode
91, 92, 93, lub starsze 9, 10, 11DATE, TIME i TIMESTAMP akceptują typowane Varianty dat bez parsowania tekstu ani zgadywania epoki Excela; DATE odrzuca składnik czasu, a TIME wymaga wartości od zera włącznie do jedności wyłącznie

Obsługiwane jawne typy akceptują również SQL null; tablice, Varianty referencyjne, błędy, liczby nieskończone, nieobsługiwane typy SQL i konwersje gubiące precyzję całkowitą są odrzucane, a NUMERIC lub DECIMAL wymagają metadanych precyzji i skali, których to API wiązania nie dostarcza

ADO otrzymuje typowaną wartość i zadeklarowany rozmiar, z przydzieloną co najmniej jedną jednostką kodu dla pustego tekstu; natywne sterowniki pozostają odpowiedzialne za dialekt SQL, obsługiwane typy parametrów i konwersje wyników, więc zainstalowany provider może nadal odrzucić poprawne wiązanie albo mieć węższe możliwości liczbowe czy datowe

Jet i ACE używają typowanych wiązań OLE DATE dla zwalidowanych wartości DATE, TIME i TIMESTAMP, aby zachować datę i czas niezależnie od zależnych od ustawień regionalnych projekcji tekstu znacznika czasu; reguły walidacji DATE i TIME nadal obowiązują, a możliwości projekcji null pozostają specyficzne dla providera

Parametry wymagają polecenia tekstowego SQL i są ograniczone do 1024 na pobranie, 255 jednostek kodu na nazwę i 32767 jednostek kodu na wartość tekstową; tekst polecenia, odwołania do parametrów, nazwy i ładunki także zużywają budżet bajtów wejścia

Monity i nieznane atrybuty rozszerzeń parametrów są odrzucane; RefreshOnChange pozostaje zachowanymi metadanymi i nie wyzwala odświeżania w tle, a otwieranie czy zapisywanie nie rozwiązuje komórek ani nie wykonuje poleceń

Bezpośrednie Fetch obsługuje literały; FetchWithCellResolver(Connection, Query, MaxRows, out Data, var Abort, AResolver) przyjmuje callback TXLSQueryParameterCellResolver dla wartości komórek, którego wynik Boolean wskazuje, czy zapisana wartość jest dostępna

Callback jest ograniczony do wywołania i nie jest zachowywany; automatyczne odświeżanie arkusza dostarcza własny lokalny resolver, a zarejestrowane niestandardowe providery nadal mają pierwszeństwo i definiują semantykę swoich parametrów

Odświeżanie Web obsługuje zwykłe tabele text/html bez komórek rozpinanych, zagnieżdżonych wybranych tabel ani treści napędzanych skryptami; nieobsługiwane układy i encje są odrzucane zamiast produkować częściowe dane

Rejestracja niestandardowego providera

Workbook.QueryProviders.RegisterProvider(xlckWeb, CustomProvider);
try
  Status := Sheet.RefreshQueryTable('RemoteData');
finally
  Workbook.QueryProviders.RegisterProvider(xlckWeb, nil);
end;

TXLSQueryProviderDispatcher.Create buduje niezależnie posiadany dispatcher do bezpośredniego użycia; skoroszyt tworzy i posiada własną instancję

RegisterProvider(AKind: TXLSConnectionKind; AProvider: TXLSQueryTableProvider) instaluje pożyczony handler dla zadeklarowanego rodzaju połączenia, a nil go wyrejestrowuje; handler musi istnieć dłużej niż rejestracja

Zarejestrowany handler ma pierwszeństwo przed wbudowanym providerem i może obsługiwać uwierzytelnianie albo rodzaje połączeń specyficzne dla aplikacji; zmiany rejestracji, zmiany konfiguracji i rekurencyjny dispatch są odrzucane w trakcie pobierania, a nieprawidłowe wartości enum przed dostępem do tablicy

Fetch(Connection, Query, MaxRows, out Data, var Abort) otrzymuje odłączone metadane podczas odświeżania arkusza i zwraca prostokątne TXLSQueryResultData; anulowanie lub wyjątki czyszczą etapowane wyniki przed ich propagacją

Limity zasobów

MaxInputBytes domyślnie wynosi 67108864 bajtów i ogranicza wejście tekstowe lub Web oraz obsługiwane ładunki wyników baz danych; MaxResultCells domyślnie wynosi 2000000 komórek i ogranicza prostokątny wynik

TimeoutSeconds domyślnie wynosi 30 i konfiguruje obsługiwane natywne fazy bazodanowe lub HTTP; nie jest to gwarantowany deadline dla całej operacji ani dla niestandardowego providera

Wszystkie trzy ustawienia i MaxRows muszą być dodatnie, a timeout musi mieścić się w natywnej liczbie całkowitej milisekund; dispatcher odrzuca nadmiarowe wiersze, kolumny lub komórki bez ucinania, podczas gdy limity bajtów i wejścia są egzekwowane przez wbudowane providery i pozostają odpowiedzialnością zarejestrowanego handlera przy niestandardowych pobraniach

Odświeżanie arkusza waliduje wszystkie wartości wyniku i przywraca komórki oraz metadane zapytania lub tabeli po anulowaniu albo błędach aplikacji; niestandardowe providery pozostają odpowiedzialne za respektowanie własnych limitów operacji zewnętrznych

Natywne wiązania wyników XLSX

Zapytania bazodanowe oparte na tabeli korzystają z relacji tabela–tabela zapytania, spójnych identyfikatorów pól, tożsamości kolumn i ukrytej lokalnej nazwy docelowej; samodzielne obsługiwane cele Text i Web zachowują swój zakres wyniku

TXLSXTable.ColumnUniqueNames[Index]: WideString ujawnia natywne tożsamości kolumn numerowane od zera, zachowując je przy przypisaniu, kopiowaniu i ponownym otwarciu razem z ColumnQueryTableFieldIds

Starsze połączenie Text związane bezpośrednio jako tabela zewnętrzna nie jest obsługiwanym natywnym kształtem eksportu, a zapis odrzuca go przed wyjściem; jawnie odświeżone wartości tekstowe mogą wypełnić zwykłą tabelę, albo zainstalowany sterownik tekstowy ADO/ODBC może dostarczyć natywne zapytanie bazodanowe oparte na tabeli

Niezwiązane lub nieobsługiwane zaimportowane relacje i rozszerzenia XML pozostają zachowane; ta funkcja nie konwertuje nieprzejrzystych zewnętrznych grafów na obsługiwane odświeżalne zapytania

Zobacz API połączeń i transakcyjnych zapytań, aby poznać walidację celów, callbacki postępu i otaczający model metadanych