Importar desde Excel: algunas celdas se vuelven nulas

Estoy importando datos de un file de Excel y me acabo de dar count de que algunas celdas se están volviendo "" después de la import

Aquí está el código que estoy usando

FileUploadExcel.SaveAs("C:\\datatop.xls"); string connectionString = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\\1.xls;Extended Properties=Excel 8.0;"; using (OleDbConnection connection = new OleDbConnection(connectionString)) { connection.Open(); OleDbCommand command = new OleDbCommand("Select MONTH, QTY FROM [Sheet1$]", connection); DataTable tb = new DataTable(); using (System.Data.Common.DbDataReader dr = command.ExecuteReader()) { tb.Load(dr); } gv.DataSource = tb; gv.DataBind(); } 

La columna en cuestión es QTY que contiene:

 12 14 15 11 19k/yr 4 2 

Se convierte en un espacio en mi gridview después de la import. Todas las otras celdas se muestran bien en gridview.

SALIDA en GridView:

 12 14 15 11 4 2 

¿Algunas ideas?

Al usar OLEDB con Excel, el tipo de datos de una columna está determinado por los primeros elementos en cada columna. En su caso, los primeros elementos de la columna son numbers, por lo que se supone que la columna es de tipo int . Si desea que la columna se considere text, debe asegurarse de tener algunas filas ficticias en la parte superior con datos que garanticen los types de datos correctos, luego filtre esas filas una vez que los datos se leen en la tabla de datos. Sé que es un cluge, pero debería funcionar.

Editar – Alternativa: usando Excel Interop / COM para llenar una DataTable

 using Microsoft.Office.Interop.Excel; using Sd = System.Data; private void FillTableData(Sd.DataTable table, Worksheet worksheet, Range cells) { using (var com = new ComObjectManager()) { var firstCell = GetFirstCell(com, cells); var beginCell = com.Get<Range>(() => (Range)cells.Item[2, 1]); var endCell = GetLastContiguousCell(com, cells, firstCell); if (beginCell.Value == null) return; var range = GetRange(com, cells, beginCell, endCell); var data = (object[,])range.Value; var rowCount = data.GetLength(0); for (var rowIndex = 0; rowIndex < rowCount; rowIndex++) { var values = new object[table.Columns.Count]; for (var columnIndex = 0; columnIndex < table.Columns.Count; columnIndex++) { var value = data[rowIndex + 1, columnIndex + 1]; values[columnIndex] = value; } table.Rows.Add(values); } } } private Range GetFirstCell(ComObjectManager com, Range cells) { return com.Get<Range>(() => (Range)cells.Item[1, 1]); } private Range GetLastContiguousCell(ComObjectManager com, Range cells, Range beginCell) { var bottomCell = com.Get<Range>(() => beginCell.End[XlDirection.xlDown]); var rightCell = com.Get<Range>(() => beginCell.End[XlDirection.xlToRight]); return com.Get<Range>(() => (Range)cells.Item[bottomCell.Row, rightCell.Column]); } 

ComObjectManager: garantiza que los objects COM se desechen correctamente después de ser utilizados

 using System; using System.Collections.Generic; using System.Runtime.InteropServices; public class ComObjectManager : IDisposable { private Stack<object> _comObjects = new Stack<object>(); public TComObject Get<TComObject>(Func<TComObject> getter) { var comObject = getter(); _comObjects.Push(comObject); return comObject; } public void Dispose() { while (_comObjects.Count > 0) Marshal.ReleaseComObject(_comObjects.Pop()); } } 

@Pod Mays Rather puede usar una DLL de terceros para trabajar con Excel en muchas operaciones y es bastante fácil trabajar con ella. Aquí está el enlace a su descarga:

Además, al usar un código fuente que también está disponible con él, puedes aprender cómo usarlo rápida y fácilmente. que está disponible aquí:

También lo recomiendo porque funciona muy bien y tampoco me ha dado ningún problema.