Τεχνικό Άρθρο

Αντιγραφή μεταξύ βιβλίων εργασίας και επαναδέσμευση τύπων στο HotXLS με Delphi

Η μέθοδος AddCopy του HotXLS αντιγράφει ένα φύλλο εργασίας από ένα βιβλίο εργασίας Excel σε ένα άλλο αποκωδικοποιώντας κάθε τύπο σε εκείνο το φύλλο σε κείμενο στυλ A1 και ξαναμεταγλωττίζοντας το κείμενο μέσα στο βιβλίο εργασίας προορισμού, αντί να αντιγράφει απευθείας το μεταγλωττισμένο δέντρο τύπου, επειδή οι αναφορές σειρών γραφήματος, οι δείκτες γραμματοσειράς εμπλουτισμένου κειμένου, και η αρίθμηση εξωτερικών συνδέσμων ανατίθενται όλα ανεξάρτητα μέσα σε κάθε αρχείο βιβλίου εργασίας

Η αποτυχία εμφανίζεται ακριβώς στο βιβλίο εργασίας που θα περιμένατε: μια εργασία τέλους μήνα που τραβά ένα φύλλο από την αναφορά κάθε υποκαταστήματος και το προσαρτά σε ένα αρχείο σύνοψης. Ανοίξτε το αποτέλεσμα και ένα γράφημα υποσυνόλου σχεδιάζει τους αριθμούς ενός εντελώς διαφορετικού υποκαταστήματος, μια σημείωση που ήταν έντονη και κόκκινη στην πηγή έχει επιστρέψει σε απλό μαύρο κείμενο, και ένας τύπος που κάποτε τραβούσε έναν φορολογικό συντελεστή από ένα συνοδευτικό βιβλίο εργασίας αναζήτησης τώρα δείχνει έναν παγωμένο αριθμό που κανείς δεν μπορεί να εξηγήσει. Τίποτα δεν εγείρει εξαίρεση εδώ — το αρχείο ανοίγει, οι αριθμοί φαίνονται εύλογοι, και η ζημιά κάθεται εκεί μέχρι κάποιος να παρατηρήσει ένα γράφημα με λάθος τίτλο δίπλα του

Γιατί το AddCopy δεν μπορεί απλώς να αντιγράψει το μεταγλωττισμένο δέντρο τύπου;

Το AddCopy δεν μπορεί να μετακινήσει το μεταγλωττισμένο δέντρο τύπου αμετάβλητο, επειδή ένας μεταγλωττισμένος τύπος BIFF δεν είναι αυτοτελές κείμενο — είναι μια ακολουθία tokens, και αρκετά από αυτά τα tokens είναι μικροί ακέραιοι που επιλύονται σωστά μόνο μέσα στο βιβλίο εργασίας που τα παρήγαγε. Μια αναφορά 3D όπως Sheet2!A1:A10 δεν φέρει το κυριολεκτικό όνομα Sheet2 μόλις μεταγλωττιστεί· φέρει ένα πεδίο που η προδιαγραφή BIFF αποκαλεί ixti (το HotXLS κρατά την ίδια τιμή στο δικό του μεταγλωττισμένο δέντρο κάτω από το όνομα πεδίου FExternID), έναν δείκτη στον ιδιωτικό πίνακα EXTERNSHEET εκείνου του βιβλίου εργασίας, αριθμημένο όπως τυχαίνει να καταχώρισε τα φύλλα του και τα εξωτερικά βιβλία εκείνο το συγκεκριμένο βιβλίο εργασίας. Μετακινήστε το token αμετάβλητο σε ένα βιβλίο εργασίας του οποίου ο πίνακας EXTERNSHEET χτίστηκε με διαφορετική σειρά και ο δείκτης 3 δεν σημαίνει πλέον Sheet2 — σημαίνει όποιο φύλλο τυχαίνει να καταλαμβάνει τη θέση 3 εκεί, και το Excel δεν έχει τρόπο να σημάνει το λάθος, επειδή όσον αφορά τη μορφή αρχείου ο τύπος είναι τέλεια καλά σχηματισμένος. Αυτή είναι ακριβώς η αποτυχία που υπάρχει το TXLSWorksheets.AddCopy για να αποφύγει: καλούμενο από τη δική του συλλογή φύλλων οποιουδήποτε βιβλίου εργασίας σε κώδικα Delphi ή C++Builder, αντιγράφει ένα φύλλο εργασίας — τιμές κελιών, μορφές, τύπους, γραφήματα, σχόλια, συγχωνεύσεις, ρύθμιση σελίδας, και περισσότερα — από ένα βιβλίο εργασίας πηγή που μπορεί ή όχι να είναι εκείνο στο οποίο το καλείτε, και προσαρτά το αποτέλεσμα στον προορισμό κάτω από ένα όνομα της επιλογής σας ή ένα διαφοροποιημένο αντίγραφο του πρωτοτύπου

