43 votos

¿Lo que indica una celda de XML abierto de Office contiene un valor de fecha y hora?

Estoy leyendo un .xlsx archivo con el formato Office Open XML SDK y estoy confundido acerca de la lectura de valores de Fecha/Hora. Uno de mis hojas de cálculo tiene este lenguaje de marcado (generada por Excel 2010)

<x:row r="2" spans="1:22" xmlns:x="http://schemas.openxmlformats.org/spreadsheetml/2006/main">
  <x:c r="A2" t="s">
    <x:v>56</x:v>
  </x:c>
  <x:c r="B2" t="s">
    <x:v>64</x:v>
  </x:c>
  .
  .
  .
  <x:c r="J2" s="9">
    <x:v>17145</x:v>
  </x:c>

La celda J2 tiene una fecha de valor de serie y un atributo style s="9". Sin embargo, el formato Office Open XML de la Especificación dice que 9 corresponde a un hipervínculo visitado. Esta es una captura de pantalla de la página 4,999 de ECMA-376, Segunda Edición, Parte 1 - Fundamentos Y de Lenguaje de Marcado de Referencia.pdf.

alt text

El presetCellStyles.xml archivo incluido con la especificación se refiere también a builtinId 9 como un hipervínculo visitado.

<followedHyperlink builtinId="9">

Todos los estilos en la especificación son simplemente visual, los estilos de formato, no el número de estilos. Donde está el número de estilos definidos y ¿cómo diferenciar un estilo de referencia s="9" de lo que indica un formato de celda (visual) de estilo frente a un estilo de número?

Obviamente estoy buscando en el lugar equivocado para que coincida con los estilos en las células con sus formatos de número. Donde es el lugar correcto para encontrar esta información?

55voto

Mark Baker Puntos 90240

El s atributo hace referencia a un estilo xf entrada en styles.xml. El estilo xf a su vez hace referencia a un formato de número de la máscara. Para identificar una celda que contiene una fecha, usted necesita para realizar el estilo xf -> numberformat de búsqueda, a continuación, identificar si que numberformat máscara es una fecha/hora formato de número de la máscara (en lugar de, por ejemplo, un porcentaje o una contabilidad numberformat máscara).

El style.xml el archivo tiene elementos como:

<xf numFmtId="14" ... applyNumberFormat="1" />
<xf numFmtId="1" ... applyNumberFormat="1" />

Estos son los xf entradas, que a su vez te dan un numFmtId que hace referencia el número de la máscara de formato.

Usted debe encontrar el numFmts sección en algún lugar cerca de la parte superior de style.xml como parte de la hoja de estilos de elemento

<?xml version="1.0" encoding="UTF-8" standalone="yes" ?> 
    <styleSheet xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main">
        <numFmts count="3">
            <numFmt numFmtId="164" formatCode="[$-414]mmmm\ yyyy;@" /> 
            <numFmt numFmtId="165" formatCode="0.000" /> 
            <numFmt numFmtId="166" formatCode="#,##0.000" /> 
        </numFmts>

El formato de número de identificación puede estar aquí, o puede ser uno de los formatos integrados. Códigos de formato de número (numFmtId) menos de 164 "built-in".

La lista que tengo es incompleta:

0 = 'General';
1 = '0';
2 = '0.00';
3 = '#,##0';
4 = '#,##0.00';

9 = '0%';
10 = '0.00%';
11 = '0.00E+00';
12 = '# ?/?';
13 = '# ??/??';
14 = 'mm-dd-yy';
15 = 'd-mmm-yy';
16 = 'd-mmm';
17 = 'mmm-yy';
18 = 'h:mm AM/PM';
19 = 'h:mm:ss AM/PM';
20 = 'h:mm';
21 = 'h:mm:ss';
22 = 'm/d/yy h:mm';

37 = '#,##0 ;(#,##0)';
38 = '#,##0 ;[Red](#,##0)';
39 = '#,##0.00;(#,##0.00)';
40 = '#,##0.00;[Red](#,##0.00)';

44 = '_("$"* #,##0.00_);_("$"* \(#,##0.00\);_("$"* "-"??_);_(@_)';
45 = 'mm:ss';
46 = '[h]:mm:ss';
47 = 'mmss.0';
48 = '##0.0E+0';
49 = '@';

27 = '[$-404]e/m/d';
30 = 'm/d/yy';
36 = '[$-404]e/m/d';
50 = '[$-404]e/m/d';
57 = '[$-404]e/m/d';

59 = 't0';
60 = 't0.00';
61 = 't#,##0';
62 = 't#,##0.00';
67 = 't0%';
68 = 't0.00%';
69 = 't# ?/?';
70 = 't# ??/??';

Los valores que faltan están relacionados principalmente con asia oriental variante de formatos.

6voto

softwaredev Puntos 21

La respuesta es irregular, pero tenga en cuenta que Excel define el formato de número (numFmt) códigos de forma diferente a partir de la OpenXML spec. Por el Open XML SDK 2.5 Herramienta de Productividad de la documentación (en el "Ejecutor de Notas de la" ficha para la NumberingFormat clase):

El estándar define construido-en el formato de IDENTIFICACIÓN de las 14: "mm-dd-yy"; 22: "m/d/yy h:mm"; 37: "#,##0 ;(#,##0)"; 38: "#,##0 ;[Rojo]"; 39: "#,##0.00;(#,##0.00)"; 40: "#,##0.00;[Rojo]"; 47: "mmss.0"; KOR fmt 55: "aaaa-mm-dd".

Excel define construido-en el formato de IDENTIFICACIÓN de
14: "m/d/aaaa"
22: "m/d/yyyy h:mm"
37: "#,##0_);(#,##0)"
38: "#,##0_);[Rojo]"
39: "#,##0.00_);(#,##0.00)"
40: "#,##0.00_);[Rojo]"
47: "mm:ss.0"
55: "aaaa/mm/dd"

La mayoría son variaciones menores, pero el #14 es un doozy. He perdido un par de horas solución de problemas ¿por qué los ceros a la izquierda no se agrega a solo dígitos meses y los días (por ejemplo, 01/05/14 vs 1/5/14).

1voto

Dick Kusleika Puntos 15230

En styles.xml vea si hay un nodo numFmt. Creo que llevará a cabo una numFmtId de "9" que se relaciona con el formato de fecha que se utiliza.

No sé donde que es en la ECMA, pero si usted busca para numFmt, puede encontrar.

0voto

Gordon1000 Puntos 36

No estaba claro a mí cómo determinar con fiabilidad si una celda tiene valor de fecha y hora. Después de pasar algún tiempo experimentando había venido para arriba con el código (ver post) que sería para ambos formatos de fecha integrados y personalizados.

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X