C#解析Excel表列名,其中一些是日期

时间:2010-10-04 17:10:55

标签: c# excel

我正在尝试根据我执行的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对象模型中读取文件,因为这太慢了。

2 个答案:

答案 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

http://msdn.microsoft.com/en-us/library/ms141683.aspx

答案 1 :(得分:0)

这不适合你吗?

double dblValue = 39456; // <--- your input double value

DateTime dt = DateTime.FromOADate(dblValue);

//dt <- Your DateTime value

阅读herehere

Excel将日期/时间存储为双格式数字。 DateTime类已经提供了FromOADate函数来解析(有效:))对正确日期和时间的双倍值。