var
  Summary, Branch: IXLSWorkbook;   // interface-counted: do not Free
begin
  Summary := TXLSWorkbook.Create;
  Branch := TXLSWorkbook.Create;
  Branch.Open('branch-east.xls');

  // Appends a copy of Branch's first sheet onto Summary, renamed to
  // stay unique inside the destination workbook
  Summary.Sheets.AddCopy(Branch.Sheets[1], 'East Detail');
  Summary.SaveAs('consolidated.xls');
end;

Η λύση: αποκωδικοποίηση σε κείμενο, επαναμεταγλώττιση στον προορισμό

Το HotXLS λύνει το πρόβλημα δεικτοδότησης χωρίς να αφήνει ποτέ το ίδιο το μεταγλωττισμένο δέντρο να διασχίσει το όριο βιβλίου εργασίας. Για κάθε κελί τύπου σε μια αντιγραφή μεταξύ βιβλίων εργασίας, το AddCopy αποκωδικοποιεί τον τύπο πηγή στο ίδιο κείμενο στυλ A1 που θα έβλεπε ένας χρήστης στη γραμμή τύπων του Excel, έπειτα παραδίδει εκείνο το κείμενο στο βιβλίο εργασίας προορισμού, το οποίο το αναλύει πίσω σε δέντρο χρησιμοποιώντας τους δικούς του πίνακες από την αρχή — μια αναφορά με προσδιορισμό φύλλου όπως Data!D2:D100 είναι απλώς μια συμβολοσειρά σε εκείνο το σημείο, και μια συμβολοσειρά σημαίνει το ίδιο πράγμα σε οποιοδήποτε βιβλίο εργασίας, οπότε αν ο προορισμός ήδη έχει ένα φύλλο με όνομα Data η αναφορά επιλύεται σωστά χωρίς καμία μετάφραση δείκτη καθόλου, επειδή ποτέ δεν υπήρξε ακατέργαστος δείκτης εν πτήσει προς μετάφραση. Το HotXLS πληρώνει για αυτό το πήγαινε-έλα μόνο όταν χρειάζεται: η αντιγραφή ενός φύλλου μέσα στο ίδιο βιβλίο εργασίας ακολουθεί μια φθηνότερη διαδρομή όπου το μεταγλωττισμένο δέντρο απλώς αναπαράγεται στη μνήμη, αφού κάθε δείκτης μέσα του είναι ήδη έγκυρος εκεί που παραμένει, και η παράκαμψη κειμένου τρέχει μόνο μόλις το AddCopy εντοπίσει ότι η πηγή και ο προορισμός είναι γνησίως διαφορετικά στιγμιότυπα βιβλίου εργασίας. Αξίζει επίσης να είμαστε ακριβείς σχετικά με το τι δεν είναι αυτή η επανεγγραφή. Δεν έχει καμία σχέση με τη μετατόπιση γραμμής και στήλης που τρέχει όταν εισάγετε ή διαγράφετε γραμμές μέσα σε ένα μοναδικό φύλλο, την οποία καλύπτει ένα συνοδευτικό άρθρο σε λεπτομέρεια — εκείνη η μηχανή ξαναγράφει κείμενο A1 επί τόπου για να παρακολουθεί κελιά που μετακινήθηκαν λίγες γραμμές πάνω ή κάτω μέσα σε ένα βιβλίο εργασίας, ενώ αυτή τρέχει όταν ένας τύπος φεύγει εντελώς από το βιβλίο εργασίας που τον μεταγλώττισε, όπου οι μετακινημένες γραμμές δεν είναι το πρόβλημα και η ιδιωτική αρίθμηση βιβλίου εργασίας είναι

