2011-10-24 44 views

Respuesta

21
WorkbookStylesPart sp = workbookPart.AddNewPart<WorkbookStylesPart>(); 

Crear una hoja de estilo,

sp.Stylesheet = new Stylesheet(); 

Crear un numberingformat,

sp.Stylesheet.NumberingFormats = new NumberingFormats(); 
// #.##% is also Excel style index 1 


NumberingFormat nf2decimal = new NumberingFormat(); 
nf2decimal.NumberFormatId = UInt32Value.FromUInt32(3453); 
nf2decimal.FormatCode = StringValue.FromString("0.0%"); 
sp.Stylesheet.NumberingFormat.Append(nf2decimal); 

Crear un formato de celda y aplicar la Identificación del formato de numeración

cellFormat = new CellFormat(); 
cellFormat.FontId = 0; 
cellFormat.FillId = 0; 
cellFormat.BorderId = 0; 
cellFormat.FormatId = 0; 
cellFormat.NumberFormatId = nf2decimal.NumberFormatId; 
cellFormat.ApplyNumberFormat = BooleanValue.FromBoolean(true); 
cellFormat.ApplyFont = true; 

//append cell format for cells of header row 
sp.Stylesheet.CellFormats.AppendChild<CellFormat>(cellFormat); 


//update font count 
sp.Stylesheet.CellFormats.Count = UInt32Value.FromUInt32((uint)sp.Stylesheet.CellFormats.ChildElements.Count); 


//save the changes to the style sheet part 
sp.Stylesheet.Save(); 

y cuando usted adiciona el valor de la celda tienen la siguiente hereonversion código de centro y aplicar el índice estilo en mi caso tenía tres índice de estilo de ahí el 3 uno era mi índice de estilo de porcentaje, es decir, 2 ya que los índices comienzan desde 0

string val = Convert.ToString(Convert.ToDecimal(value)/100); 
Cell cell = new Cell(); 
cell.DataType = new EnumValue<CellValues>(CellValues.Number); 
cell.CellValue = new CellValue(val); 
cell.StyleIndex = 2; 
row.Append(cell); 
+0

Este flujo funcionó porque podemos tener cualquier formateo celular usando este proceso. Gracias ssyladin – Selwyn

+0

Sin preocupaciones. En realidad, pasamos ~ 30 minutos tratando de hacer el formateo "manualmente" solo con OpenXML y finalmente nos damos por vencidos. Conservó obtener una hoja de cálculo corrupta. Esta es una buena respuesta para mí, ya que ayuda a evitar dependencias externas de la biblioteca. – jklemmack

+1

¿Su comentario sobre el índice de estilo de Excel significa que, si desea usar el estilo predeterminado de porcentaje de Excel, que no necesita agregar un nuevo formato, simplemente configure la celda para el índice de estilo 1? – cidthecoatrack

14

Desafortunadamente no hay una respuesta directa. Si descarga la herramienta de productividad OpenXML para Microsoft Office, puede diseccionar una hoja de cálculo simple y ver cómo formatea el número. Para hacer precisamente lo que quiere usted tendría que:

  • Crear una hoja de estilo
  • Añadir un nuevo NumberFormat con su definición personalizada
  • Crear un CellStyleFormat, completa con la frontera, de relleno, fuente de todo definido, además al NumberFormat anterior
  • Crear un CellFormats, que hace referencia al anterior
  • Finalmente, establezca el StyleIndex de su Celda en el ID de su CellFormat que usa NumberFormat.

WHEW!

Una opción generalmente mejor es mirar ClosedXML al http://closedxml.codeplex.com/ (nombre horrible). Es una biblioteca de código abierto (¡NO GPL! - verifique la licencia) que pone extensiones útiles en OpenXML. Para dar formato a una celda de una hoja de trabajo, que le hace lugar:

worksheet.Cell(row, col).Value = "0.036"; 
worksheet.Cell(row, col).Style.NumberFormat.Format = "0.0%"; 

(desde http://closedxml.codeplex.com/wikipage?title=Styles%20-%20NumberFormat&referringTitle=Documentation)


ACTUALIZACIÓN ClosedXML se ha trasladado a GitHub en https://github.com/ClosedXML/ClosedXML

+0

esto puede funcionar, no obstante requiere una adición de terceros, no un OpenXml "simple". – fcm

4

Excel contiene predefinido formatos para formatear cadenas de varias maneras. El atributo s en un elemento de celda hará referencia a un estilo que se referirá a un formato de número que corresponderá al formato de porcentaje que desee. Consulte esto question/answer para obtener más información.

Aquí está el objeto CellFormat que deberá crear para aplicar la máscara de 0.00% a su número. En este caso, desea que el número de formato predefinido 10 o 0.00%:

CellFormat cellFormat1 = new CellFormat(){ NumberFormatId = (UInt32Value)10U, FontId = (UInt32Value)0U, FillId = (UInt32Value)0U, BorderId = (UInt32Value)0U, FormatId = (UInt32Value)0U, ApplyNumberFormat = true }; 

Aquí es una forma rápida de insertar el CellFormat en el libro:

CellFormats cellFormats = workbookPart.WorkbookStylesPart.Stylesheet.Elements<CellFormats>().First(); 
cellFormats.Append(cellFormat); 
uint styleIndex = (uint)cellFormats.Count++; 

A continuación, tendrá que obtener la célula que tiene el 3.6 en él y establece que es s atributo (StyleIndex) para el formato de celda recién insertado:

Cell cell = workSheetPart.Worksheet.Descendants<Cell>().SingleOrDefault(c => cellAddress.Equals("A1")); 
cell.StyleIndex = styleIndex; 
2

Puede hacerlo de una manera sencilla. Si desea aplicarlo en una sola célula entonces hacer esto,

worksheet.Cell(9, 10).Style.NumberFormat.Format = "#,##0.00\\%"; 

Y si desea aplicarlo en un rango de celdas y luego hacer esto,

worksheet.Range(9, 10, 15, 10).Style.NumberFormat.Format = "#,##0.00\\%"; 

podrá ver también más formatos Here , y también puedes encontrar lo mismo desde Excel también.

+1

Esto no es OpenXml como se indica en la pregunta. – fcm

Cuestiones relacionadas