¿Cómo conservar los formatos de celda de Excel en C# Interop?


Estoy leyendo una hoja de Excel mediante programación usando Microsoft.Office.Interop.Excel en C#. Puedo leerlo fila por fila y convertir cada fila en una matriz de cadenas. Luego, estoy agregando estas filas a un DataTable. Todo funciona bien, excepto el de la columna en Excel que contiene valores de Fecha, y cuando lo obtengo del objeto Rango de Excel y lo transfiero a una matriz de cadenas, los valores de fecha se convierten en algún tipo de números decimales. Por ej.-

  • Si la fecha value es '6/4/2016 8:14:39 PM', obtengo el valor como '42522.5224305556'
  • Si el valor de la fecha es '27/5/2016 1:10:12 p. m.', obtengo el valor como '42517.54875'

Abajo está mi código-

private System.Data.DataTable GetTicketsFromExcel(string excelFilePath)
    {
        System.Data.DataTable dtblTickets = new System.Data.DataTable();
        Microsoft.Office.Interop.Excel.Application excelApp = new Microsoft.Office.Interop.Excel.Application();
        Worksheet ws = new Worksheet();
        Workbook wb = null;

        try
        {
            wb = excelApp.Workbooks.Open(excelFilePath, Type.Missing, Type.Missing,
                                               Type.Missing, Type.Missing,
                                               Type.Missing, Type.Missing,
                                               Type.Missing, Type.Missing,
                                               Type.Missing, Type.Missing,
                                               Type.Missing, Type.Missing,
                                               Type.Missing, Type.Missing);

            ws = (Microsoft.Office.Interop.Excel.Worksheet)wb.Sheets.get_Item(1);
            Range usedRange = ws.UsedRange;
            Range rowRange;
            string[] lsRow = null;

            for (int i = 1; i <= usedRange.Columns.Count; i++)
            {
                dtblTickets.Columns.Add(usedRange.Cells[5, i].Value.ToString());
            }

            string sortColumn = "Reported On";
            string sortDirection = "DESC";
            dtblTickets.Columns[sortColumn].DataType = typeof(DateTime);

            for (int row = 6; row <= usedRange.Rows.Count; row++)
            {
                //dtblTickets.Columns.Add()
                rowRange = usedRange.Rows[row];
                object[,] cellValues = (object[,])rowRange.Value2;
                lsRow = cellValues.Cast<object>().Select(o => Convert.ToString(o)).ToArray<string>();
                dtblTickets.Rows.Add(lsRow.ToArray());
            }
            dtblTickets.DefaultView.Sort = sortColumn + " " + sortDirection;
            dtblTickets = dtblTickets.DefaultView.ToTable();
        }
        catch (Exception ex)
        {

        }
        finally
        {
            wb.Close();
            excelApp.Quit();
            Marshal.ReleaseComObject(ws);
            Marshal.ReleaseComObject(wb);
            Marshal.ReleaseComObject(excelApp);
            ws = null;
            wb = null;
            excelApp = null;
        }
        return dtblTickets;
    }

Tenga en cuenta-

  • No quiero usar OLEDB para leer y exportar esto
  • Quiero poder leer Excel fila por fila (sin extraer cada valor de celda y convertirlos)
  • No quiero convertir/formatear los datos del documento de Excel original

¿Puede alguien por favorme ayudan con esto?



------------Respuesta------------

No estoy muy seguro, si desea resolver el problema de esta manera, pero una forma es cambiar la propiedad de las celdas (o toda la fila o columna) en Excel.

  • Haga clic derecho en una celda
  • Formato de celdas
  • En "Número", seleccione la categoría "Texto" para las celdas.

Lo probé y funcionó.

Etiquetas: excel-interop excel c#

Artículos relacionados:

Enlace iónico sin botón Atrás

javascript - Valor vacío de la etiqueta de entrada JQUERY