spreadsheetdocument - read excel with openxml c#
Aplicar el formato de nĂºmero% a un valor de celda usando OpenXML (4)
Quiero aplicar el formato de número% (porcentaje) utilizando XML abierto C #
Tengo un valor numérico 3.6 que quiero mostrar ese número en Excel como `3.6%.
¿Cómo logro eso?
Desafortunadamente no hay una respuesta directa. Si descarga la Herramienta de productividad OpenXML para Microsoft Office, puede analizar una hoja de cálculo simple y ver cómo formatea el número. Para hacer lo que quieras, necesitarás:
- Crear una hoja de estilo
- Agrega un nuevo NumberFormat con tu definición personalizada
- Cree un CellStyleFormat, completo con borde, relleno, fuente todo definido, además del NumberFormat arriba
- Crear un CellFormats, que se refiere a lo anterior
- Finalmente, establezca el StyleIndex de su celda con el ID de su CellFormat que utiliza NumberFormat.
¡UF!
Una opción generalmente mejor es mirar ClosedXML en http://closedxml.codeplex.com/ (nombre horrible). Es una biblioteca de código abierto (¡NO GPL! - revisa la licencia) que pone extensiones útiles en OpenXML. Para formatear una celda de una hoja de trabajo, en su lugar deberías hacer:
worksheet.Cell(row, col).Value = "0.036";
worksheet.Cell(row, col).Style.NumberFormat.Format = "0.0%";
(de http://closedxml.codeplex.com/wikipage?title=Styles%20-%20NumberFormat&referringTitle=Documentation )
ACTUALIZACIÓN ClosedXML se ha movido a GitHub en https://github.com/ClosedXML/ClosedXML
Excel contiene formatos predefinidos para formatear cadenas de varias maneras. El atributo s
en un elemento de celda se referirá a un estilo que se referirá a un formato de número que corresponderá al formato de porcentaje que desea. Vea esta question/answer para más información.
Aquí está el objeto CellFormat que deberá crear para que la máscara de 0.00% se aplique a su número. En este caso, desea el formato predefinido número 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í hay una manera rápida de insertar el CellFormat en el libro de trabajo:
CellFormats cellFormats = workbookPart.WorkbookStylesPart.Stylesheet.Elements<CellFormats>().First();
cellFormats.Append(cellFormat);
uint styleIndex = (uint)cellFormats.Count++;
A continuación, deberá obtener la celda que tiene la 3.6 y establecer su atributo s
(StyleIndex) al formato de celda recién insertado:
Cell cell = workSheetPart.Worksheet.Descendants<Cell>().SingleOrDefault(c => cellAddress.Equals("A1"));
cell.StyleIndex = styleIndex;
Puedes hacerlo de una manera sencilla. Si quieres aplicarlo en una sola celda, haz esto,
worksheet.Cell(9, 10).Style.NumberFormat.Format = "#,##0.00//%";
Y si desea aplicarlo en un rango de celdas, haga esto,
worksheet.Range(9, 10, 15, 10).Style.NumberFormat.Format = "#,##0.00//%";
También puede encontrar más formatos Here , y también puede encontrar los mismos en Excel.
WorkbookStylesPart sp = workbookPart.AddNewPart<WorkbookStylesPart>();
Crear una hoja de estilo,
sp.Stylesheet = new Stylesheet();
Crear un formato de numeración,
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 el ID de 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 agregue el valor a la celda, tenga el siguiente código del centro aquí en la versión y aplique el índice de estilo en mi caso, tuve un índice de tres estilos, por lo que el 3 fue 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);