// Conceptually, this is what AddCopy does for each formula cell: turn
// the compiled tree back into text using the source workbook's own
// tables, then let the destination workbook parse that text back into
// a tree using its own tables, from scratch
FormulaText := SourceBook.GetUnCompiledFormula(SourceFormula, Row, Col, SourceSheetID);
DestFormula := DestBook.GetCompiledFormula(FormulaText, DestSheetID);

Τι γίνεται αν ο προορισμός δεν έχει ακόμη εκείνο το φύλλο, ή εκείνο το όνομα;

Η επαναμεταγλώττιση του AddCopy πετυχαίνει μόνο όταν το βιβλίο εργασίας προορισμού ήδη έχει ό,τι αναφέρεται στο κείμενο του τύπου, και τα δύο κενά που εμφανίζονται στην πράξη είναι ένα ομώνυμο φύλλο που δεν έχει ακόμη αντιγραφεί σε αυτή την παρτίδα, και ένα καθορισμένο όνομα με εμβέλεια βιβλίου εργασίας που ποτέ δεν υπήρξε καθόλου στον προορισμό. Το HotXLS δεν εγείρει εξαίρεση όταν η επαναμεταγλώττιση αποτυγχάνει στη μέση μιας αντιγραφής φύλλου — η ανάθεση Value του κελιού απλά αποθηκεύει σιωπηλά το κείμενο του τύπου ως απλή συμβολοσειρά αντ' αυτού, μια σκόπιμη, επιθεωρήσιμη λειτουργία αποτυχίας παρά μια σιωπηλή, αφού ένα κελί τύπου που απροσδόκητα δείχνει κυριολεκτικό κείμενο όπως =SUM(Q1!B2:B12) αντί για έναν υπολογισμένο αριθμό είναι η ένδειξη ότι κάτι ανάντη στην αντιγραφή δεν επιλύθηκε. Πριν τα παρατήσει, το AddCopy δοκιμάζει μία επιδιόρθωση: διατρέχει το συντακτικό δέντρο του αποτυχημένου τύπου συλλέγοντας κάθε αναγνωριστικό καθορισμένου ονόματος που αγγίζει ο τύπος, και για κάθε όνομα με εμβέλεια βιβλίου εργασίας που υπάρχει στην πηγή αλλά όχι ακόμη στον προορισμό, αντιγράφει το όνομα απέναντι και επαναμεταγλωττίζει το ίδιο κείμενο δεύτερη φορά. Ονόματα με εμβέλεια φύλλου βρίσκονται έξω από ό,τι μπορεί να διορθώσει αυτή η επιδιόρθωση, αφού ένα όνομα ορατό μόνο σε τύπους σε ένα φύλλο του βιβλίου εργασίας πηγής δεν έχει ισοδύναμη θέση προς μετανάστευση, και ένας προορισμός που ήδη κατέχει ένα όνομα με την ίδια ορθογραφία μένει ανέγγιχτος αντί να αντικατασταθεί, με την υπόθεση ότι ένα όνομα που ο καλών σκόπιμα προδημιούργησε είναι αυτό που θέλει να τιμηθεί. Μέσα σε ένα μοναδικό βιβλίο εργασίας, η αναζήτηση ονόματος ενός τύπου μεταξύ φύλλων διατρέχει από την εμβέλεια φύλλου προς την εμβέλεια βιβλίου εργασίας αυτόματα, κάτι που είναι ο μηχανισμός που καλύπτει το άρθρο του HotXLS για καθορισμένα ονόματα και τύπους μεταξύ φύλλων· η διάσχιση ενός πραγματικού ορίου βιβλίου εργασίας αφαιρεί εντελώς εκείνο το δίχτυ ασφαλείας, και ένα όνομα πρέπει σκόπιμα να μεταφερθεί απέναντι αλλιώς ο τύπος που εξαρτάται από αυτό υποβαθμίζεται σε κείμενο

