Το HotXLS μπορεί να ανοίξει ένα βιβλίο εργασίας XLSX και να μην αναλύσει κανένα κελί φύλλου εργασίας. Το TXLSXWorkbook.MetadataOnly διαβάζει ιδιότητες βιβλίου εργασίας, defined names, ονόματα φύλλων και καταστάσεις ορατότητας, στυλ, θέμα, συνδέσεις και εξωτερικούς συνδέσμους, και κατόπιν σταματά πριν το XML των κελιών. Για έναν σαρωτή που χρειάζεται να γνωρίζει τι υπάρχει σε έναν κατάλογο βιβλίων εργασίας, αυτή είναι η διαφορά μεταξύ λεπτών και δευτερολέπτων
Τρεις σχετικοί διακόπτες συμπληρώνουν την εικόνα: η SelectedSheets αναλύει κελιά για ένα επώνυμο υποσύνολο, η LoadSheet υλοποιεί υλικά ένα παραλειμμένο φύλλο αργότερα από το αρχικό αρχείο, και η PreserveRawParts αντιγράφει τα συμπιεσμένα bytes των αμετάβλητων μερών κατευθείαν στην αποθήκευση. Χρησιμοποιημένα μαζί μετατρέπουν το «άνοιξε ένα βιβλίο εργασίας» από μια all-or-nothing λειτουργία σε κάτι που μπορείτε να οριοθετήσετε
Τι μπορείτε να μάθετε χωρίς να αναλύσετε ούτε ένα κελί;
Περισσότερα από όσα χρειάζονται οι περισσότερες εργασίες ανακάλυψης. Με την MetadataOnly ορισμένη πριν από το Open, το βιβλίο εργασίας επιστρέφει φέροντας τα ονόματα φύλλων και τις καταστάσεις ορατότητάς του, τα defined names, τις ιδιότητες εγγράφου, τα στυλ και το θέμα, τους εξωτερικούς συνδέσμους και τις συνδέσεις του. Τα φύλλα είναι παρόντα ως αντικείμενα με μηδέν κελιά
Αυτές είναι ακριβώς οι πληροφορίες πάνω στις οποίες τρέχουν ένας κατάλογος, ένας έλεγχος ή μια απόφαση δρομολόγησης. Ποια βιβλία εργασίας ορίζουν ένα όνομα που λέγεται TaxRate; Ποια έχουν κρυφά φύλλα; Ποια συνδέονται σε έναν διακομιστή που έχει αποσυρθεί; Η απάντηση σε αυτά με πλήρη φόρτωση κάθε αρχείου είναι πώς μια νυχτερινή εργασία γίνεται all-night εργασία
var
Workbook: TXLSXWorkbook;
I: Integer;
begin
Workbook := TXLSXWorkbook.Create(nil);
try
Workbook.MetadataOnly := True; // set before Open
Workbook.Open(FileName);
for I := 1 to Workbook.Sheets.Count do // Sheets[] is 1-based
if not Workbook.Sheets[I].Visible then
Report.Add(FileName + ': hidden sheet ' +
Workbook.Sheets[I].Name);
finally
Workbook.Free;
end;
end;
Φόρτωση δύο φύλλων από σαράντα
Η SelectedSheets είναι μια TStringList ονομάτων φύλλων. Όταν είναι μη κενή, το Open αναλύει το XML κελιών μόνο για τα φύλλα που ονομάζει· κάθε άλλο φύλλο κρατά το σωστό όνομα και την κατάσταση ορατότητάς του και δεν κρατά κελιά. Μια κενή λίστα σημαίνει την προηγούμενη συμπεριφορά, που είναι να φορτώσει τα πάντα
Η αλληλεπίδραση με την MetadataOnly αξίζει να δηλωθεί ξεκάθαρα, επειδή η αντιστροφή της παράγει ένα μπερδεμένο κενό βιβλίο εργασίας: η MetadataOnly = True παρακάμπτει την επιλογή και παραλείπει όλα τα φύλλα. Χρησιμοποιήστε τη μία ή την άλλη. Η ανακάλυψη χρησιμοποιεί μόνο μεταδεδομένα· η στοχευμένη εργασία χρησιμοποιεί μια επιλογή
Workbook.SelectedSheets.Add('Summary');
Workbook.SelectedSheets.Add('Q3 Detail');
Workbook.Open('consolidated-2026.xlsx');
// Later, when the user opens a tab you skipped.
// LoadSheet takes the 0-based position and needs the source file,
// so it does not work on a workbook opened from a stream
if Workbook.LoadSheet(ZeroBasedPosition) then
Grid.Refresh;
Η LoadSheet(Index) υλοποιεί υλικά ένα παραλειμμένο φύλλο κατ απαίτηση από το αρχικό αρχείο, που είναι αυτό που κάνει αυτό το μοτίβο χρησιμοποιήσιμο σε μια διαδραστική εφαρμογή παρά μόνο σε μια παρτίδα. Ανοίξτε με το φύλλο που κοιτάζει ο χρήστης, φορτώστε τα άλλα όταν κάνουν κλικ. Το αρχείο παραμένει ανοιχτό ακριβώς για αυτόν τον λόγο, οπότε κρατήστε το βιβλίο εργασίας ζωντανό όσο ο χρήστης μπορεί να ζητήσει άλλο φύλλο
Γιατί ένας γύρος round trip αλλάζει μέρη που δεν αγγίξατε;
Επειδή μια αφελής αποθήκευση αναγεννά τα πάντα. Αποσυμπιέστε το θέμα, κατασκευάστε ένα μοντέλο αντικειμένου, σειριοποιήστε το πίσω, επανασυμπιέστε — και τώρα τα bytes διαφέρουν παρόλο που τίποτα για το θέμα δεν άλλαξε. Για έργα VBA και κρυφές μνήμες pivot αυτό είναι χειρότερο από σπατάλη, επειδή αυτά τα μέρη φέρουν δομή που το μοντέλο αντικειμένου δεν αναπαριστά πλήρως
Η PreserveRawParts απαντά σε αυτό αντιγράφοντας τη συμπιεσμένη αναπαράσταση των αμετάβλητων μερών απευθείας από το αρχικό αρχείο κατά τη SaveAs. Θέμα, έργο VBA, πίνακες pivot και κρυφές μνήμες pivot μετακινούνται ως bytes όταν δεν τροποποιήθηκαν. Καμία αποσυμπίεση, καμία επανασυμπίεση, κανένας κίνδυνος να χαθεί κάτι σε ένα γύρο σειριοποίησης
Το κόστος είναι ένας περιορισμός που ήδη είχατε: το αρχικό αρχείο πρέπει να είναι ακόμα διαθέσιμο την ώρα αποθήκευσης. Αν η ροή εργασίας σας διαβάζει ένα αρχείο στη μνήμη, το κλείνει και αποθηκεύει μια ώρα αργότερα, η διαδρομή raw-copy δεν έχει τίποτα να αντιγράψει. Κρατήστε την πηγή προσβάσιμη για τη διάρκεια ζωής του βιβλίου εργασίας, που είναι η ίδια απαίτηση που επιβάλλει η LoadSheet
Μια γραμμή παραγωγής ανακάλυψης που ξανανοίγει εκ παραδρομής σκόπιμα
Το μοτίβο που λειτουργεί στην παραγωγή έχει δύο περάσματα και καθόλου εκζήτηση. Το πέρας ένα ανοίγει μόνο μεταδεδομένα και αποφασίζει. Το πέρας δύο ξανανοίγει τα αρχεία που έχουν σημασία με μια επιλογή φύλλων και κάνει τη δουλειά. Το ξανάνοιγμα φαίνεται σπατάλη μέχρι να μετρήσετε τι απέφυγε το πέρας ένα: το δεύτερο άνοιγμα είναι το μοναδικό που αναλύει κελιά, και αναλύει μόνο τα φύλλα που επέλεξε το πέρας ένα
// Pass 1: discovery
Workbook.MetadataOnly := True;
Workbook.Open(FileName);
Wanted := SheetsMatching(Workbook, 'Invoice');
Workbook.Free;
// Pass 2: targeted load
Workbook := TXLSXWorkbook.Create(nil);
Workbook.SelectedSheets.AddStrings(Wanted);
Workbook.Open(FileName);
Μην προσπαθήσετε να προάγετε ένα βιβλίο εργασίας μόνο μεταδεδομένων στη θέση του καθαρίζοντας τη σημαία μετά το Open. Η σημαία διαβάζεται κατά το άνοιγμα· ο καθαρισμός της μετά δεν αλλάζει τίποτα για ένα βιβλίο εργασίας του οποίου το XML κελιών δεν επισκέφτηκε ποτέ
Πού αυτό χωράει με τους άλλους μοχλούς μεγάλων αρχείων
Η επιλεκτική φόρτωση μειώνει ό,τι αναλύετε. Δεν μειώνει ό,τι κοστίζει ένα φύλλο μόλις φορτωθεί, και δεν βοηθά όταν πραγματικά χρειάζεστε κάθε κελί κάθε φύλλου. Για αυτή την περίπτωση η σχετική εργασία είναι στην πλευρά αποθήκευσης, που περιγράφεται στις σημειώσεις για την αποθήκευση κελιών row-block και τις επικαλύψεις στυλ διαστήματος, και στην πλευρά ανάλυσης στο παράλληλο parsing XLSX και τον allocator μνήμης. Όταν η εργασία είναι ένας καθαρός σαρωτής χωρίς καμία επεξεργασία, ο streaming direct reader παρακάμπτει εντελώς το μοντέλο αντικειμένου και θα κερδίσει κάθε στρατηγική φόρτωσης που κατασκευάζει ένα
Το HotXLS ανοίγει αρχεία XLS και XLSX από native κώδικα Delphi και C++Builder χωρίς εξάρτηση από Excel, οπότε μια εργασία ανακάλυψης server-side τρέχει χωρίς τίποτα εγκατεστημένο πέρα από το δικό σας εκτελέσιμο — δείτε τη σελίδα του HotXLS spreadsheet συστατικού για τις υποστηριζόμενες μορφές και την αδειοδότηση