2012-01-19 57 views
13

He estado buscando en Google y buscando en el sitio la respuesta, pero no encontré una solución: en todas partes las personas discuten sobre cómo agregar nuevas formatear el número en el documento y aplicarlo.Cómo obtener el valor de celda con el formato aplicado (valor de celda formateado) con OpenXML SDK

Lo que necesito es obtener el valor de la celda como una cadena con formato aplicado, es decir, la misma cadena que Excel.

Ya he pensado que no hay una forma fácil o una función incorporada que devuelva el valor formateado de una celda.

Me parece que para obtener el valor necesito hacer dos cosas: 1. Obtenga la cadena de formato. 2. Formatee el valor de la celda usando esta cadena.

Pero tengo problemas con ambos pasos.

uno puede conseguir fácilmente ejemplo CellFormat que contendría IdFormatoNumerico:

CellFormat cellFormat = (CellFormat) document.WorkbookPart.WorkbookStylesPart.Stylesheet.CellFormats.ElementAt(cell.StyleIndex); 

Pero cómo obtener la cadena de formato con este IdFormatoNumerico, si el ID corresponde a uno de los formatos predefinidos estándar? (es decir, está por debajo de 160) No están en el documento de la hoja de cálculo y no puedo creer que estén codificados en la aplicación.

Además, una vez que se obtiene de alguna manera la cadena de formato, ¿cómo aplicarla al valor de celda? Hasta ahora entiendo, el código debe verificar el tipo del valor de la celda y si es Number - conviértalo en string usando la cadena de formato.

Encontré this page que menciona el uso de Microsoft.Office.Excel.Interop, pero preferiría quedarme solo con OpenXML SDK.

En general, estoy muy sorprendido de que sea tan difícil encontrar una respuesta definitiva a esta pregunta en la Web, ya que pensé que esto sería algo que muchos desarrolladores necesitan en su trabajo diario.

+0

encontrar algún código agradable aquí: http://joymonscode.blogspot.se/2013/10/reading-excel-cell-with-number.html –

Respuesta

8

hombres, esto es dura ... voy a añadir aquí cosas que me pareció que podría valer la pena ..

En primer lugar es conseguir que el formato de numeración de la célula (una vez que tenga la CellFormat:

string format = excel.WorkbookPart.WorkbookStylesPart.Stylesheet.NumberingFormats.Elements<NumberingFormat>() 
      .Where(i => i.NumberFormatId.ToString() == cellFormat.NumberFormatId.ToString()) 
      .First().FormatCode; 

para obtener más información acerca de este se puede ir a: NumberingFormats

Im tratando de averiguar cómo aplicar este formato a la propiedad cell.CellValue ... creo que esa es la forma en que tiene que ir

!

Ok, al leer el código de ClosedXml (su fuente abierta), parece que es fácil obtener el formato.

Simplemente convierta el texto de valor a su tipo (int, double, etc.) y llame al método ToString pasando el formato. Estaba intentando hacer eso con String.Format y no funcionó. He probado ToString y funciona, pero todavía falta algo.

Te recomiendo que veas esta clase y obtengas el código del método GetFormattedString() como @El G tell en su comentario.

Bassicaly tendrá que añadir algo como esto:

double d = double.Parse(cell.CellValue.InnerText); 
string val = d.ToString(format); 

espero que le ayuda ...

+0

Muchas gracias por compartir esta información, Guido ! Por favor, avíseme si encontrará una forma de aplicar el formato. –

+4

En una nota lateral, si en su solución no tiene que limitarse solo a OpenXML SDK, puede usar la biblioteca [ClosedXML] (http://closedxml.codeplex.com/) donde todas las acciones parecen ser mucho más fácil que en OpenXML puro (y está construido sobre OpenXML). En documentación ClosedXML en el [los valores de celda ejemplo] (http://closedxml.codeplex.com/wikipage?title=Cell%20Values&referringTitle=Documentation) hay esta línea: 'cadena booleanFormattedString = cellBoolean.GetFormattedString();' Aparentemente hace lo que estamos buscando. También profundizar en el código de este método puede ayudar a comprenderlo. –

+0

¡He agregado información útil! ¡piense que su problema será resuelto en este punto! –

0

Si usted quiere tomar valor de la celda con el formato aplicado, misma que se muestra en Excel, el uso .Text propiedad del objeto Cell. De esta manera:

String formattedValue = cell.Text 
+0

No parece haber una propiedad de texto en la celda clase, solo debajo de CellValue (que no es lo que se muestra en Excel) –

Cuestiones relacionadas