1,OleDbConnection 的连接字符串:
0ffice 97-2003 :
strConnection = string.Format("Provider=Microsoft.Jet.OLEDB.4.0;Data Source={0};Extended Properties=\"Excel 8.0;HDR={1};IMEX={2:D}\";", ExcelFilePath, HDR, IMEX);
//HDR=No 表示ADO将不把你Excel文件的第一行作为字段名(此时使用默认字段名:F1,F2。。)
//IMEX= 0写入模式,1读取模式,2连接读写模式(效率不高),"IMEX=1;" 则始终将“互混”数据列作为文本读取
office2007:
strConnection = string.Format("Provider==Microsoft.ACE.OLEDB.12.0;Data Source={0};Extended Properties=\"Excel 12.0 Xml;HDR={1};IMEX={2:D}\";", ExcelFilePath, HDR, IMEX);
2,建立连接并打开:
try
{
Connection = new OleDbConnection(strConnection);
/* 特别说明: 在C++中建立连接后,连接就可以直接使用。 在C#中,连接可以使用 datatable 等操作,但是连接此时处于关闭状态。//*/
Connection.Open();
/* 特别说明,如果没有这一句,连接处于关闭状态,执行sql语句会提示错误:连接关闭不可用。我用一天的时间才研究出来
这个貌似 MSDN 和 网上都没有相关资料和说明,我一直奇怪,建立连接都没任何错误,datatable.fill()都没问题,为何执行sql语句连接处于关闭不可用呢?
大部分情况大量数据回写导出到EXCEL表格,都会是SQL数据库,可以用 SqlBulkCopy ,只是我的数据库却是 SqlCe,不支持SqlBulkCopy
所以,只能自己做线程执行插入语句。
貌似在 C++ 中,建立连接后,从来没有自己手动去Open,,,,,,,,,,,,,
//*/
}
catch (OleDbException ex )
{
}
3,执行sql语句:
try
{
OleDbCommand comm = new OleDbCommand(sqlstr, Connection);
result = comm.ExecuteNonQuery(); //返回受影响的数据行数量。
}
catch (OleDbException e)
{
}
4,excel表格sql语句书写
string sqlstr="select F1,F2 from [Sheet1$] ";//注意表名称[] 和 $ 都不能少了。
5,读取的时候,部分数据丢失,或者错误。
excel默认扫描前8行数据,以便自动识别字段数据类型,故,后面如果字段类型不符合,或者字段超长度,就会出现丢失。
1,IMEX=1 连接的时候设为读取模式,将数字和字符始终做字符处理。
2,修改注册表,将行数改更大 0 - 16;0代表整个表格。
TypeGuessRows 设置为 0,,注意表格如果较大,10000行,改成0,则需要考虑性能和效率问题。
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Jet\4.0\Engines\Excel]
Windows 7 的注册表项目
HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Jet\4.0\Engines\Excel
3,修改注册表脚本
@echo off reg add HKLM\SOFTWARE\Microsoft\Jet\4.0\Engines\Excel /v TypeGuessRows /t REG_DWORD /d 0 /f
@echo off reg add "HKLM\SOFTWARE\Microsoft\Office\12.0\Access Connectivity Engine\Engines\Excel" /v TypeGuessRows /t REG_DWORD /d 0 /f
@echo off reg add "HKLM\SOFTWARE\Microsoft\Office\14.0\Access Connectivity Engine\Engines\Excel" /v TypeGuessRows /t REG_DWORD /d 0 /f
原文地址:http://blog.csdn.net/zyai001/article/details/45947169