从Excel导入:某些细胞变得无效
我从一个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时,列的数据类型由每列中的前几项决定。在你的情况中,列中的前几项是数字,所以它假设列的类型为int
。如果您希望将列视为文本,则需要确保顶部有一些虚拟行,并确保数据类型正确,然后在数据读入数据表后将其过滤掉。我知道这是一个小问题,但它应该起作用。
编辑 - 备选:使用Excel互操作/ 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());
}
}
谢谢队友。但有另一种方法吗?因为我导入了接近一百个excel文件,编辑它们都很繁琐 – 2011-05-23 05:20:27
另一种可能性是使用Excel interop。如果您正在安装Office的计算机上工作,这将仅适用,但如果这样做,它将提供比OLEDB更多的灵活性。我会用一些示例代码更新我的答案。 – devuxer 2011-05-23 05:40:47
@Pod梅斯 相反,您可以使用第三方DLL与Excel进行许多操作,并且使用它很容易。 Here is the link to its download :
也可以通过使用它的源代码,您可以轻松快速地学习如何使用它。 which is available here :
我也推荐它,因为它工作得很好,它也没有给我任何问题。
你的一些代码被切断了吗?我没有'1.Text'和'2.Text'。 – devuxer 2011-05-23 03:29:16
@DanM是我编辑它,谢谢。 – 2011-05-23 03:35:28
您是否可以编辑您的Excel文件,请尝试在19k/yr之前放置一个撇号(')。 – devuxer 2011-05-23 03:39:59