Οι αναφορές σειρών γραφήματος χρειάζονται την ίδια διόρθωση, αλλά διαφορετική διαδρομή κώδικα

Μια σειρά γραφήματος HotXLS που σχεδιάζει ένα εύρος κελιών χτυπά ακριβώς το ίδιο πρόβλημα αρίθμησης με έναν συνηθισμένο τύπο κελιού, επειδή η αναφορά εύρους δεδομένων ενός γραφήματος είναι επίσης μια ροή tokens μεταγλωττισμένου τύπου — η προδιαγραφή BIFF αποκαλεί την εγγραφή που τη φέρει BRAI ([MS-XLS] ενότητα 2.4.51) — αλλά το AddCopy δεν μπορεί να το διορθώσει επαναχρησιμοποιώντας τη συνηθισμένη διαδρομή φόρτωσης γραφήματος, επειδή εκείνη η διαδρομή είναι ακριβώς αυτή που δημιουργεί το σφάλμα. Όταν μια εγγραφή γραφήματος αναλύεται από τον δίσκο στη συνηθισμένη πορεία ανοίγματος ενός αρχείου, το δέντρο τύπου της χτίζεται μεταφράζοντας τα ακατέργαστα byte μέσω όποιου στιγμιότυπου υπολογιστή κάνει την ανάλυση· περάστε τα ακατέργαστα byte BRAI ενός γραφήματος πηγής μέσα από τον δικό του συνηθισμένο φορτωτή εγγραφών του βιβλίου εργασίας προορισμού αντ' αυτού, και το ixti ενσωματωμένο σε εκείνα τα byte επιλύεται έναντι του πίνακα EXTERNSHEET του προορισμού, οπότε η σειρά δείχνει σιωπηλά σε όποιο φύλλο καταλαμβάνει εκείνη τη θέση εκεί — η ίδια κατηγορία λάθους με την αντιγραφή του μεταγλωττισμένου δέντρου ενός κελιού αμετάβλητου, απλώς πιο δύσκολο να παρατηρηθεί επειδή κανείς δεν διαβάζει τύπους σειρών γραφήματος με τον τρόπο που διαβάζει τύπους κελιών. Το HotXLS αποφεύγει την παγίδα με μια αφιερωμένη διαδρομή κλωνοποίησης αντ' αυτού: το TXLSCustomChart.AssignFrom αντιγράφει τα δικά της byte κεφαλίδας μη-τύπου κάθε εγγραφής γραφήματος αυτολεξεί, έπειτα ανακατασκευάζει το προσαρτημένο εύρος μέσω του ίδιου πρωτόγονου αποκωδικοποίησης-και-επαναμεταγλώττισης που χρησιμοποιείται για συνηθισμένα κελιά, οπότε το νέο δέντρο κατασκευάζεται έναντι του πίνακα EXTERNSHEET του προορισμού από την αρχή αντί να επανερμηνεύεται έναντι αυτού εκ των υστέρων

Το ίδιο πρόβλημα αρίθμησης, έναν δείκτη γραμματοσειράς τη φορά

