Το HotXLS κρατά το αρχικό ChartML ενός γραφήματος Excel που εισήχθη και το αναπαράγει byte προς byte όταν τίποτα στο τυποποιημένο μοντέλο δεν άλλαξε, ώστε το άνοιγμα και η επαναποθήκευση ενός βιβλίου εργασίας να μην απογυμνώνει σιωπηλά τα μέρη ενός γραφήματος που το μοντέλο αντικειμένου δεν αναπαριστά. Επεξεργαστείτε έναν τίτλο, μια σειρά ή έναν άξονα και το HotXLS συγχωνεύει δομικά τους νέους τυποποιημένους κόμβους μέσα στο αρχικό δέντρο αντί να αναγεννήσει το γράφημα από την αρχή
Αυτή η διάκριση — αναπαραγωγή όταν είναι ανέπαφο, συγχώνευση όταν επεξεργάζεται — είναι αυτό που κάνει μια εφαρμογή Delphi ασφαλή να κατευθυνθεί σε γραφήματα που κατασκεύασε ένας αναλυτής στο Excel. Η αναγέννηση ενός γραφήματος από ένα τυποποιημένο μοντέλο χάνει πάντα ό,τι το μοντέλο δεν γνωρίζει, και τα γραφήματα του Excel είναι γεμάτα πράγματα που μια βιβλιοθήκη δεν γνωρίζει: προσαρμοσμένα στυλ, λίστες επεκτάσεων, κλάδοι εναλλακτικού περιεχομένου, μορφοποίηση με πρόθεμα χώρου ονομάτων από πρόσθετα
Γιατί η επαναποθήκευση ενός βιβλίου εργασίας ισοπεδώνει τα γραφήματά του;
Επειδή η συνήθης υλοποίηση διαβάζει ό,τι καταλαβαίνει και γράφει ό,τι καταλαβαίνει. Όλα τα ενδιάμεσα — ένα extLst από μια νεότερη έκδοση Excel, ένας κλάδος mc:AlternateContent, ένα εφέ σχήματος για το οποίο το μοντέλο δεν έχει ιδιότητα — υπάρχουν στο αρχείο, δεν έχουν θέση στο μοντέλο αντικειμένου, και εξαφανίζονται κατά την αποθήκευση. Ο χρήστης βλέπει ένα γράφημα που έχασε τη διαβάθμισή του, τις προσαρμοσμένες ετικέτες δεδομένων ή το 3D εφέ του, και το βιβλίο εργασίας δεν μπορεί να εξηγήσει γιατί
Με την PreserveUnsupportedParts ενεργοποιημένη στο βιβλίο εργασίας, το HotXLS αποθηκεύει τα αρχικά bytes UTF-8 του γραφήματος κατά την εισαγωγή μαζί με ένα μήκος και ένα δακτυλικό αποτύπωμα 64 bit του μοντελοποιημένου περιεχομένου. Αν το τυποποιημένο μοντέλο δεν έχει αλλάξει μέχρι την αποθήκευση, γράφει τα αρχικά bytes πίσω. Καμία αναδιάταξη XML, καμία ολίσθηση κενού διαστήματος, κανένα resident UTF-16 αντίγραφο του γραφήματος που κρέμεται στη μνήμη για ένα γράφημα που κανείς δεν επεξεργάστηκε
var
Workbook: TXLSXWorkbook;
Chart: TXLSXChart;
begin
Workbook := TXLSXWorkbook.Create(nil);
try
Workbook.PreserveUnsupportedParts := True; // set before Open
Workbook.Open('quarterly-review.xlsx');
Chart := Workbook.Sheets[1].Charts[0]; // Sheets[] is 1-based
if Chart.HasPreservedXml then
Log('original ChartML retained; untouched charts replay exactly');
Chart.Title := 'Revenue by region, Q3 2026'; // now the merge path runs
Workbook.SaveAs('quarterly-review-out.xlsx');
finally
Workbook.Free;
end;
end;
Τι κρατά η συγχώνευση και τι κατέχει το μοντέλο
Ο κανόνας είναι η ιδιοκτησία. Οι δημόσιοι κόμβοι μοντέλου — τίτλος, σειρές, κρυφές μνήμες, ομάδες plot, άξονες — αποφασίζονται από το νέο παραγόμενο δέντρο. Τα μη μοντελοποιημένα υποδέντρα μεταφέρονται από το αρχικό. Αυτή η ασυμμετρία είναι σκόπιμη, και είναι το κομμάτι που παίρνει μια στιγμή να εσωτερικευτεί: η διαγραφή μιας σειράς δεν πρέπει να αναστήσει την παλιά σειρά από το διατηρημένο XML, οπότε ό,τι κατέχει το μοντέλο λαμβάνεται από το μοντέλο ακόμα κι όταν το μοντέλο λέει «εξαφανίστηκε»
Το χωρίς ιδιοκτήτη περιεχόμενο επανεισάγεται δίπλα στους αντιστοιχισμένους κόμβους που καθόταν δίπλα, και το extLst παραμένει τελευταίο μέσα στον γονέα του επειδή εκεί το απαιτεί το σχήμα. Ο καθαρισμός μιας γνωστής ιδιότητας — αφαίρεση μιας σημαίας bold, απόρριψη ενός χρώματος — αντιμετωπίζεται ως καθαρισμός, όχι ως κενό προς συμπλήρωση από το αρχικό δέντρο. Άγνωστα χαρακτηριστικά στην ίδια γειτονιά κρατούν τη θέση τους
Το περιεχόμενο markup-compatibility παίρνει συγκεκριμένη μεταχείριση. Κατά την ανάλυση, το HotXLS παραλείπει το mc:Choice και διαβάζει το mc:Fallback· αν αυτός ο κλάδος fallback τυλίχει μια ομάδα plot που γνωρίζει το μοντέλο, η συγχώνευση γράφει το νέο τυποποιημένο περιεχόμενο πίσω μέσα στο υποδένρο fallback. Χωρίς αυτό το βήμα μια αποθήκευση θα εκπέμψει τη νέα ομάδα plot και θα αφήσει την παλιά μέσα στο fallback, και το γράφημα θα έφερε δύο
Αποκλεισμός ενός γραφήματος
Η ClearPreservedXml απορρίπτει το αρχικό XML και το δακτυλικό αποτύπωμα για ένα γράφημα, οπότε η επόμενη αποθήκευση ξαναχτίζει αυτό το γράφημα καθαρά από το τυποποιημένο μοντέλο. Είναι μια απόφαση ανά γράφημα· η PreserveUnsupportedParts σε επίπεδο βιβλίου εργασίας εξακολουθεί να διέπει αν η κατάσταση διατήρησης κατασκευάζεται κατά την εισαγωγή
Καταφύγετε σε αυτή όταν θέλετε ένα καθαρό γράφημα παρά ένα πιστό — για παράδειγμα όταν ένα γράφημα προτύπου φέρει μορφοποίηση από ένα παλιό εταιρικό θέμα και ο σκοπός της λειτουργίας είναι να την απορρίψει. Μην καταφεύγετε σε αυτή ως αντανακλαστικό αποσφαλμάτωσης: ένα γράφημα που αποδίδει λάθος μετά από μια επεξεργασία είναι πιο συχνά ένα ερώτημα μοντελοποίησης παρά ένα ερώτημα διατήρησης, και ο καθαρισμός του διατηρημένου XML καταστρέφει τα αποδεικτικά στοιχεία
Γραφήματα συνδυασμού και ο δεύτερος άξονας
Η AddPlotGroup κατασκευάζει διατεταγμένα γραφήματα συνδυασμού, όπου κάθε ομάδα plot κρατά τη δική της οικογένεια γραφήματος και τη δική της ανάθεση πρωτεύοντα ή δευτερεύοντα άξονα. Αυτό είναι αυτό που χρειάζεται το πανταχού παρόν επιχειρηματικό γράφημα: έσοδα ως στύλοι στον αριστερό άξονα, ποσοστό περιθωρίου ως γραμμή στον δεξιό
Τα γραφήματα εκθέτουν πρωτεύοντες και δευτερεύοντες άξονες κατηγορίας και τιμής συν έναν άξονα σειράς, με τυποποιημένες ρυθμίσεις κατηγορίας, τιμής, ημερομηνίας και άξονα σειράς που καλύπτουν θέσεις, αναγνωριστικά, διασταυρώσεις, μονάδες ημερομηνίας, διαστήματα ετικετών και ορατότητα. Το παλαιότερο επίπεδο API — ChartType, AddSeries, η επίπεδη συλλογή Series — εξακολουθεί να διευθύνει την πρωτεύουσα ομάδα plot, οπότε ο υπάρχων κώδικας συνεχίζει να λειτουργεί ενώ το μοντέλο από κάτω κρατά κάθε διατεταγμένη ομάδα
var
Chart: TXLSXChart;
Line: TXLSXChartPlotGroup;
begin
// Column chart anchored over rows 1..15, columns 5..12
Chart := Sheet.Charts.Add(xlsxChartColumn, 'Revenue and margin',
1, 5, 15, 12);
Chart.AddSeries('Revenue', 'Data!$A$2:$A$13', 'Data!$B$2:$B$13');
// Second plot group: a line, read against the secondary value axis
Line := Chart.AddPlotGroup(xlsxChartLine, xlsxAxisSecondary);
Line.AddSeries('Margin %', 'Data!$A$2:$A$13', 'Data!$C$2:$C$13');
end;
Πριν υπάρξει αυτό το μοντέλο, το άνοιγμα και η επαναποθήκευση ενός γραφήματος συνδυασμού το κατέρρεε σε μία οικογένεια γραφήματος και έχανε τους δευτερεύοντες, ημερομηνίας και σειράς άξονες. Οι αναφορές τύπου γραφήματος και οι κρυφές μνήμες τιμών σειράς επιζουν τώρα και τα αντίγραφα βιβλίου εργασίας και τους κύκλους ανοίγματος/αποθήκευσης, και οι αγκυρώσεις γραφημάτων αντιστοιχίζονται στα μέρη γραφημάτων τους βάσει αναγνωριστικού σχέσης — οπότε μια εφαρμογή που αναδιατάσσει καταχωρήσεις σχέσεων δεν αλλάζει πια τα περιεχόμενα γραφημάτων μεταξύ θέσεων φύλλων εργασίας
Η παγίδα manual layout
Αν τοποθετείτε με το χέρι μια περιοχή plot, τίτλο, τίτλο άξονα ή υπόδειξη, γράψτε και τις τέσσερις συντεταγμένες. Το Office απαιτεί x, y, w και h ως πλήρη ομάδα όποτε είναι παρούσα οποιαδήποτε από αυτές, και αγνοεί ολόκληρο το manualLayout αλλιώς. Το HotXLS εκπέμπει πάντα το πλήρες ορθογώνιο για αυτόν τον λόγο, και η SetPositionAndSize το ορίζει και το ενεργοποιεί σε μία κλήση
Δύο ακόμα λεπτομέρειες ακολουθούν το Excel παρά την πλήρη ελευθερία της προδιαγραφής. Η θέση γράφεται με τα xMode και yMode ορισμένα σε edge ενώ το μέγεθος χρησιμοποιεί factor για τα wMode και hMode, επειδή αυτό είναι αυτό που γράφει το Excel και σε τι μετατρέπει άλλους συνδυασμούς. Και το layoutTarget εκπέμπεται μόνο για την περιοχή plot, ποτέ για τίτλους ή υποδείξεις, όπου οι σημειώσεις υλοποίησης της Microsoft το απαγορεύουν
Ενσωμάτωση σε έναν γύρο round trip βιβλίου εργασίας
Η διατήρηση γραφημάτων είναι μια περίπτωση μιας γενικής πολιτικής: μια βιβλιοθήκη που επεξεργάζεται έγγραφα συγγραφέντα αλλού πρέπει να αλλάζει ό,τι ζητήθηκε να αλλάξει και τίποτα άλλο. Η ίδια συλλογιστική οδηγεί το HotXLS σε θέματα, αλυσίδες υπολογισμού και επεκτάσεις φύλλων εργασίας, που περιγράφονται στις σημειώσεις για τους απωλεστικούς γύρους round trip για θέμα, extLst και calcChain, και για έργα VBA και εξωτερικούς συνδέσμους στην διατήρηση VBA και εξωτερικών συνδέσμων. Για την ίδια την επιφάνεια συγγραφής γραφημάτων — δημιουργία γραφημάτων, τοποθέτηση εικόνων και σχεδίων από Delphi — δείτε την ανάλυση των γραφημάτων, εικόνων και σχεδίων σε HotXLS
Το HotXLS διαβάζει, επεξεργάζεται και γράφει γραφήματα XLSX από native κώδικα Delphi και C++Builder χωρίς εγκατάσταση Excel στο μηχάνημα, που είναι αυτό που κάνει την πιστότητα ένα πρόβλημα βιβλιοθήκης παρά ένα πρόβλημα αυτοματισμού — η σελίδα του HotXLS spreadsheet συστατικού έχει τη λίστα χαρακτηριστικών γραφημάτων και μια δοκιμαστική λήψη