从Excel导入:一些单元格变为空

我从Excel文件导入数据,我只注意到有些单元格在导入之后变成了“”

这是我正在使用的代码

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(); } 

有问题的列是QTY其中包含:

 12 14 15 11 19k/yr 4 2 

导入后,它成为我gridview上的空间。 所有其他单元格在gridview上显示得很好。

GridView中的输出:

 12 14 15 11 4 2 

有任何想法吗?

在Excel中使用OLEDB时,列的数据types由每列中的前几项确定。 在你的情况下,列中的前几项是数字,所以它假定列是inttypes的。 如果要将列视为文本,则需要确保在顶部有一些虚拟行,并确保数据types正确,然后在数据读入数据表后将其过滤掉。 我知道这是一个cluge,但它应该工作。

编辑 – select:使用Excel Interop / COM来填充数据表

 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 – 确保COM对象在使用后妥善处置

 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相反,您可以使用第三方DLL来与许多操作的Excel一起工作,这是很容易的工作。 这里是它的下载链接:

还可以通过使用源代码,也可以轻松快速地学习如何使用它。 这可以在这里find:

我也推荐它,因为它工作得很好,也没有给我任何问题。