2012-03-25 31 views
53

Estoy usando EPPlus para generar archivos Excel, en DAL estoy rellenando DataTable, llenando datos en la tabla y pasando la tabla a la capa de presentación. Desde allí estoy usando el método LoadFromDataTable() para generar el archivo Excel.Cómo establecer el tipo de columna cuando se usa EPPlus

Todo funciona bien, excepto que quiero establecer uno de los tipos de columnas en Date. Traté de establecer el tipo de columna de mi DataTable en Date y pasar DataTable a Presentation Layer, pero parece EPPlus, lo ignoré o no lo reconocí, porque cuando abro el archivo generado Excel, el tipo de celda es Number.

Si entreno manualmente las celdas y establezco Tipo a Date, Excel muestra las fechas correctas. Entonces, ¿cómo puedo lograr esto?

Respuesta

70

Necesita la columna DataTable para tener el tipo correcto pero también necesita modificar la propiedad Style.Numberformat.Format de la columna o celda.

Digamos que tiene una ExcelWorksheet nombrado ws:

ws.Column(1).Style.Numberformat.Format = "yyyy-mm-dd"; 
//OR "yyyy-mm-dd h:mm" if you want to include the time! 
+0

Consulte https://epplus.codeplex.com/discussions/571553 para obtener más información. – dudeNumber4

+0

¿Cambiará Excel este formato según la configuración personal de Excel? Piense en UE y EE. UU. – Citroenfris

36

Basado en esta discusión (epplus.codeplex.com/discussions/349927) también se puede configurar el formato de la columna hasta la fecha.

worksheet_1.Cells[row, 3].Style.Numberformat.Format = DateTimeFormatInfo.CurrentInfo.ShortDatePattern;

+5

Para tu información, esto viene de System.Globalization, así que tienes que agregar ese espacio de nombres "usando System.Globalization". – MatthewD

2

Si sus columnas son propensos a moverse (como sabemos los usuarios finales tienden a ser voluble) o simplemente tener muchas columnas de fecha dispersadas a través de la hoja de cálculo, sería de gran ayuda para escribir algo un poco más genérico Esto es lo que acabo de escribir. Encuentra la posición de todos los tipos de DateTime en mi POCO y crea una lista que luego usa para establecer el formato de la columna. Recuerde que las tablas de datos están basadas en cero y Excel no.

 ws.Cells.LoadFromDataTable(tbl, true); 
     var dPos = new List<int>(); 
     for (var i = 0; i < tbl.Columns.Count; i++) 
      if (tbl.Columns[i].DataType.Name.Equals("DateTime")) 
       dPos.Add(i); 
     foreach (var pos in dPos) 
     { 
      ws.Column(pos+1).Style.Numberformat.Format = "mm/dd/yyyy hh:mm:ss AM/PM"; 
     } 

Si usted está haciendo más de una tabla de datos, es probable que desee refactorizar fuera en una función.

Y aquí hay un regalo de promoción ... No me puedo atribuir el mérito de este código. Toma una lista de POCO y la convierte en una tabla de datos. Me ha hecho la vida más fácil en varias ocasiones teniendo esto en mi 'caja de herramientas'. Disfrutar.

 public DataTable ConvertToDataTable<T>(IList<T> data) 
    { 
     var properties = 
      TypeDescriptor.GetProperties(typeof(T)); 
     var table = new DataTable(); 
     foreach (PropertyDescriptor prop in properties) 
      table.Columns.Add(prop.Name, Nullable.GetUnderlyingType(prop.PropertyType) ?? prop.PropertyType); 
     foreach (T item in data) 
     { 
      var row = table.NewRow(); 
      foreach (PropertyDescriptor prop in properties) 
       row[prop.Name] = prop.GetValue(item) ?? DBNull.Value; 
      table.Rows.Add(row); 
     } 
     return table; 
    } 
0

usar BUILD en formatos Excel, es necesario pasar a cadena correcta

sheet.Cells[1, 1].Style.Numberformat.Format 

propiedad.

Ahora, en algún lugar posterior durante la ejecución, probablemente durante la serialización, EPPlus intentará hacer coincidir esta propiedad de formato con el diccionario actual de estilos en el libro de trabajo. Puede depender de la versión exacta de la biblioteca, pero por ejemplo para EPPlust 4.1.0.0 la clave de fecha corta es "mm-dd-aa".

Para 4.1.0.0 se puede encontrar códigos y claves de todos los no modificables para construir en formatos de:

  1. ExcelNumberFormatXml.cs, internal static void AddBuildIn(XmlNamespaceManager NameSpaceManager, ExcelStyleCollection<ExcelNumberFormatXml> NumberFormats) - aquí todos esos códigos están realmente incluidos en el libro, todo no modificable
  2. uso depurador y comprobar Workbook.Styles.NumberFormats enumeración (como el uso de clave ExcelNumberFormatXml.Format)
  3. uso depurador y comprobar Workbook.Styles.NumberFormats. (memeber no pública) _dic para la exacta llaves.
Cuestiones relacionadas