Ich versuche, Daten aus den .xlsx-Dateien mit SharpZipLib zu lesen, um sie (im Speicher) zu entpacken und die inneren XML-Dateien zu lesen. Alles ist gut, aber die Daten erkennen - sie sind im julesischen Format gespeichert und ich muss irgendwie erkennen, ob eine Nummer ein Datum oder nur eine Nummer ist. In einem anderen Thema (leider ist es gestorben und ich brauche eine schnelle Antwort) Ich habe einige Dinge von Mark Baker erfahren, aber es ist immer noch nicht genug ...
"Excel speichert Datumsangaben als Float-Wert ... der ganzzahlige Teil ist die Anzahl der Tage seit dem 1.1.1900 (oder 1.1.1904, abhängig davon, welcher Kalender verwendet wird), wobei der Bruchteil der Anteil ist eines Tages (dh der Zeitteil) ... etwas unbeholfener gemacht durch die Tatsache, dass 1900 als Schaltjahr gilt.
Die einzige Sache, die Daten von einer Zahl unterscheidet, ist die Zahlenformatmaske. Wenn Sie die Formatmaske lesen können, können Sie den Wert als Datum und nicht als Zahl angeben ... und dann den Datumswert / die Formatierung aus dem Basisdatum berechnen. "
"Aber hat das Attribut" s "für Datumsangaben nicht immer den Wert" 1 "? Ich weiß, dass es Stil definiert, aber vielleicht?;)"
Das Attribut s verweist auf einen Style-X-Eintrag in der Datei styles.xml, und es ist nicht immer der Eintrag 1 für Datumsangaben. Alles hängt davon ab, wie viele verschiedene Stile in der Arbeitsmappe verwendet werden. Der Stil xf verweist wiederum auf eine Zahlenformatmaske. Um eine Zelle zu identifizieren, die ein Datum enthält, müssen Sie den Stil xf - & gt; numberformat lookup, dann identifiziere, ob diese numberformat-Maske eine date / time numberformat-Maske ist (und nicht beispielsweise eine prozentuale oder eine accounting numberformat-Maske)
"Noch eine Frage - ich schaue mir jetzt den Inhalt von style.xml an und im Abschnitt sehe ich Elemente wie:" & lt; xf numFmtId="14" ... applyNumberFormat="1 "/ & gt;", "& lt; xf numFmtId=" 1 "... applyNumberFormat=" 1 "/ & gt;" usw., aber es gibt keinen Abschnitt & lt; numFmts & gt; ... Gibt es irgendwelche & ldquor; Standard "-Formate? Oder verpasse ich gerade etwas? "
Kann mir bitte jemand helfen? Vielen Dank im Voraus.
Sie sollten den Abschnitt numFmts irgendwo im oberen Bereich von style.xml als Teil des styleSheet-Elements
finden %Vor%BEARBEITEN
Ich habe meinen xlsx-Lesercode überprüft (es ist lange her, dass ich mich in diesen Teil der Bibliothek vertieft habe); und es gibt integrierte Formate. Zahlenformatcodes (numFmtId) kleiner als 164 sind "eingebaut".
Die Liste, die ich habe, ist unvollständig:
%Vor%Zellen können Stile haben. Dies sind uints, die cellXfs im styleSheet indizieren. Jedes cellXfs-Objekt enthält eine Reihe von Attributen. Das wichtigste ist NumberFormatID. Wenn der Wert zwischen 14 und 22 liegt, handelt es sich um ein "Standard" -Datum. Wenn es in den Bereich 165 - 180 fällt, handelt es sich um ein "formatiertes" Datum und ein entsprechendes NumberingFormat-Attribut.
[x: cr="A2" s="2"] [x: v] 38046 [/ x: v] [/ x: c]
[x: xf numFmtId="14" fontId="0" fillId="0" borderId="0" xfId="0" applyNumberFormat="1" /] (Ordnungszahl 2)
[x: cr="A4" s="4"] [x: v] 38048 [/ x: v] [/ x: c]
[x: xf numFmtId="166" fontId="0" fillId="0" borderId="0" xfId="0" applyNumberFormat="1" /] (Ordnungszahl 4)
[x: numFmt numFmtId="166" formatCode="m / d; @" /]
Dieser Code extrahiert eine Liste von Stil-IDs, die diesen Datumsformaten entsprechen.
%Vor%Es gibt zwei Möglichkeiten, das Datumsformat für eine Zelle zu erhalten.
Beginne mit dem "s" oder StyleIndex. Notieren Sie sich das Datum im numerischen Rohformat unten (40667):
%Vor%Das Attribut "s" in den Zellenknoten zeigt auf ein nullbasiertes Array von stileds.xml-Knoten, beginnend bei 0. Dies ist der Schlüssel zum Auffinden des Datumsformats, falls vorhanden, das den rohen numerischen Datumsdaten zugeordnet wird. Sie sehen s = 1, die auf den 2. xf-Knoten im folgenden Zellenformatierungs-Abschnitt "styles.xml" Ihrer Excel-Arbeitsmappe zeigt:
%Vor%Im zweiten Knoten sehen Sie den Wert numFmtId="14". Das ist die Zahlformat-ID. Es besagt, dass das die ID ist, die benötigt wird, um festzustellen, wie Ihre Datumsnummer dargestellt werden sollte. Diese Nummer verweist jedoch auf zwei mögliche Stellen für das Datumsformat. Wenn seine Nummer im Bereich 14-22 ist, ist es ein eingebauter Stil für das Datum. Wenn es außerhalb dieses Bereichs liegt, wird (möglicherweise) ein benutzerdefiniertes Datumsformat vom Eigentümer der Excel-Datei hinzugefügt. Sie werden es nicht wissen, bis Sie beide Orte überprüft haben.
Wenn es im ersten Fall ein Wert zwischen 14 und 22 ist, müssen Sie es einem der vordefinierten Datumsformate zuordnen, die jede Excel-Datei hat (mm-dd-yy usw.). Sie können diese Tabelle im Open XML SDK finden. Hier ist ein Beispiel von denen, denen die numFmtId den eingebauten Datumsformaten zugeordnet ist ....
%Vor%An diesem Punkt wissen Sie, dass es ein Datum ist und in welchem Format es dargestellt werden soll. Wenn es nicht einer dieser Werte ist, ist es wahrscheinlich eine benutzerdefinierte Nummer. Nun müssen Sie die Datei styles.xml erneut nach einem Stilknoten mit einem passenden numFmtId-Wert durchsuchen. Diese Knoten enthalten das benutzerdefinierte Datumsformat wie folgt:
%Vor%Beachten Sie, dass Sie, wenn Ihre numFmtId 164 war, sein benutzerdefiniertes Datumsformat gefunden haben. Um alle diese verrückten Datumsformate zu erfassen, ist es am besten, eine Reihe akzeptabler "Formate" als Zeichenfolgen zu erhalten, Ihren formatCode zu finden und dann zu sehen, ob er mit einem der zulässigen in Ihrem Code übereinstimmt. p>
Viel Glück!