Το HotXLS γράφει βιβλία εργασίας ISO/IEC 29500 Strict Open XML από τη Delphi και το C++Builder ρυθμίζοντας μία μόνο ιδιότητα, την StrictOOXML, πριν την αποθήκευση. Κάθε μέρος του πακέτου, από το xl/workbook.xml μέχρι τα αρχεία σχέσεων και τους τύπους περιεχομένου, γράφεται με τα αυστηρά λεξιλόγια purl.oclc.org αντί για τα μεταβατικά schemas.openxmlformats.org, και χαρακτηριστικά που το Strict δεν επιτρέπει απορρίπτονται με ρητή εξαίρεση αντί να γραφούν ούτως ή άλλως
Οι περισσότεροι προγραμματιστές συναντούν αυτήν την απαίτηση μέσω ενός εγγράφου προμήθειας. Δημόσιοι διαγωνισμοί σε αρκετές δικαιοδοσίες ζητούν την τυποποιημένη κατά ISO μορφή του Open XML, όχι τη μεταβατική μορφή που γράφει το Office από προεπιλογή, και ένα αρχείο που επιβάλλει ISO 29500 Strict θα απορρίψει ένα κανονικό .xlsx ακόμη κι αν το Excel το ανοίγει τέλεια. Οι μεταβατικοί χώροι ονομάτων υπάρχουν για να καλύψουν παλαιότερη δυαδική συμπεριφορά· οι αυστηροί είναι το ίδιο το πρότυπο
Τι πραγματικά διαφέρει ανάμεσα σε Strict και Transitional;
Η ορατή διαφορά είναι λεξιλόγιο. Ένα αυστηρό μέρος βιβλίου εργασίας δηλώνει το http://purl.oclc.org/ooxml/spreadsheetml/main ως ριζικό χώρο ονομάτων και το http://purl.oclc.org/ooxml/officeDocument/relationships για αναφορές σχέσεων, και κανένας μεταβατικός χώρος ονομάτων δεν επιτρέπεται να επιβιώσει πουθενά στο πακέτο. Οι τύποι σχέσεων αλλάζουν μαζί του, οπότε το ριζικό μέρος σχέσεων ονομάζει το .../ooxml/officeDocument/relationships/officeDocument αντί για το γνωστό ισοδύναμο openxmlformats, και ο τύπος εκτεταμένων ιδιοτήτων γράφεται σε camelCase ως extendedProperties
Η αόρατη διαφορά είναι το εύρος. Το Strict παραλείπει σκόπιμα τμήματα του μεταβατικού σχήματος που υπήρχαν μόνο για αμφίδρομη συμβατότητα με παλαιότερα δυαδικά αρχεία, μαζί με τις επεκτάσεις προμηθευτή που το Office πρόσθεσε αργότερα. Γι' αυτό η μετατροπή δεν είναι αναζήτηση και αντικατάσταση συμβολοσειρών: ορισμένα χαρακτηριστικά απλώς δεν έχουν αυστηρή γραφή και δεν πρέπει να γραφούν καθόλου
Ενεργοποίησή του
Ο συνηθισμένος κώδικας συγγραφής δεν αλλάζει. Χτίστε το βιβλίο εργασίας όπως πάντα, ρυθμίστε τη σημαία, και αποθηκεύστε:
var
Wb: TXLSXWorkbook;
Sh: TXLSXWorksheet;
begin
Wb := TXLSXWorkbook.Create;
try
Sh := Wb.Sheets.Add('Data');
Sh.Cells[1, 1].Value := 'Product';
Sh.Cells[1, 2].Value := 'Amount';
Sh.Cells[2, 1].Value := 'Widget';
Sh.Cells[2, 2].Value := 17;
Sh.Cells[3, 2].Formula := '=SUM(B2:B2)';
Wb.StrictOOXML := True; // έξοδος ISO/IEC 29500 Strict
if Wb.SaveAs('archive-copy.xlsx') <> 1 then
raise Exception.Create('strict save failed');
finally
Wb.Free;
end;
end;
Η σημαία επαναφέρεται στην αρχή κάθε λειτουργίας αποθήκευσης και ανατίθεται εκ νέου από την ιδιότητα βιβλίου εργασίας, ώστε μια εξαίρεση σε μία αποθήκευση να μην μπορεί να διαρρεύσει τη λειτουργία strict στην επόμενη. Αυτή η λεπτομέρεια έχει σημασία σε διεργασίες διακομιστή όπου ένα μοναδικό αντικείμενο βιβλίου εργασίας εξυπηρετεί αρκετά αιτήματα εξαγωγής
Γιατί μια αυστηρή αποθήκευση μπορεί να αρνηθεί να εκτελεστεί;
Τέσσερις οικογένειες χαρακτηριστικών είναι επεκτάσεις της Microsoft χωρίς ισοδύναμο ISO 29500 Strict, και το HotXLS εγείρει εξαίρεση κατά την αποθήκευση αντί να εκπέμπει ένα πακέτο που ισχυρίζεται συμμόρφωση strict ενώ δεν τη διαθέτει:
// Η αυστηρή έξοδος δεν μπορεί να ενσωματώσει έργο VBA
// -> αποθηκεύστε βιβλία εργασίας με μακροεντολές ως μεταβατικά .xlsm
// Η αυστηρή έξοδος δεν μπορεί να φέρει στοιχεία ελέγχου φόρμας
// -> κουμπιά, πλαίσια ελέγχου, πλαίσια συνδυασμών και τα ctrlProps τους
// Η αυστηρή έξοδος δεν μπορεί να φέρει σχόλια με νήματα
// -> το σύγχρονο μοντέλο persons/threads, όχι τις κλασικές σημειώσεις
// Η αυστηρή έξοδος δεν μπορεί να φέρει μεταδεδομένα δυναμικών πινάκων
// -> εύρη επέκτασης καταγεγραμμένα μέσω του μέρους μεταδεδομένων
Η ηχηρή αποτυχία είναι η σωστή επιλογή εδώ. Ένα έργο VBA που αποσιωπάται σιωπηλά μετατρέπει ένα λειτουργικό βιβλίο εργασίας σε ένα κατεστραμμένο που εξακολουθεί να ανοίγει, και η αναφορά της αποτυχίας φτάνει από έναν χρήστη εβδομάδες αργότερα. Μια εξαίρεση ονομάζει το χαρακτηριστικό και την ιδιότητα προς αλλαγή ενώ ο κώδικας κλήσης ακόμη γνωρίζει τι εξήγαγε. Η διατήρηση μακροεντολών και εξωτερικών συνδέσμων στη μεταβατική διαδρομή καλύπτεται στη διατήρηση έργων VBA και εξωτερικών συνδέσμων
Δύο οικογένειες επεκτάσεων αντιμετωπίζονται διαφορετικά, και αξίζει να ξέρετε γιατί. Οι γραμμές δεδομένων, τα sparklines και παρόμοια χαρακτηριστικά βρίσκονται στα λεξιλόγια x14 και xm, και οι παραλλαγές SVG των εικόνων βρίσκονται στο c15. Πρόκειται για περιεχόμενο λίστας επέκτασης του οποίου οι χώροι ονομάτων είναι αυτοπεριγραφόμενοι, οι γενικοί αναλυτές υπολογιστικών φύλλων τα ανέχονται, και δεν υπάρχει ισοδύναμο ISO για να μεταφραστούν. Το HotXLS τα κρατά αντί να πετάει το περιεχόμενο του χρήστη. Αν ένας επικυρωτής στον αγωγό σας είναι αυστηρός τόσο ως προς επεκτάσεις όσο και ως προς χώρους ονομάτων, αφαιρέστε αυτά τα χαρακτηριστικά από το πηγαίο βιβλίο εργασίας πριν την εξαγωγή
Η μετάφραση πρέπει να φτάσει σε μέρη που κανείς κανονικά δεν ξαναγράφει
Το ενδιαφέρον μηχανικό πρόβλημα στην αυστηρή έξοδο δεν είναι το XML του φύλλου εργασίας. Είναι τα μέρη που ένας γρήγορος συγγραφέας θα προτιμούσε να αντιγράψει αυτούσια. Το HotXLS διατηρεί θέματα, συνδέσεις, εξωτερικούς συνδέσμους, γραφήματα και blob περιστροφικών πινάκων αντιγράφοντας τα αρχικά τους συμπιεσμένα byte απευθείας, κάτι που είναι ακριβώς το σωστό για πιστότητα και ακριβώς το λάθος για αυστηρή έξοδο, επειδή τα αντιγραμμένα byte φέρουν μεταβατικούς χώρους ονομάτων
Υπό το StrictOOXML αυτές οι πέντε διατηρημένες διαδρομές μεταβαίνουν σε ανακατασκευή ή σε μεταφραστική επανάληψη, παρακάμπτοντας τη γρήγορη διαδρομή αντιγραφής byte. Όλο το XML περνά από μία ρουτίνα μετάφρασης, η οποία αγκυρώνεται σε τιμές χαρακτηριστικών με διπλά εισαγωγικά ώστε μια συμβολοσειρά που μοιάζει με URI μέσα σε ένα κελί να μην μπορεί ποτέ να ξαναγραφεί κατά λάθος. Κείμενο κελιού που περιέχει το ίδιο URI διαφεύγει ως οντότητα στο XML, οπότε η αγκυρωμένη αντικατάσταση δεν μπορεί να το δει. Ο συγγραφέας ροής μεταφράζει πρώτα τον σκελετό του και έπειτα διαχωρίζει στο sheetData, αφού τα μπλοκ γραμμών δεν περιέχουν καθόλου URI λεξιλογίου. Σχετικοί μηχανισμοί για τη διαδρομή διατήρησης καλύπτονται στα αμφίδρομες μεταφορές χωρίς απώλειες θεμάτων, λιστών επέκτασης και calcChain
Ανάγνωση αρχείων που το Excel αποθήκευσε ως strict
Η έξοδος είναι μόνο η μισή ιστορία. Το Excel προσφέρει την επιλογή αποθήκευσης "Strict Open XML Spreadsheet", και αρχεία που παράγονται έτσι πρέπει να ανοίγουν σωστά. Το HotXLS κανονικοποιεί τους τύπους σχέσεων σε κάθε σημείο ανάλυσης σχέσεων στο πακέτο, τη ρίζα, τους εξωτερικούς συνδέσμους, τα φύλλα εργασίας, τα σχέδια και τους περιστροφικούς πίνακες, ώστε ένας αυστηρός τύπος σχέσης να ταιριάζει με την ίδια εσωτερική σταθερά με το μεταβατικό αντίστοιχό του
Το αντίστοιχο στην πλευρά ανάγνωσης είναι η κανονικοποίηση προθεμάτων χώρου ονομάτων, που επιτρέπει σε αυθαίρετα προθέματα και στα δύο λεξιλόγια να επιλύονται σε έναν κανονικό πίνακα ονομάτων. Αυτή η δουλειά ωφελεί εξίσου τα συνηθισμένα και τα αυστηρά αρχεία, αφού γεννήτριες τρίτων δεσμεύουν προθέματα ελεύθερα, και είναι ο ίδιος μηχανισμός που περιγράφεται στην επίλυση σχέσεων OPC σε πακέτα XLSX
Μια σύντομη λίστα ελέγχου πριν διανείμετε αυστηρή έξοδο
Επαληθεύστε με το πακέτο, όχι με το Excel. Το Excel ανοίγει και τις δύο μορφές χωρίς πρόβλημα, οπότε ένα επιτυχημένο άνοιγμα δεν αποδεικνύει τίποτα για τη συμμόρφωση. Αποσυμπιέστε το αποτέλεσμα και επιβεβαιώστε ότι το xl/workbook.xml δηλώνει τον χώρο ονομάτων purl, ότι κανένα μέρος δεν περιέχει schemas.openxmlformats.org/spreadsheetml, και ότι οι τύποι σχέσεων στα _rels/.rels και xl/_rels/workbook.xml.rels χρησιμοποιούν τις αυστηρές μορφές
Έπειτα ξανανοίξτε το αρχείο μέσω του HotXLS και συγκρίνετε τιμές, τύπους, μορφές και υπερσυνδέσμους με την πηγή. Μια δοκιμή επαναανάγνωσης είναι ο μόνος φθηνός τρόπος να αποδείξετε ότι η μετάφραση δεν κατέστρεψε περιεχόμενο, και ασκεί ταυτόχρονα την κανονικοποίηση στην πλευρά ανάγνωσης. Αν τα βιβλία εργασίας σας φέρουν γραφήματα, ελέγξτε και αυτά, αφού το μέρος γραφήματος είναι ένα από τα διατηρημένα μέρη που μεταβαίνει σε ανακατασκευασμένη διαδρομή υπό αυστηρή λειτουργία
Η αυστηρή έξοδος, η ανεκτική ανάγνωση και η διατήρηση χωρίς απώλειες αποτελούν όλα μέρος της ίδιας μηχανής OOXML για Delphi και C++Builder· η πλήρης λίστα χαρακτηριστικών βρίσκεται στη σελίδα του εξαρτήματος υπολογιστικών φύλλων HotXLS για Delphi