我正在从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中的OUTPUT:
12
14
15
11
4
2
有什么想法吗?
答案 0 :(得分:1)
在Excel中使用OLEDB时,列的数据类型由每列中的前几个项确定。在您的情况下,列中的前几个项是数字,因此它假定列的类型为int
。如果希望将列视为文本,则需要确保顶部有一些虚拟行,其中包含确保正确数据类型的数据,然后在将数据读入数据表后过滤掉这些行。我知道这是一个大问题,但它应该有效。
编辑 - 替代方法:使用Excel Interop / COM填充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 - 确保在使用后正确处理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());
}
}
答案 1 :(得分:1)
@Pod Mays 相反,你可以使用第三方DLL来处理许多操作的excel,并且很容易使用它。 Here is the link to its download :
通过使用也可以使用的源代码,您可以轻松快速地学习如何使用它。 which is available here :
我也推荐它,因为它非常好用,也没有给我任何问题。