C#导入excel遇到的问题

本文欢迎转载,但必须在文章显眼处保留原文地址

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 档案可同时支援“读取”与“写入”用途。