Το HotXLS μπορεί να ξαναγράψει ένα φύλλο εργασίας μέσα σε υπάρχον πακέτο XLSX χωρίς να αναλύσει ή να επανασυμπιέσει το υπόλοιπο αρχείο. Η TXLSDirectWriter.BeginPatch ανοίγει ένα πηγαίο πακέτο, αντιγράφει κάθε καταχώριση εκτός από το φύλλο-στόχο με τα συμπιεσμένα byte της αυτούσια, και σας επιτρέπει να ξαναγράψετε εκείνο το μοναδικό φύλλο μέσω των συνηθισμένων κλήσεων AddSheet, AddRow και Write*. Γραφήματα, προσωρινές μνήμες περιστροφικών πινάκων, θέματα, στυλ και κοινόχρηστες συμβολοσειρές δεν αποσυμπιέζονται ποτέ
Η ροή εργασίας που αυτό λύνει εμφανίζεται σε αναφορές και ανανέωση δεδομένων. Ένα βιβλίο εργασίας φτάνει από μια επιχειρηματική ομάδα φέροντας περιστροφικούς πίνακες, φίλτρα-κόπτες, υπό όρους μορφοποιήσεις και μια δεκαετία συσσωρευμένης μορφοποίησης. Κάθε βράδυ ένα φύλλο δεδομένων πρέπει να αντικατασταθεί με φρέσκους αριθμούς. Η φόρτωση και επανααποθήκευση ολόκληρου του βιβλίου εργασίας κοστίζει λεπτά ανά αρχείο και, ακόμη σημαντικότερο, θέτει σε κίνδυνο την πιστότητα χαρακτηριστικών που η μηχανή φόρτωσης πρέπει να ανακατασκευάσει. Η επιδιόρθωση παρακάμπτει και τα δύο προβλήματα με το να μην αγγίζει ό,τι δεν χρειάζεται να αγγίξει
Γιατί η αντιγραφή συμπιεσμένων byte είναι το ενδιαφέρον μέρος;
Μια καταχώριση zip που αντιγράφεται στο συμπιεσμένο επίπεδο κοστίζει μια αντιγραφή ροής. Η ίδια καταχώριση που περνά από μια κανονική διαδρομή εγγραφής κοστίζει μια αποσυμπίεση κατά την είσοδο και μια συμπίεση κατά την έξοδο, και η συμπίεση είναι το ακριβό μισό. Σε ένα βιβλίο εργασίας με μεγάλη προσωρινή μνήμη περιστροφικού πίνακα και μερικές δεκάδες ενσωματωμένες εικόνες, αυτή η διαφορά είναι η διαφορά ανάμεσα σε μια επιδιόρθωση που ολοκληρώνεται στον χρόνο που χρειάζεται για να γραφεί το νέο φύλλο και μία που περνά τον περισσότερο χρόνο της επανασυμπιέζοντας byte που ποτέ δεν εξέτασε
Το HotXLS χρησιμοποιεί την CopyCompressedFrom για αυτό, η οποία γράφει τα συμπιεσμένα byte της πηγαίας καταχώρισης απευθείας στο αρχείο-στόχο. Όταν μια καταχώριση δεν μπορεί να αντιγραφεί έτσι, επειδή χρησιμοποιεί διαφορετική μέθοδο συμπίεσης ή αδύναμη κρυπτογράφηση, ο συγγραφέας επιστρέφει σε αντιγραφή αποσυμπιεσμένης ροής αντί να αποτύχει. Καταχωρίσεις δεικτών καταλόγου παραλείπονται, αφού ο συγγραφέας παράγει τις δικές του
Αντικατάσταση επί τόπου, ή εγγραφή σε νέο αρχείο
Δύο υπερφορτώσεις καλύπτουν τις δύο μορφές που παίρνει αυτή η εργασία. Η επί τόπου μορφή στήνει το αποτέλεσμα σε ένα προσωρινό αρχείο δίπλα στο πρωτότυπο, κλείνει τη λαβή πηγής, έπειτα διαγράφει και μετονομάζει, ώστε μια κατάρρευση κατά τη μέση της εγγραφής να αφήνει το πρωτότυπο ανέπαφο. Η μορφή με ρητό στόχο αφήνει την πηγή ανέπαφη και μπορεί είτε να αντικαταστήσει ένα φύλλο είτε να προσαρτήσει ένα νέο:
var
W: TXLSDirectWriter;
begin
W := TXLSDirectWriter.Create;
try
W.BeginPatch('monthly-dashboard.xlsx', 'Data'); // επί τόπου
W.AddSheet('Data');
W.AddRow(1);
W.WriteString(1, 'Region');
W.WriteString(2, 'Revenue');
W.AddRow(2);
W.WriteString(1, 'North');
W.WriteNumber(2, 184320.55);
W.AddRow(3);
W.WriteFormula(1, '=SUM(B2:B2)');
W.Close;
finally
W.Free;
end;
end;
Η παραλλαγή εισαγωγής δέχεται μια πηγαία διαδρομή, μια διαδρομή στόχου συν InsertSheet:
// Η πηγή παραμένει ανέπαφη· ο στόχος αποκτά ένα επιπλέον φύλλο με όνομα Extra
W.BeginPatch('template.xlsx', 'output.xlsx', 'Extra', True);
W.AddSheet('Extra');
W.AddRow(1);
W.WriteString(1, 'appended by the nightly job');
W.Close;
Η εισαγωγή είναι το μέρος που απαιτεί πραγματική χειρουργική λογιστική. Ο συγγραφέας αναλύει το μητρώο φύλλων στο xl/workbook.xml και τον χάρτη σχέσεων που δεσμεύει κάθε φύλλο στο μέρος του, έπειτα επιλέγει τον επόμενο ελεύθερο αριθμό μέρους, αναγνωριστικό φύλλου και αναγνωριστικό σχέσης. Οι τύποι σχέσεων ακολουθούν τις συμβάσεις του πηγαίου πακέτου, οπότε η επιδιόρθωση ενός αυστηρού βιβλίου εργασίας ISO 29500 εκπέμπει αυστηρούς τύπους σχέσεων και η επιδιόρθωση ενός μεταβατικού εκπέμπει μεταβατικούς τύπους
Τι απορρίπτει και τι περιορίζει σκόπιμα η επιδιόρθωση
Η αλυσίδα υπολογισμού απορρίπτεται και στις δύο λειτουργίες. Σε λειτουργία αντικατάστασης οι καταχωρίσεις της περιγράφουν κελιά σε ένα φύλλο που δεν υπάρχει πια με αυτή τη μορφή· σε λειτουργία εισαγωγής η μετατόπιση ευρετηρίου φύλλων την ακυρώνει εντελώς. Το Excel ανακατασκευάζει την αλυσίδα στον επόμενο επανυπολογισμό, οπότε η απόρριψή της είναι σωστή και όχι με απώλειες. Το μέρος παραλείπεται από την αντιγραφή, και η καταχώρισή σχέσης και η παράκαμψη τύπου περιεχομένου του αφαιρούνται χειρουργικά
Δύο σημασιολογίες συγγραφής αλλάζουν μέσα σε μια επιδιόρθωση, και και οι δύο πηγάζουν από την ίδια αρχή: η επιδιόρθωση δεν πρέπει να ενοχλήσει μέρη που δεν ξανάγραψε. Οι συμβολοσειρές γράφονται ενσωματωμένες στο φύλλο αντί να προστεθούν στον πίνακα κοινόχρηστων συμβολοσειρών, επειδή ο πηγαίος πίνακας περνά ανέπαφος. Και το StyleIndex αναφέρεται σε καταχωρίσεις στο cellXfs του πηγαίου πακέτου, όχι σε έναν πίνακα στυλ που χτίζει ο συγγραφέας. Αυτό σημαίνει ότι μπορείτε να αναφερθείτε σε μορφές που το αρχικό βιβλίο εργασίας ήδη ορίζει, κάτι που συνήθως είναι ακριβώς αυτό που θέλει μια ανανέωση δεδομένων, αλλά σημαίνει επίσης ότι πρέπει να ξέρετε ποιο ευρετήριο φέρει ποια μορφή
// Μέσα σε μια επιδιόρθωση, το StyleIndex ευρετηριάζει το cellXfs του
// ΠΗΓΑΙΟΥ πακέτου. Μια ημερομηνία χρειάζεται ρητό ευρετήριο που
// αντιστοιχίζεται εκεί σε μορφή ημερομηνίας:
W.WriteDateTime(3, EncodeDate(2026, 8, 22), DateStyleIndexFromTemplate);
// Η υπερφόρτωση WriteDateTime χωρίς στυλ απορρίπτεται σε λειτουργία
// επιδιόρθωσης, επειδή υποθέτει τον δικό του πίνακα στυλ του
// συγγραφέα, τον οποίο μια επιδιόρθωση ποτέ δεν δημιουργεί
Έξι σημεία εισόδου συγγραφής είναι φραγμένα: η προσθήκη πινάκων, γραφημάτων, εικόνων, σχολίων, ορισμένων ονομάτων και στυλ κελιών όλα εγείρουν εξαίρεση σε λειτουργία επιδιόρθωσης, με δεύτερο δίχτυ ασφαλείας κατά το κλείσιμο που αποτυγχάνει αν κάποιος από τους μετρητές τους είναι μη μηδενικός. Καθένα από αυτά τα χαρακτηριστικά θα απαιτούσε επεξεργασία μερών που η επιδιόρθωση αντιγράφει αυτούσια, και ένα μισοεπεξεργασμένο πακέτο είναι χειρότερο από μια απορριφθείσα λειτουργία. Ακριβώς ένα φύλλο μπορεί να επιδιορθωθεί ανά λειτουργία
Πότε να επιδιορθώσετε και πότε να φορτώσετε
Η επιδιόρθωση είναι το σωστό εργαλείο όταν το βιβλίο εργασίας είναι μεγάλο, η αλλαγή περιορίζεται σε ένα φύλλο, και το υπόλοιπο αρχείο πρέπει να επιβιώσει bit προς bit. Είναι το λάθος εργαλείο όταν η αλλαγή εκτείνεται σε αρκετά φύλλα, όταν χρειάζονται νέα μορφοποίηση ή νέα αντικείμενα, ή όταν το αρχείο είναι αρκετά μικρό ώστε μια κανονική φόρτωση και αποθήκευση να μην κοστίζει τίποτα. Για μαζική δημιουργία από την αρχή, η διαδρομή ροής που περιγράφεται στον απευθείας συγγραφέα ροής παραμένει η καλύτερη επιλογή, και μοιράζεται το ίδιο API AddRow και Write*, οπότε η μετάβαση ανάμεσα στα δύο είναι μηχανική
Ο χειρισμός σε επίπεδο φύλλου μέσα σε ένα φορτωμένο βιβλίο εργασίας, όταν πράγματι θέλετε το πλήρες μοντέλο αντικειμένων, καλύπτεται στην αναπαραγωγή φύλλων εργασίας σε πακέτα XLSX. Και αν ο λόγος που σκέφτεστε μια επιδιόρθωση είναι ότι η επεξεργασία ολόκληρου του βιβλίου εργασίας έχει γίνει αργή, οι μετρήσεις και η συμπεριφορά μνήμης στην απόδοση μεγάλων βιβλίων εργασίας αξίζει να διαβαστούν πριν επιλέξετε μια προσέγγιση
Επαλήθευση ότι μια επιδιόρθωση πράγματι έκανε αυτό που νομίζετε
Τρεις έλεγχοι πιάνουν σχεδόν κάθε λάθος. Επιβεβαιώστε ότι τα μέρη που περιμένατε να επιβιώσουν βρίσκονται ακόμη στο αρχείο, ότι το xl/calcChain.xml έχει φύγει, και ότι το ξανάνοιγμα του αρχείου μέσω του TXLSXWorkbook αναφέρει τον αριθμό φύλλων που περιμένατε, αμετάβλητο για αντικατάσταση και αυξημένο κατά ένα για εισαγωγή. Η επανανάγνωση του επιδιορθωμένου φύλλου και η σύγκριση μερικών τιμών και τύπων κλείνει τον βρόχο
Μια λεπτομέρεια υλοποίησης από την ανάπτυξη αυτού του χαρακτηριστικού αξίζει επανάληψη, επειδή μπορεί να δαγκώσει όποιον γράφει παρόμοιο κώδικα επιπέδου zip. Τα ονόματα μερών φύλλων εργασίας ταιριάζουν κατά πρόθεμα, και ένα σφάλμα κατά ένα στο μήκος προθέματος σημαίνει ότι το κατηγόρημα ποτέ δεν ταιριάζει, οπότε ένα νεόγραφτο μέρος συγκρούεται με υπάρχον όνομα και αναγνώστες που παίρνουν την τελευταία καταχώριση με δεδομένο όνομα επιλέγουν σιωπηλά το λάθος φύλλο. Αν μια επιδιόρθωση φαίνεται να ανταλλάσσει το περιεχόμενο δύο φύλλων, κοιτάξτε πρώτα την αντιστοίχιση ονομάτων και μετά το XML
Η επί τόπου επιδιόρθωση, οι εγγραφές ροής και το πλήρες μοντέλο αντικειμένων βιβλίου εργασίας διανέμονται στην ίδια βιβλιοθήκη για Delphi και C++Builder· η λίστα χαρακτηριστικών βρίσκεται στη σελίδα του εξαρτήματος υπολογιστικών φύλλων HotXLS για Delphi