c# - Columna de fecha de Excel que devuelve INT usando EPPlus
epplus c# (2)
Así que estoy usando EPPlus para leer y escribir documentos de Excel.
Flujo de trabajo
- El usuario genera un documento de Excel rellenado
- Abre el documento y agrega una fila.
- Subido y leído
Las fechas que se generan cuando creo el documento con EPPlus se muestran correctamente cuando leo el valor, pero la fila en la que el usuario cambia la fecha que uno o agrega se muestra como un valor INT, no algo que pueda usar como una fecha real.
Cuando ingreso la fecha 1/01/2014 y la escribo, la salida cuando abro el archivo muestra 41640
Lo estoy leyendo de la siguiente manera
sheet.Cells[i, "AE".ConvertExcelColumnIndex()].Value != null
? sheet.Cells[i, "AE".ConvertExcelColumnIndex()].Value.ToString().Trim()
: string.Empty
Actualizar
Al exportar el archivo he añadido lo siguiente
DateTime testDate;
if (DateTime.TryParse(split[i], out testDate))
{
sheet.Cells[row, i + 1].Style.Numberformat.Format = "MM/dd/yyyy";
sheet.Cells[row, i + 1].Value = testDate.ToString("MM/dd/yyyy");
}
También al leer el valor de vuelta he intentado
sheet.Cells[i, "AE".ConvertExcelColumnIndex()].Style.Numberformat.Format = "MM/dd/yyy";
Todavía tengo un INT de vuelta
... cuando necesito leer ese archivo de Excel, las únicas fechas que son incorrectas son las que el usuario ha cambiado
Entonces, cuando lee la hoja de Excel modificada, las fechas modificadas son números, mientras que los valores que no se modifican son cadenas en su formato de fecha.
Puede obtener DateTime
través de DateTime.FromOADate
:
long dateNum = long.Parse(worksheet.Cells[row, column].Value.ToString());
DateTime result = DateTime.FromOADate(dateNum);
Con su número de muestra:
Console.Write(DateTime.FromOADate(41640)); // -> 01/01/2014
También puede cambiar la propiedad ''NumberFormatLocal''. Esto funcionó para mí. Si formatea el archivo de Excel antes de imprimirlo con EPPLUS.
El siguiente ejemplo básico de código de formatos de la columna A en un archivo de Excel típico.
Sub ChangeExcelColumnFormat()
Dim ExcelApp As Excel.Application
Dim ExcelWB As Excel.Workbook
Dim ExcelWS As Excel.Worksheet
Dim formatRange As Excel.Range
Dim strFile As String = "C:/Test.xlsx"
Dim strSheetname As String = "Sheet1"
ExcelApp = New Excel.Application
ExcelWB = ExcelApp.Workbooks.Open(strFile)
strColSelect = "A:A"
strFormat = "dd/mm/yyyy"
formatRange = ExcelWS.Range(strColSelect)
formatRange.NumberFormatLocal = strFormat
ExcelWB.Save()
ExcelWB.Close()
ExcelApp.Quit()
ExcelWS = Nothing
ExcelWB = Nothing
ExcelApp = Nothing
End Sub