本文欢迎转载,但必须在文章显眼处保留原文地址
http://blog.163.com/ganlanfei@126/blog/static/12181987120101120103428882/
今天做excel导入功能,因为以前做过,熟手熟脚的一下子就把代码写完了,然后看了一下,应该没有什么问题,但运行的时候,问题就出现了。
由于我用的是oledb,所以读取数据前是需要先打开连接在,在代码运行到打开连接的时候,报了一个“外部表不是预期的格式”从这个提示不难看出,就是导入时的excel文件有问题,经过一翻仔细的检查后,确定excel是没有问题的。奇怪,那问题出在哪里呢,找了N久的baidu,google都没有发现。纠结ing..最后还是msdn的博客给力呀,由于版本问题,以前的代码是用于2003的excel文件(xls),而今天用的那个exlce文件是2007生成的(xlxs),只需要把相关的连接字符串改一下版本就行了(地址:http://blogs.msdn.com/b/mattm/archive/2010/04/05/exporting-to-excel-2007-xslx-vs-xslb.aspx)果然,英文网站就是强大呀,这样就没有报刚刚那个错了(原先找了N个中文网站,都是没有解决问题),终于,报了另一个错误了“找不到可安装的ISAM”。这个以前遇过,随便百度一下都知道,有很多种情况会出现这个提示的,比如你连接字符串错了(少个分号之类的,网上大把人出现这个问题),或者是没有注册msexcl40.dll(注册方法:在“运行”对话框中输入回车即可:Regsvr32 c:\WINDOWS\system32\msexcl40.dll)。最终问题都解决了!文字很短,但确实浪费了我不少时间,做下记录吧!
下面贴一下具体的代码,如果大家遇到问题,可以对比一下。
public string ReadXLSByExcel(string fileFullPath)
{
// strConn = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + fileFullPath + ";Extended Properties='Excel 8.0;HDR=False;IMEX=1;'";//只适合xls后缀
string strConn = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + fileFullPath + ";Extended Properties='Excel 12.0;HDR=YES;IMEX=1;'";
OleDbConnection oleConn = new OleDbConnection(strConn);
try
{
oleConn.Open();
DataTable sheetNames = oleConn.GetOleDbSchemaTable(System.Data.OleDb.OleDbSchemaGuid.Tables, new object[] { null, null, null, "TABLE" });
string tableName = "";
foreach (DataRow dr in sheetNames.Rows)
{
if (dr[2].ToString().Replace("$", "") != "sheet1")
{
continue;
}
else
{
tableName = sheetName;
break;
}
}
if (tableName.Length <= 0)
{
return "请输入正确的页面名称";
}
string sql = "select [字段1],[字段2] from [" + tableName + "$]";
OleDbDataAdapter oleDaExcel = new OleDbDataAdapter(sql, oleConn);
DataSet ds = new DataSet();
oleDaExcel.Fill(ds, tableName);
CNoteFacade facade = new CNoteFacade();
return ds.Tables[0];
}
catch (Exception)
{
return new DataTable;
}
finally
{
oleConn.Close();
}
}
xls和xlxs都测试通过。。
PS:连接字符串
参数HDR的值:HDR=Yes,这代表第一行是标题,不做为数据使用 ,如果用HDR=NO,则表示第一行不是标题,做为数据来使用。系统默认的是YES 。
参数IMEX值:具体什么意思我也不清楚哈,不过如果没有设置=1的话,在单元格里面的中文有时不能正确读取到,会读到null。
官方的解释:
IMEX ( IMport EXport mode )设置
当 IMEX=0 时为“汇出模式”,这个模式开启的 Excel 档案只能用来做“写入”用途。
当 IMEX=1 时为“汇入模式”,这个模式开启的 Excel 档案只能用来做“读取”用途。
当 IMEX=2 时为“连結模式”,这个模式开启的 Excel 档案可同时支援“读取”与“写入”用途。