HotXLS évalue les critères dAutoFilter déjà stockés dans un fichier XLSX sans démarrer Excel. Depuis la v2.384.136, TXLSXWorksheet.PreviewAutoFilterRows, ApplyAutoFilter et AutoFilterRowVisible exécutent les listes de valeurs, les groupes de dates, les filtres Top/Bottom-n et pourcentages, les filtres de dates relatives et de moyenne, les filtres de couleur de remplissage et de police et les filtres dicônes de mise en forme conditionnelle, sous une date de référence figée et des limites de ressources explicites
Le déclencheur habituel est un classeur quune personne a filtré dans Excel et un serveur qui doit agir dessus. Quelquun règle "Top 10 par chiffre daffaires", "Ce mois-ci" sur la date de commande et un remplissage rouge sur les lignes en retard, sauvegarde, et téléverse le fichier. Votre service Delphi a maintenant besoin de lensemble de lignes quExcel montrerait : pour le compter, lexporter, ou réécrire le fichier avec les bonnes lignes cachées. Le fichier ne détient que la définition. Avant cette version, HotXLS savait évaluer des critères personnalisés ordinaires, mais les espèces avancées restaient dans le XML stocké sans rien qui les exécute, donc la réponse honnête était "ouvrez-le dans Excel"
Quest-ce que HotXLS exécute réellement depuis un AutoFilter enregistré ?
HotXLS exécute une espèce de filtre par colonne, prise de lélément filterColumn quExcel a écrit, et combine les colonnes avec AND, exactement comme les listes déroulantes Excel. Les éléments viennent du groupe AutoFilter dECMA-376 Part 1 §18.3.2, et chacun correspond à un chemin dévaluation distinct :
filtersavec des enfantsfilteretdateGroupItem: une liste de valeurs cochées, une entrée vide optionnelle et des groupes de dates calendaires de lannée à la seconde, reliés par ORcustomFilters: un ou deux critères de comparaison joints par AND ou OR, le chemin qui existait déjàtop10: Top ou Bottom de n éléments, ou n pour cent, avecvallimité à 1-500 éléments ou 1-100 pour centdynamicFilter: aujourdhui, hier, demain, cette/semaine dernière/prochaine, mois, trimestre et année, année en cours, M1-M12, Q1-Q4, au-dessus et en dessous de la moyennecolorFiltereticonFilter: couleur effective de remplissage ou de police résolue au travers du style différentiel, et icônes de mise en forme conditionnelle par jeu dicônes et identifiant dicône à base zéro
Tout ce qui est hors de cette liste échoue avec EXLSXAutoFilterUnsupported au lieu de produire un ensemble de lignes deviné. Cela inclut les types au-dessus et en dessous de lécart type de ST_DynamicFilterType, les valeurs calendarType non grégoriennes, les éléments dextension inconnus, les références dxfId non résolues et une colonne qui porterait dune manière ou dune autre deux espèces de filtres à la fois. Un moteur de filtres qui renvoie en silence des lignes "assez proches" est pire quun qui refuse, parce que personne ne sen aperçoit avant quun rapport parte avec les mauvais clients dedans
Prévisualiser dabord, appliquer ensuite
HotXLS scinde le travail en une prévisualisation en lecture seule et une application transactionnelle, et les deux prennent le même enregistrement TXLSXAutoFilterExecutionOptions. PreviewAutoFilterRows renvoie le nombre de lignes de données correspondantes et ne touche jamais à la visibilité des lignes. ApplyAutoFilter(AResetVisible, Options) prépare chaque décision de ligne dabord et publie ensuite seulement le nouvel ensemble de lignes cachées en une étape, si bien quune exception pendant la préparation laisse la feuille exactement comme elle était
var
Book: TXLSXWorkbook;
Sheet: TXLSXWorksheet;
Options: TXLSXAutoFilterExecutionOptions;
Matching: Integer;
begin
Book := TXLSXWorkbook.Create;
try
Book.Open('orders-filtered-by-sales.xlsx');
Sheet := Book.Sheets[1]; // lindexeur Sheets part de 1
// Partez toujours des défauts, puis changez des champs isolés
Options := XLSDefaultAutoFilterExecutionOptions;
Options.ReferenceDate := EncodeDate(2026, 10, 19);
Matching := Sheet.PreviewAutoFilterRows(nil, Options); // comptage seul
WriteLn('Rows Excel would show: ', Matching);
// True : les lignes correspondantes redeviennent visibles même cachées avant
Sheet.ApplyAutoFilter(True, Options);
Book.SaveAs('orders-applied.xlsx');
finally
Book.Free;
end;
end;
Initialisez lenregistrement avec XLSDefaultAutoFilterExecutionOptions à chaque fois. La fonction remplit lenregistrement de zéros puis règle chaque limite, et le contexte dexécution rejette avec EXLSXAutoFilterLimit un enregistrement dont les limites ne sont pas toutes positives. Un enregistrement déclaré sur la pile et rempli champ par champ portera dordinaire des ordures ou des zéros dans les champs que vous avez oubliés. Les surcharges sans paramètre (ApplyAutoFilter(True), PreviewAutoFilterRows(Callback), AutoFilterRowVisible(Row)) emploient les mêmes défauts, avec la date courante comme référence
Le drapeau AResetVisible décide du sort des lignes qui passent le filtre mais étaient déjà cachées. True rend chaque ligne correspondante visible, ce quExcel fait quand vous réappliquez. False garde les cachements manuels antérieurs sur les lignes correspondantes et najoute des cachements que pour les lignes qui échouent. Les lignes hors de la plage AutoFilter gardent leur état dans les deux cas. Si le classeur a changé entre préparation et publication, ApplyAutoFilter lève plutôt que de publier des décisions calculées depuis des données périmées
Pourquoi les listes de valeurs ignorent-elles astérisques et points dinterrogation ?
Les entrées de liste de valeurs dans un élément filters sont des tokens daffichage littéraux, si bien que HotXLS compare * et ? comme des caractères ordinaires. Une entrée cochée A* dans la liste déroulante signifie que la cellule montre exactement A*, pas "commence par A". Les wildcards appartiennent à customFilters, où "commence par" et "contient" sont réellement des motifs, et ceux-ci gardent les règles séparées couvertes dans comment HotXLS apparie les critères wildcard Excel et les échappements tilde. Mélanger les deux sémantiques est la façon la plus rapide de filtrer une colonne de références pièces en absurde
La comparaison porte sur la valeur affichée, ce qui soulève la question de quel affichage. HotXLS formate la cellule avec son format de nombre de base, y compris les surcharges de style stockées, et ignore délibérément un format de nombre que la mise en forme conditionnelle applique par-dessus. Les contrôles Excel natifs de la fixture HotXLS montrent pourquoi le token compte : le numérique 1 et le texte "1" correspondent tous deux à une sélection de 1, un numérique 1 formaté en 0.0 correspond à la place à 1.0 avec le texte "1.0", et le texte "01" reste distinct des deux. Un texte ressemblant à une date nest jamais analysé en date, si bien quune cellule texte tenant "2026-10-19" ne tombera pas dans un groupe de dates
Comment les filtres Top 10, moyenne et dates dynamiques décident-ils ?
HotXLS calcule les seuils de classement et de moyenne une fois sur toute la colonne source, pas sur les lignes quun autre filtre a laissées visibles. Seuls les nombres finis entrent dans la population, ce qui veut dire quun texte dapparence numérique tel que "100" est exclu, et la population est collectée avant toute décision de ligne. Dans le classeur de contrôles natif, un filtre au-dessus de la moyenne garde une moyenne de 27 sur toute la colonne même après quune seconde colonne cache la valeur 50 ; il ne bascule pas vers la moyenne de 21,25 des lignes restantes
Les égalités sont incluses au seuil, comme dans Excel. Un filtre Top 3 sur des valeurs avec deux entrées à égalité à 20 sélectionne quatre lignes. Le mode pourcentage prend la part tronquée de la population numérique, avec un plancher dun élément, si bien quun Top 50 pour cent de cinq valeurs sélectionne deux valeurs avec un seuil de 30. Les variantes Bottom reflètent la comparaison. Ces nombres viennent des ensembles de lignes dExcel lui-même enregistrés dans les fixtures de test HotXLS, pas de la lecture de la spécification, qui est muette sur la plupart
Les dates dynamiques ont besoin dune date de référence figée
TXLSXAutoFilterExecutionOptions.ReferenceDate fige le sens de "aujourdhui" pour une opération entière. Les filtres relatifs tels que cette semaine ou le trimestre dernier, et les règles de dates de mise en forme conditionnelle qui alimentent les filtres de couleur, sont tous évalués contre cette seule date, si bien quune prévisualisation à 23:59:59 et une application une seconde plus tard saccordent. Une valeur zéro sélectionne la date courante une fois quand lopération démarre ; les valeurs séries respectent le système de dates 1900 ou 1904 du classeur, y compris la série fictive 60 dExcel dans le système 1900 pour les filtres M2 et Q1
Les fenêtres sont des intervalles calendaires semi-ouverts : cette semaine court du dimanche au dimanche suivant, ce trimestre du premier jour du trimestre au premier jour du suivant, et lannée en cours du 1er janvier jusquà la fin du jour de référence. Épinglez ReferenceDate explicitement dans tout ce qui tourne en lot ou en test. Un travail nocturne qui franchit minuit, ou un test unitaire écrit en octobre qui doit passer en janvier, produira sinon des ensembles de lignes qui diffèrent sans raison visible
Les cellules de formules sont filtrées sur leurs valeurs en cache. Le moteur de filtres ne recalcule pas le classeur en silence, si bien quun fichier sauvegardé par un rédacteur qui na laissé aucun résultat en cache a besoin dune passe de calcul explicite avant que le filtre voie des nombres ou des dates qui veulent dire quelque chose
Quelles couleurs un filtre de couleur voit-il ?
Un filtre de couleur HotXLS voit la couleur effective du formatage direct de cellule plus toute surcharge de mise en forme conditionnelle correspondante, et rien de ce qui vient seulement dun style de table. Excel se comporte pareil : une ligne à bandes peinte bleu clair par un style de table intégré nest pas "bleu clair" pour la liste déroulante du filtre. Dans les contrôles natifs, une cellule peinte en rouge par la mise en forme conditionnelle est sélectionnée par un filtre de remplissage rouge, tandis quune cellule formatée rouge directement mais surchargée par une règle jaune active est exclue
Trois raffinements sont arrivés dans des versions de suivi. La version 2.384.138 traite les remplissages à dégradé linéaire et path comme distincts à la fois des couleurs unies et de labsence de remplissage, si bien quun dégradé ne correspond jamais à un critère de couleur unie même quand un de ses arrêts porte exactement cette couleur. La version 2.384.140 a ajouté le filtrage de couleur de police pour le texte enrichi, où une cellule correspond si une exécution non vide porte la couleur RGB, automatique ou héritée demandée. La version 2.384.150 a complété les décisions de texte enrichi conditionnel, qui se sont révélées être la chose étrange
Excel natif peut réutiliser une décision de couleur entre une cellule de texte enrichi et une cellule simple avec le même texte, le même style de base et le même chemin de règle conditionnelle correspondante, si bien que lensemble de lignes visibles peut dépendre de lordre de ces cellules. HotXLS le reproduit en préparant la plage de données complète en ordre de lignes croissant, même quand vous ne demandez quune ligne à AutoFilterRowVisible. Inspecter la ligne 40 coûte donc une passe sur la plage, mais inspection de ligne, prévisualisation et application renvoient toujours la même réponse pour la même ligne
Chaque ressource a une limite, et quoi intercepter
HotXLS borne chaque espèce de travail dans une opération AutoFilter avec son propre champ dans TXLSXAutoFilterExecutionOptions, parce quun classeur filtré venu dun formulaire de téléversement est une entrée non fiable. Les défauts sont 1048576 pour MaxXmlCharacters, 16384 pour MaxXmlNodes, 4096 pour MaxFilterItems, 4000000 pour MaxExaminedCells, 1000000 chacun pour MaxEffectiveFormatCells et MaxPopulationValues, 67108864 octets pour MaxContextBytes et 16000000 pour MaxConditionalSteps. MaxContextBytes mesure létat logique retenu et les enveloppes temporaires réservées, pas la mémoire du processus
type
TFilterJob = class
public
Deadline: TDateTime;
VisibleRows: TList<Integer>;
procedure HandleRow(Sender: TObject; SheetIndex, Row: Integer;
Visible: Boolean; var Cancel: Boolean);
procedure HandleWork(Sender: TObject; ACompleted: Int64;
var ACancel: Boolean);
end;
procedure TFilterJob.HandleRow(Sender: TObject; SheetIndex, Row: Integer;
Visible: Boolean; var Cancel: Boolean);
begin
// Appelé pour chaque ligne de données ; Visible est la décision du filtre
if Visible then
VisibleRows.Add(Row);
end;
procedure TFilterJob.HandleWork(Sender: TObject; ACompleted: Int64;
var ACancel: Boolean);
begin
// ACompleted compte les cellules examinées et peut rester plat pendant le formatage
ACancel := Now > Deadline;
end;
Le callback de ligne de PreviewAutoFilterRows reçoit chaque ligne de données avec sa décision, pas seulement les correspondantes, et la fonction renvoie quand même le compte de correspondances. Régler son paramètre Cancel arrête la visite tôt sans exception. OnWork est le crochet dannulation : régler ACancel à True lève EXLSXAutoFilterCancelled. Pendant que lopération prépare les décisions, elle détient un bail de lecture sur le classeur, si bien quaucun callback ne peut modifier ce classeur
Options := XLSDefaultAutoFilterExecutionOptions;
Options.ReferenceDate := Date;
Options.MaxExaminedCells := 500000; // plafond plus serré pour les fichiers téléversés
Options.OnWork := Job.HandleWork;
try
Sheet.PreviewAutoFilterRows(Job.HandleRow, Options);
Sheet.ApplyAutoFilter(True, Options);
except
on E: EXLSXAutoFilterUnsupported do
Log('Filter needs Excel: ' + E.Message);
on E: EXLSXAutoFilterLimit do
Log('Filter exceeded a budget: ' + E.Message);
on E: EXLSXAutoFilterCancelled do
Log('Filter cancelled at deadline');
on E: EXLSXAutoFilterExecution do
Log('Filter state invalid: ' + E.Message);
end;
Les trois exceptions spécifiques dérivent de EXLSXAutoFilterExecution, qui couvre elle-même les états invalides comme une date de référence hors du calendrier pris en charge ou un classeur qui a changé avant publication, donc gardez la classe de base en dernier. Dans chaque cas, la visibilité des lignes de la feuille est inchangée, ce qui fait de "journaliser, sauter, signaler le fichier pour revue manuelle" une politique par défaut sûre
Où sont les frontières
La couverture est large, mais quelques bords valent la peine dêtre connus avant de promettre la parité à un client :
- Les filtres dynamiques décart type sont rejetés tant quune politique vérifiée nexiste pas, même si lénumération a des valeurs pour eux
- Les fenêtres de semaine démarrent le dimanche ; les classeurs qui comptent sur un autre début de semaine ne sont pas modélisés
- Les résultats de formules viennent du cache stocké seulement, sans recalcul à lintérieur de lappel de filtre
- Les couleurs de style de table ne correspondent jamais à un filtre de couleur, par conception et en accord avec Excel
- Une structure de texte enrichi inconnue ou des métadonnées de couleur inconnues échouent explicitement, tandis que les propriétés non couleur connues telles que la famille de police ne bloquent pas une correspondance de couleur
- La façade XLS et son stockage BIFF8 sont un chemin séparé, couvert dans comment HotXLS écrit les critères DOPER AutoFilter BIFF8
Si vous décidez encore comment les définitions AutoFilter, la validation de données et les tables se rapportent dans un classeur que vous générez vous-même, commencez par la validation de données, lAutoFilter et les tables HotXLS en Delphi, qui couvre SetAutoFilter, les identifiants de colonnes et quand un filtre prend réellement effet
FAQ
PreviewAutoFilterRows change-t-il les lignes cachées ?
Non. PreviewAutoFilterRows évalue seulement les critères stockés et rapporte les décisions par sa valeur de retour et son callback optionnel. Seul ApplyAutoFilter publie un nouvel ensemble de lignes cachées, et il le fait après que toutes les décisions sont préparées, si bien quun échec laisse la visibilité dorigine intacte
Pourquoi un filtre de dates relatives donne-t-il des lignes différentes selon les jours ?
Les filtres tels quaujourdhui, cette semaine ou le mois dernier sont définis relativement à la date courante, exactement comme dans Excel. Réglez ReferenceDate dans TXLSXAutoFilterExecutionOptions à une date fixe quand vous avez besoin de résultats reproductibles ; une valeur zéro signifie la date à laquelle lopération démarre
HotXLS peut-il filtrer sur des couleurs qui viennent dun style de table ?
Non, et Excel non plus. Les filtres de couleur HotXLS ne correspondent quau formatage direct de cellule et aux surcharges de mise en forme conditionnelle prises en charge. Les couleurs peintes uniquement par un style de table intégré ou personnalisé ne participent pas, si bien quun résultat de filtre de couleur saccorde avec ce que la liste déroulante Excel sélectionnerait
Lexécution AutoFilter avancée est livrée avec lAPI de feuille de calcul XLSX de HotXLS, le composant de tableur Delphi pour lire et écrire des fichiers Excel sans Excel, à partir de la v2.384.136, avec la gestion des couleurs de dégradés, de texte enrichi et de texte enrichi conditionnel ajoutée jusquà la v2.384.150