Δεν είναι κάθε ιδιωτικός αριθμός βιβλίου εργασίας μέσα σε ένα γράφημα ή ένα κελί εμπλουτισμένου κειμένου τύπος, και ένας δείκτης γραμματοσειράς είναι η ίδια κατηγορία προβλήματος σε μικρογραφία. Τα runs εμπλουτισμένου κειμένου, μαζί με δύο ακόμη τύπους εγγραφών γραφήματος που φέρουν λεζάντα ή γραμματοσειρά άξονα, αποθηκεύουν μια αναφορά γραμματοσειράς ως ακατέργαστο ακέραιο δείκτη στον δικό του πίνακα γραμματοσειρών του βιβλίου εργασίας ιδιοκτήτη, και εκείνος ο δείκτης δεν σημαίνει τίποτα στον πίνακα ενός διαφορετικού βιβλίου εργασίας — θα μπορούσε εξίσου εύκολα να δείχνει σε μια εντελώς διαφορετική γραμματοσειρά, μέγεθος, ή χρώμα εκεί. Το HotXLS το επιλύει κατά τιμή αντί κατά αριθμό: αναζητά τα πραγματικά χαρακτηριστικά γραμματοσειράς σε εκείνον τον δείκτη στον πίνακα πηγή, βρίσκει ή δημιουργεί μια αντίστοιχη καταχώριση στον πίνακα γραμματοσειρών του προορισμού, και ξαναγράφει τον αποθηκευμένο δείκτη να δείχνει σε εκείνη τη νέα θέση. Μια ιδιαιτερότητα μορφής κάνει την ίδια την αναζήτηση δύσκολη — ο δείκτης αριθμημένος στο αρχείο παραλείπει τη θέση 4, ένα κενό αρίθμησης που τεκμηριώνει το [MS-XLS] ενότητα 2.5.339, οπότε ο κώδικας πρέπει να μετατοπίσει τον δείκτη κατά ένα προς τα κάτω πριν συγκρίνει γραμματοσειρές και πίσω προς τα πάνω κατά ένα πριν γράψει το αποτέλεσμα

// The file-numbered font index skips slot 4 (MS-XLS section 2.5.339);
// shift into the in-memory slot, migrate the font by value if the
// destination differs, then shift back before writing the result
if Ifnt >= 5 then
  Dec(Ifnt);
if DestFonts.Key[Ifnt] <> SourceFonts.Key[Ifnt] then
  Ifnt := DestFonts.SetKey(0, SourceFonts.Key[Ifnt]);
if Ifnt >= 4 then
  Inc(Ifnt);

Τι συμβαίνει σε έναν τύπο που ήδη δείχνει έξω από το βιβλίο εργασίας;

Ένας τύπος που φτάνει σε ένα τρίτο βιβλίο εργασίας πριν καν καλέσετε το AddCopy είναι η μία περίπτωση που το πήγαινε-έλα κειμένου δεν μπορεί να μεταφέρει, επειδή ο δικός του αποκωδικοποιητής τύπου-σε-κείμενο του HotXLS σκόπιμα δεν συνθέτει κείμενο αγκύλης [Book]Sheet! για μια εξωτερική αναφορά, και ο μεταγλωττιστής στην άλλη άκρη δεν δέχεται ούτε εκείνη τη σύνταξη ως είσοδο — οπότε αυτή η μία περίπτωση περνά μέσα από έναν δεύτερο μηχανισμό που δεν αγγίζει καθόλου κείμενο. Όταν η επιδιόρθωση μετανάστευσης ονόματος που περιγράφηκε παραπάνω εξακολουθεί να αφήνει ένα κελί ως συμβολοσειρά, και το βιβλίο εργασίας πηγή έχει πραγματικό όνομα αρχείου, το AddCopy αλλάζει στρατηγική: κάνει βαθιά αντιγραφή του ίδιου του μεταγλωττισμένου δέντρου τύπου αντί για το κείμενό του, έπειτα παραδίδει το αντίγραφο σε ένα αφιερωμένο πέρασμα επαναδέσμευσης, το RebindExternRefsInTree, που το διατρέχει κόμβο προς κόμβο. Για κάθε αναφορά εύρους που βρίσκει, εκείνο το πέρασμα επιλύει την καταχώριση EXTERNSHEET της πηγής πίσω σε ένα ζεύγος ονομάτων φύλλων, και καταχωρεί, ή επαναχρησιμοποιεί, μια ισοδύναμη καταχώριση στους δικούς του πίνακες εξωτερικής αναφοράς του προορισμού, δημιουργώντας έναν εντελώς νέο σύνδεσμο εξωτερικού βιβλίου εργασίας αν ο προορισμός ποτέ δεν αναφέρθηκε προηγουμένως σε εκείνο το αρχείο πηγή

