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 档案可同时支援“读取”与“写入”用途。
posted on 2010-12-20 22:39  Ss_Andy  阅读(1863)  评论(0编辑  收藏  举报