9
votes

Dates de lecture des fichiers OpenXML Excel

J'essaie de lire des données des fichiers .xlsx à l'aide de SharpziPLib pour le décompresser (en mémoire) et la lecture des fichiers XML intérieurs. Tout va bien mais reconnaissant les dates - elles sont stockées dans le format Julean et je dois en quelque sorte reconnaître si un numéro est une date ou un numéro seulement. Dans un autre sujet (malheureusement, il est mort et j'ai besoin d'une réponse rapide) Je dois connaître certaines choses de Mark Baker, mais ça ne suffit pas ...

"Excel stocke les dates comme une valeur de flotteur ... La partie entière étant le nombre de jours du 1/1/1900 (ou le 1/1/1904 selon lequel le calendrier est utilisé), la partie fractionnée étant la proportion d'une journée (c'est-à-dire la partie temporelle) ... fit légèrement plus gênant par le fait que 1900 est considéré comme une année bissextile.

La seule chose qui différencie une donnée d'un numéro est le masque de format de numéro. Si vous pouvez lire le masque de format, vous pouvez l'utiliser pour identifier la valeur comme une date plutôt qu'un chiffre ... puis calculez la valeur de la date / mise en forme de la date de base. "

"mais l'attribut" S "pour les dates a toujours la valeur de" 1 "? Je sais qu'il définit le style, mais peut-être ?;

L'attribut S fait référence à une entrée de style XF dans styles.xml, et il ne sera pas toujours l'entrée 1 pour les dates ... Tout dépend du nombre de styles différents sont utilisés dans le cahier de travail. Le style XF à son tour fait référence à un masque de format numérique. Pour identifier une cellule contenant une date, vous devez effectuer la recherche Style XF -> NumberFormat, puis déterminez si ce masque NumberFormat est un masque numérique de date / heure (plutôt que, par exemple, un pourcentage ou un masque comptable NumberFormat) < / p>

"une autre question - je regarde maintenant le contenu de style.xml et dans la section que je vois des éléments comme:" "," ", etc. Mais il n'y a pas de section ... y a-t-il des formats" standard "? Ou suis-je juste en manquant quelque chose? "

Quelqu'un peut-il m'aider s'il vous plaît? Merci d'avance.


4 Réponses :


16
votes

Vous devriez trouver la section numfmts quelque part près du sommet de style.xml, dans le cadre de l'élément stylesheet xxx

modifier

J'ai été double-vérifiant mon code de lecture XLSX (cela fait longtemps que depuis que j'ai plongé dans cette partie de la bibliothèque); et il y a des formats intégrés. Les codes de format numéro (numfmtid) inférieur à 164 sont "intégrés".

La liste que j'ai est incomplète: xxx


17 commentaires

C'est là que doit avoir lieu les numéros. Le classeur a-t-il été généré avec Excel lui-même? Si vous ouvrez le fichier en question dans MS Excel, reconnaît-il les valeurs de cellule comme dates?


Oui et les cellules sont formatées comme des dates (si je mets un numéro comme 40180 là-bas, il le convertit également à ce jour).


Désolé pour la réponse lente et hésitante ... Cela fait longtemps que j'ai examiné ce morceau de code et j'avais simplement oublié l'ensemble des "construits". Votre question m'a maintenant poussé à suivre les autres que je n'ai pas dans la liste.


Dans le reste de mon code, lorsque je teste pour voir si un masque de format est un format de date ou d'heure, je vérifie la présence de l'un des caractères YMDHIS dans le masque de format; Mais faites attention à l'un de ces caractères dans un nom de couleur (par exemple, ## 0; [cyan] (#, ## 0) ') ou des masques de format commençant par' _ 'ou' 0 '.


À propos de "Les autres" - je pense que tous sont énumérés dans le fichier "Partie 4" ici: ECMA-International.org/news/tc45_current_work/... (pages 2134+)


Merci oui! Je viens de lire dans la partie correspondante de la partie 4 de la SPEC de la CECMA, et ils sont principalement des variantes de format de date pour les langues extrêmes de l'Est (Chines, coréennes, japonais, etc.)


Je suis content de pouvoir vous aider également d'une manière ou d'une autre. Si je savais sur les formats prédéfinis, je trouverais probablement ce dossier plus tôt;)



Ce sont des formats de devises. Je me demandais simplement si, si je devais formater une cellule à l'aide d'Excel, les styles générés me disent quels formats intégrés traduits dans les valeurs numfmt. Comme c'est arrivé, ce n'était pas aussi simple car certaines des options de formatage Excel «standard» ne sont pas intégrées, de sorte que Excel génère 164+ identifiants pour eux. J'ai remarqué 7 & 8 et j'allais poster que c'était les identifiants intégrés pour les devises utilisant ces formats, mais mon pour obtenir une nouvelle ligne crée le message ... et je ne pouvais pas le modifier.