Εδώ είναι όπου το πρόβλημα ιδιωτικής αρίθμησης βιβλίου εργασίας είναι πιο κυριολεκτικό, επειδή ένα token εξωτερικής αναφοράς πακετάρει τρεις ξεχωριστές συντεταγμένες σε ένα πεδίο και καθεμία τους είναι ιδιωτική στο βιβλίο εργασίας που το έγραψε: ποιο εξωτερικό βιβλίο εργασίας, μια θέση στη δική του λίστα εξωτερικών βιβλίων του προορισμού που ανατέθηκε με όποια σειρά έτυχε να τα καταχωρίσει εκείνο το βιβλίο εργασίας· ποιο φύλλο μέσα στη δική του λίστα φύλλων εκείνου του εξωτερικού βιβλίου εργασίας, αποθηκευμένο ως δείκτης βασισμένος στο 1 με εμβέλεια συγκεκριμένα το εξωτερικό βιβλίο, έναν εντελώς διαφορετικό τομέα αρίθμησης από τα δικά του εσωτερικά αναγνωριστικά φύλλων του προορισμού· και το ίδιο το εύρος κελιών, απλές συντεταγμένες γραμμής και στήλης που δεν χρειάζονται καμία μετάφραση επειδή ποτέ δεν ήταν σχετικές με το βιβλίο εργασίας εξαρχής. Κάντε λάθος σε οποιοδήποτε από τα δύο πρώτα και το Excel εξακολουθεί να ανοίγει το αρχείο, εξακολουθεί να δείχνει έναν τύπο, και τον αξιολογεί έναντι λάθος εξωτερικών κελιών χωρίς παράπονο. Ένα είδος κόμβου νικά ακόμη και αυτή την επαναδέσμευση σε επίπεδο δέντρου: μια αναφορά σε ένα καθορισμένο όνομα, έναν δείκτη στον ιδιωτικό πίνακα ονομάτων του δικού του βιβλίου εργασίας ακριβώς όπως ένας δείκτης φύλλου είναι ιδιωτικός στο δικό του EXTERNSHEET, χωρίς διαθέσιμη ισοδύναμη επιδιόρθωση σε επίπεδο δέντρου — τη στιγμή που η διάτρεξη επαναδέσμευσης συναντά μια αναφορά ονόματος οπουδήποτε στο δέντρο, εγκαταλείπει ολόκληρο τον τύπο αντί να γράψει έναν μερικώς σωστό. Ακόμη και όταν η επαναδέσμευση πετυχαίνει, το κελί προορισμού δεν δείχνει έναν φρέσκο επανυπολογισμένο αριθμό· δείχνει την τιμή που κρατούσε ήδη το κελί πηγή τη στιγμή της αντιγραφής, κρατημένη σε μια αποθηκευμένη θέση με τον ίδιο τρόπο που το ίδιο το Excel αποθηκεύει την τελευταία γνωστή τιμή οποιασδήποτε εξωτερικής αναφοράς μέχρι να ανανεώσετε ρητά τους συνδέσμους, κάτι που είναι η σωστή προεπιλογή, αφού ο επανυπολογισμός μέσω ζωντανού συνδέσμου σε ένα άλλο αρχείο είναι ακριβώς το είδος λειτουργίας που θέλετε να πυροδοτείται μία φορά, σκόπιμα, όχι σε κάθε άνοιγμα

Τι σας κοστίζει αυτός ο σχεδιασμός

