Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

633
Views
Usando EPPlus, ¿cómo puedo generar una hoja de cálculo donde los números son números, no texto?

Estoy creando una hoja de cálculo a partir de List<object[]> usando LoadFromArrays

La primera entrada de la matriz es un título, las otras entradas posiblemente sean números, texto o fechas (pero lo mismo para cada matriz de la lista).

La hoja de Excel generada tiene el triángulo verde que advierte que los números tienen formato de texto.

Recorro todas las celdas y establezco su formato en Número así ws.Cells[i, j].Style.Numberformat.Format = "0";

Sin embargo, el problema persiste y sigo viendo la advertencia verde, aunque el formato de número está establecido en número cuando miro en el cuadro de diálogo Format Cell...

¿Cuáles son mis opciones aquí? Es posible que sepa un poco más sobre qué tipo hay en cada columna, pero ¿cómo establezco un título de columna?

¿Existe una solución mejor que EPPlus? o algún procesamiento posterior más de la hoja de cálculo que puedo hacer antes de descargarla?

over 4 years ago · Santiago Trujillo
3 answers
Answer question

0

Dado que está utilizando matrices de objetos, pueden contener números y cadenas que parecen números, tendrá que revisar cada objeto y determinar su tipo:

 [TestMethod] public void Object_Type_Write_Test() { //http://stackoverflow.com/questions/31537981/using-epplus-how-can-i-generate-a-spreadsheet-where-numbers-are-numbers-not-text var existingFile = new FileInfo(@"c:\temp\temp.xlsx"); if (existingFile.Exists) existingFile.Delete(); //Some data var list = new List<Object[]> { new object[] { "111.11", 111.11, DateTime.Now } }; using (var package = new ExcelPackage(existingFile)) { var ws = package.Workbook.Worksheets.Add("Sheet1"); ws.Cells[1, 1, 2, 2].Style.Numberformat.Format = "0"; ws.Cells[1, 3, 2, 3].Style.Numberformat.Format = "[$-F400]h:mm:ss\\ AM/PM"; //This will cause numbers in string to be stored as string in excel regardless of cell format ws.Cells["A1"].LoadFromArrays(list); //Have to go through the objects to deal with numbers as strings for (var i = 0; i < list.Count; i++) { for (var j = 0; j < list[i].Count(); j++) { if (list[i][j] is string) ws.Cells[i + 2, j + 1].Value = Double.Parse((string) list[i][j]); else if (list[i][j] is double) ws.Cells[i + 2, j + 1].Value = (double)list[i][j]; else ws.Cells[i + 2, j + 1].Value = list[i][j]; } } package.Save(); } }

Con lo anterior, verá la imagen a continuación como salida. Observe la celda de la esquina superior izquierda con la flecha verde porque era una cadena escrita por LoadFromArray que parece un número:

Salida de Excel

over 4 years ago · Santiago Trujillo Report

0

Creé un método de extensión LoadFormulasFromArray , basado en EPPlus LoadFromArray . El método asume que todos los objetos de la lista deben tratarse como fórmulas (a diferencia de LoadFromArray ). El panorama general es que tanto las propiedades de Value como las de Formula toman una string en lugar de un tipo específico. Veo esto como un error porque no hay forma de diferenciar si la cadena es Text o Formula . La implementación de un tipo de Formula permitiría la sobrecarga y la verificación de tipos, lo que permitiría hacer siempre lo correcto.

 // usage: ws.Cells[2,2].LoadFormulasFromArrays(MyListOfObjectArrays) public static class EppPlusExtensions { public static ExcelRangeBase LoadFormulasFromArrays(this ExcelRange Cells, IEnumerable<object[]> Data) { //thanx to Abdullin for the code contribution ExcelWorksheet _worksheet = Cells.Worksheet; int _fromRow = Cells.Start.Row; int _fromCol = Cells.Start.Column; if (Data == null) throw new ArgumentNullException("data"); int column = _fromCol, row = _fromRow; foreach (var rowData in Data) { column = _fromCol; foreach (var cellData in rowData) { Cells[row, column].Formula = cellData.ToString(); column += 1; } row += 1; } return Cells[_fromRow, _fromCol, row - 1, column - 1]; } }
over 4 years ago · Santiago Trujillo Report

0

El truco es no pasar los números como "objetos en bruto" a EPPlus, sino convertirlos correctamente.

Así es como lo hice en un método de exportación DataTable-to-Excel que hice con EPPlus:

 if (dc.DataType == typeof(int)) ws.SetValue(row, col, !r.IsNull(dc) ? (int)r[dc] : (int?)null); else if (dc.DataType == typeof(decimal)) ws.SetValue(row, col, !r.IsNull(dc) ? (decimal)r[dc] : (decimal?)null); else if (dc.DataType == typeof(double)) ws.SetValue(row, col, !r.IsNull(dc) ? (double)r[dc] : (double?)null); else if (dc.DataType == typeof(float)) ws.SetValue(row, col, !r.IsNull(dc) ? (float)r[dc] : (float?)null); else if (dc.DataType == typeof(string)) ws.SetValue(row, col, !r.IsNull(dc) ? (string)r[dc] : null); else if (dc.DataType == typeof(DateTime)) { if (!r.IsNull(dc)) { ws.SetValue(row, col, (DateTime)r[dc]); // Change the following line if you need a different DateTime format var dtFormat = "dd/MM/yyyy"; ws.Cells[row, col].Style.Numberformat.Format = dtFormat; } else ws.SetValue(row, col, null); }

IMPORTANTE : vale la pena señalar que los valores de fecha y DateTime requerirán más trabajo para manejarlos correctamente, ya que nos gustaría tenerlos formateados de cierta manera Y, posiblemente, admitir valores NULL en la columna: el método anterior cumple ambos requisitos.

Publiqué el ejemplo de código completo (archivo de DataTable a Excel con EPPlus) en esta publicación en mi blog .

over 4 years ago · Santiago Trujillo Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!