从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由每列中的前几项确定。 在你的情况下,列中的前几项是数字,所以它假定列是int
types的。 如果要将列视为文本,则需要确保在顶部有一些虚拟行,并确保数据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:
我也推荐它,因为它工作得很好,也没有给我任何问题。