C # Open XML 2.0 NumberFormatId gamme
De travail avec Open XML 2.0 à l'aide de c# pour traiter de gros fichiers excel. Question, je suis en cours d'exécution dans la cellule, je suis d'analyse n'a pas un Type de données j'ai ensuite vérifier la NumberFormatId pour déterminer si elle est décimal, le nombre ou la date. Je suis à la recherche de l'exacte NumberFormatId gamme de nombres de décimales vs dates. Ils semblent être tous sur la place certains nombres décimales ont des formats de 189,212,214,305 et les dates d'avoir des valeurs de 185, 194, 278 etc. Personne ne sait si le cahier des charges définit ces plages?
Édité - Plus D'Informations
Ci-dessous est un exemple du format de nombre de 194 à partir de la style.xml fichier à l'intérieur de la xl dossier.
Les feuilles de calcul excel sont de différentes régions du monde donc je pense que le nombre de formats sont différents, mais ils ne se chevauchent? Va numFmtId 194 être autre chose qu'une date sur les différents paramètres de culture?
Ci-dessous est la façon dont je suis la conversion de c.CellValues comme "40574" pour les dates, mais la question est comment puis-je savoir si "40574" est un jour et pas un numéro?
DateTime.FromOADate(Convert.ToDouble(c.CellValue.Text));
Actuellement, je suis en train de faire cela en vérifiant si il n'y a pas de Type de données que de vérifier la CellFormat mais il y a des problèmes lors de certaines NumberFormatId ne sont pas dans ma case.
private Object FormatCellValue(Cell c, SharedStringTable ssTable, CellFormats cellFormats)
{
if (c.CellValue != null)
{
//If there is no data type, this must be a string that has been formatted as a number
if (c.DataType == null)
{
CellFormat cf;
if (c.StyleIndex == null)
{
cf = cellFormats.Descendants<CellFormat>().ElementAt<CellFormat>(0);
}
else
{
cf = cellFormats.Descendants<CellFormat>().ElementAt<CellFormat>(Convert.ToInt32(c.StyleIndex.Value));
}
if ((cf.NumberFormatId >= 14 && cf.NumberFormatId <= 22) ||
(cf.NumberFormatId >= 165 && cf.NumberFormatId <= 180) ||
cf.NumberFormatId == 278 || cf.NumberFormatId == 185 || cf.NumberFormatId == 196 ||
cf.NumberFormatId == 217 || cf.NumberFormatId == 326) //Dates
{
try
{
DateTime dt;
dt = DateTime.FromOADate(Convert.ToDouble(c.CellValue.Text));
...CODE CONTINUES
Modifier
Dans ma mise à jour post j'ai oublié de poster la valeur que j'ai trouvé dans le style.xml fichier:
<numFmt numFmtId="323" formatCode="mmm/yy;@"/>
Donc, avec cela, ma question serait de savoir comment puis-je obtenir le formatCode et de l'analyser pour déterminer si c'est une date?
Ci-dessous est la sortie de la fenêtre de débogage de la numberformat 323
{DocumentFormat.OpenXml.Spreadsheet.CellFormat}
base {DocumentFormat.OpenXml.OpenXmlCompositeElement}: {DocumentFormat.OpenXml.Spreadsheet.CellFormat}
Alignment: {DocumentFormat.OpenXml.Spreadsheet.Alignment}
ApplyAlignment: "1"
ApplyBorder: "1"
ApplyFill: "1"
ApplyFont: "1"
ApplyNumberFormat: "1"
ApplyProtection: "1"
BorderId: "64"
ExtensionList: null
FillId: "0"
FontId: "83"
FormatId: "37992"
LocalName: "xf"
NumberFormatId: "323"
PivotButton: null
Protection: {DocumentFormat.OpenXml.Spreadsheet.Protection}
QuotePrefix: "1"
source d'informationauteur maguy
Vous devez vous connecter pour publier un commentaire.
Listes de formats des valeurs d'ID de
Ci-dessous la liste des options de format (source)
Cependant, ceux de la liste de préciser que plusieurs formats. Selon ce post: La lecture des dates de OpenXml fichiers Excelformat avec la valeur de l'ID de moins de 164 sont intégrés. Vous pouvez également trouver une longue liste de formats.
Vérification des formats des valeurs d'ID dans le fichier xlsx
Pour les formats avec la plus grande des valeurs d'ID, vous pouvez trouver leurs définitions dans le fichier lui-même. Pour les voir, vous devez l'ouvrir avec une archive zip de navigateur et de trouver styles.xml fichier dans xl répertoire. Sinon ouvrir ce fichier xlsx avec Open XML SDK 2.0 les Outils de Productivité et accéder à ce fichier /xl/styles.xml/x:StyleSheet nœud.
Dans cette section, vous devriez être en mesure de voir les formats définis dans votre document avec des valeurs d'ID affecté. La partie avec les formats devrait ressembler à ceci:
En regardant les formats enregistrés ici, il semble que l'id vlaues peut être spécifique à un xlsx fichier, ce qui est probablement la même valeur d'ID peut être utilisé pour définir des formats différents dans deux différents fichiers xlsx. Toutefois, pour les construit-int formats ils sont prédéfinies, de sorte que devrait être le même dans tous les fichiers.
Si vous avez besoin d'une aide à la recherche de ces formats dans votre dossier ou des renseignements supplémentaires, faites le moi savoir.
MODIFIER
Vous pouvez également trouver plus d'informations sur les formats de nombre dans ce document: http://msdn.microsoft.com/en-us/library/documentformat.openxml.spreadsheet.numberingformat.aspx.
EDITION II
Vous pouvez utiliser ce code pour obtenir un dictionnaire contenant tous les formats définis dans le xlsx fichier:
Si vous voulez vérifier si l'une de celles-ci est une date, je suppose qu'un simple moyen serait de vérifier si le code de format (valeur dans le dictionnaire créé par la méthode que j'ai posté) contient mm et yy sous-chaînes.