我正在尝试根据我执行的Excel查询从C#中的DataSet返回列名列表。我很好(我认为),请参阅下面的代码。但是,我的三个列标题是日期,列名称显示为F4,F5,F6。我进一步查看并发现Type(.getType)报告System.Double但我无法转换它们。
示例文件是:
UID | FirstName |姓氏| 31/07/2010 | 31/08/2010
100 |测试|测试| 8.8 | 9.9
200 | test2 | test2 | 7.7 | 6.6
我的输出是:
UID
姓
System.String
姓
System.String
F4
System.Double
F5
System.Double
F6
System.Double
你能否对此有所了解?
conn = new OleDbConnection(conStr);
conn.Open();
dbCmd = new OleDbCommand("SELECT * FROM [" + worksheetName + "$]", conn);
dbCmd.CommandType = CommandType.Text;
dbAd = new OleDbDataAdapter(dbCmd);
dbAd.Fill(ds);
foreach (DataTable table in ds.Tables)
{
foreach (DataColumn col in table.Columns)
{
Console.WriteLine(col.ColumnName);
Console.WriteLine(col.ToString());
Console.WriteLine(col.DataType);
//object t = col;
//Double ttd = (Double)t;
//Console.WriteLine(t);
}
}
我搜索过高低,但找不到怎么做。我真的不想在使用Excel对象模型中读取文件,因为这太慢了。
答案 0 :(得分:1)
我相信正在发生的事情是Excel OLE数据提供程序正在猜测这些单元格的类型并且它猜错了。默认情况下,JET引擎查看前8行以确定所有列的数据类型。您可以在填充数据集之前通过修改注册表来更改此设置。以下是similar question前一段时间的回复:
在解析Excel电子表格之前,您必须更新此注册表项:
// Excel 2007
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Office\12.0\Access Connectivity Engine\Engines\Excel\
// Excel 2003
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Jet\4.0\Engines\Excel\
在此密钥下将TypeGuessRows
更改为0
,将ImportMixedTypes
更改为Text
。您还需要更新连接字符串以在扩展属性中包含IMEX=1
:
string connString = string.Format("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + fileLocation + ";Extended Properties=\"Excel 12.0 Xml;HDR=YES;IMEX=1\";");
http://blogs.vertigo.com/personal/aanttila/Blog/archive/2008/03/28/excel-and-csv-reference.aspx
答案 1 :(得分:0)
这不适合你吗?
double dblValue = 39456; // <--- your input double value
DateTime dt = DateTime.FromOADate(dblValue);
//dt <- Your DateTime value
Excel将日期/时间存储为双格式数字。 DateTime
类已经提供了FromOADate
函数来解析(有效:))对正确日期和时间的双倍值。