Ο μηχανισμός αποκωδικοποίησης-και-επαναμεταγλώττισης του AddCopy δεν είναι δωρεάν, και το κόστος αξίζει να το σχεδιάσετε πριν γράψετε σενάριο μιας μεγάλης εργασίας ενοποίησης παρά μετά. Η αντιγραφή ενός φύλλου μέσα στο ίδιο βιβλίο εργασίας ακολουθεί τη φθηνή διαδρομή, μια απευθείας αναπαραγωγή στη μνήμη του μεταγλωττισμένου δέντρου, επειδή κάθε δείκτης μέσα του είναι ήδη έγκυρος στο βιβλίο εργασίας όπου παραμένει· μια αντιγραφή μεταξύ βιβλίων εργασίας πληρώνει για μια γνήσια ανάλυση σε κάθε κελί τύπου αντ' αυτού, αποκωδικοποίηση σε κείμενο και έπειτα μεταγλώττιση εκείνου του κειμένου ξανά από το μηδέν, και ενώ η διαφορά δεν αξίζει να μετρηθεί σε ένα φύλλο με λίγες δεκάδες τύπους, ένα βιβλίο εργασίας πηγή με δεκάδες χιλιάδες κελιά τύπου, αντιγραμμένο ως ένα φύλλο μεταξύ δεκάδων σε μια εργασία παρτίδας, θα πρέπει να περιμένει η επαναμεταγλώττιση να κυριαρχήσει στον χρόνο εκτέλεσης παρά η I/O αρχείου γύρω της. Η σειρά αντιγραφής έχει σημασία για δεύτερο λόγο πέρα από την ταχύτητα: ένας τύπος που αναφέρεται σε ένα φύλλο που το AddCopy δεν έχει φτάσει ακόμη σε αυτή την παρτίδα αποτυγχάνει στην επαναμεταγλώττισή του για τον ίδιο λόγο που αποτυγχάνει ένας τύπος που αναφέρεται σε ένα γνησίως ανύπαρκτο φύλλο, οπότε μια εργασία που αντιγράφει το φύλλο B πριν από τον τύπο του φύλλου A που εξαρτάται από αυτό θα δει εκείνον τον τύπο να υποβαθμίζεται ακριβώς όπως περιγράφηκε παραπάνω, κείμενο συμβολοσειράς ή μια εφεδρεία εξωτερικού συνδέσμου που δείχνει πίσω ακριβώς στο αρχείο πηγή από το οποίο μόλις ήρθε. Και επειδή κάθε βιβλίο εργασίας πηγή σε μια παρτίδα ενοποίησης συνήθως συντάσσεται ανεξάρτητα, αξίζει να ελέγξετε ρητά για τη μία λειτουργία αποτυχίας που κανένα μεμονωμένο αρχείο πηγή δεν θα μπορούσε ποτέ να σας προειδοποιήσει — πέντε βιβλία εργασίας υποκαταστημάτων που το καθένα αθροίζει τους αριθμούς ενός ομότιμου υποκαταστήματος μπορούν να συνδυαστούν σε μια γνήσια κυκλική αναφορά μέσα στο βιβλίο εργασίας σύνοψης χωρίς κανένα μεμονωμένο αρχείο πηγή να περιέχει ποτέ μία, έναν κύκλο που υπάρχει μόνο μόλις κάθε φύλλο έχει προσγειωθεί στο ίδιο μέρος και ο επανυπολογισμός τρέχει πάνω στο συνδυασμένο σύνολο

Η αντιγραφή φύλλων εργασίας μεταξύ βιβλίων εργασίας διατίθεται ως τυπική συμπεριφορά του AddCopy στο εξάρτημα Excel HotXLS για Delphi για Delphi και C++Builder· η σελίδα προϊόντος φέρει την πλήρη αναφορά API φύλλου εργασίας και βιβλίου εργασίας, συμπεριλαμβανομένης της συμπεριφοράς γραφήματος, εμπλουτισμένου κειμένου, και εξωτερικής αναφοράς που περιγράφεται εδώ