Merci d'avoir clarifié que @Ross. Si ceux-ci sont intégrés, je soupçonne qu'ils sont peut-être légèrement plus dynamiques (sélectionnant peut-être une devise basée sur le code du pays) mais je vais vérifier sur eux


Eh bien ... je suis au Royaume-Uni, alors je m'attendrais à ce que le "£" est le symbole monétaire de l'environnement / culture actuel. Selon l'endroit où vous êtes, je vous attendrais peut-être un symbole "$".


Juste hors d'intérêt, mais dans la liste ci-dessus, (c.-à-d. Numfmt 57), à quoi se rapportent le '[$ -404]'? De même, qu'est-ce que le 'E' dans 'E / M / D' concerne? Cela semble être l'année, mais pourquoi "E"? Époque?


Le [$ -404 €] est un paramètre local ... 404 est l'identifiant local pour "chinois - Taiwan" ( msdn.microsoft.com/en-us/goglobal/bb964664.aspx pour la liste des identifiants locaux)


Je ne suis pas certain de E, mais l'utiliser dans un masque de date au lieu de Yyyy me donne une valeur de 5280, ce qui serait une année de base de 3269BC. Pas sûr s'il s'agit de la création biblique supposée de la Terre ou du début du chinois / maya / quel que soit le calendrier


Vous avez une faute de frappe sur le n ° 14, celle du questionneur à propos de.


Vous avez une faute de frappe sur le n ° 14 (celui que le questionneur a demandé à propos de). Il devrait lire "M / D / AAAA" à la place (sans les tirets).


Microsoft Link pour les codes: docs.microsoft.com/en-us/previous-versions/office/developer/ ...



9
votes

Les cellules peuvent avoir des styles. Ce sont des utins qui indiquent les cellxfs dans la feuille de style. Chaque élément cellXFS contient un ensemble d'attributs. Le plus important est NumberFormatide. Si sa valeur tombe dans la plage 14-22, il s'agit d'une date «standard». Si elle tombe dans la plage de 165 à 180, il s'agit d'une date "formatée" et aura un attribut numéroingFormat correspondant.

date standard

[x: cr = "A2" S = "2" ] [x: v] 38046 [/ x: V] [/ x: c]

[x: numfmtid = "14" FONTID = "0" FLIDID = "0" 0 "Borderid =" 0 " xFid = "0" ApplyNumberFormat = "1" /] (position ordinale 2)

date formatée

[x: cr = "A4" S = "4"] [x: v] 38048 [/ x: v] [/ x: c]

[x: xf numfmtid = "166" fontid = "0" FLIDID = "0" bordide = "0" xfid = "0 "ApplyNumberFormat =" 1 "/] (position ordinale 4)

[x: numfmt numfmtid =" 166 "formatcode =" m / d; @ "/]

Ce code extrait une liste des identifiants de style correspondant à ces formats de date. xxx


3 commentaires

Comment obtenir URIPARTARDICTARY?


D'accord. Je sais déjà. _document = tableur à tableurDocument.open (FilePath, True); URIPARTDICTIONMENTAIRE = BUILDURIPARTIPARDITIONNICATION (_Document); Stackoverflow.com/a/13607098/907732


Lien: MSDN non documenté correctement. Mais le POI prétend la même chose dans Lien: problème . Pas de confirmation officielle dans l'ECMA. Comme je le sais.



5
votes

Je suggérerais que numfmtid = "14" doit être considéré comme "format de date courte de Windows" comme en Australie, ce format affichera une date comme: "DD / mm / yy", et non "mm / jj / yy ".


1 commentaires

Ouais. Je suis d'accord avec vous sur ce point. Semble il y a quelques versions de cette liste surtout sur Internet et aucun d'entre eux ne tient compte de la localisation sur le type 14. Je suppose que les autres sont fausses aussi bien.



1
votes

Il existe deux façons d'obtenir le format de date pour une cellule.

Vous commencez par saisir le "s" ou styleIndex. Notez la date au format RAW numérique ci-dessous (40667): P>

    <numFmts count="2">
        <numFmt numFmtId="164" formatCode="mm/yyyy;@" /> 
        <numFmt numFmtId="165" formatCode="0.000" /> 
        <numFmt numFmtId="166" formatCode="#,##0.000" /> 
    </numFmts>


0 commentaires