当前位置: 移动技术网 > IT编程>开发语言>.net > .Net读取xlsx文件

.Net读取xlsx文件

2018年09月21日  | 移动技术网IT编程  | 我要评论

第二次握手打一字,霍金博士,火影之伪鸣人下载

连接 excel 表:

 

   string sqlconnection="provider=microsoft.jet.oledb.4.0;data source=d:\\book\\book.xls;extended properties=excel 8.0";

   

   (1)excel 连接字符串:

    通过oledb方式读取excel文件时常常出现读取某些字段为null值,其实是有值,原因是读取文件时,excel通常会以前10行的数据类型为参考,

    如果后边的与其不一致,则会出现些问题。 可以通过修改excel文件的连接串,强制读取的数据为字符串类型。

 

    string xlsconnformat = @"provider=microsoft.jet.oledb.4.0;data source='{0}';extended properties='excel 8.0;hdr=no;imex=1';";  

    // 1、hdr表示要把第一行作为数据还是作为列名,作为数据用hdr=no,作为列名用hdr=yes;  

    // 2、通过imex=1来把混合型作为文本型读取,避免null值。 

 

   注意:把一个 excel 文件看做一个,一个sheet看做一张表。语法 "select * from [sheet1$]",表单要使用"[]"和"$"

   默认excel的表,列名是"f1 ~ f99"。

   如果提示 “找不到可安装的isam。”错误,主要还是connection字符串的问题,请注意data source之间是否空格,extended properties是否书写正确。

  

  (2)、使用 oledb 读取不同版本 excel 数据的连接字符串设置

   用oledb通过设置连接字符串可以像读取sqlserver一样将excel中的数据读取出来,但是excel2003和excel2007/2010的连接字符串是不同的

   /// <summary>    

   /// 把数据从excel装载到datatable    

   /// </summary>    

   /// <param name="pathname">带路径的excel文件名</param>    

   /// <param name="sheetname">工作表名</param>

   /// <param name="tbcontainer">将数据存入的datatable</param>

   /// <returns></returns> 

   public datatable exceltodatatable(string pathname, string sheetname)

   {

       datatable tbcontainer = new datatable();

       string strconn = string.empty;

       if (string.isnullorempty(sheetname))

       { 

         sheetname = "sheet1";

       } 

       fileinfo file = new fileinfo(pathname);

       if (!file.exists) 

       { 

         throw new exception("文件不存在");

       } 

       string extension = file.extension;

       switch (extension)

       {

         case ".xls":

              strconn = "provider=microsoft.jet.oledb.4.0;data source=" + pathname + ";extended properties='excel 8.0;hdr=yes;imex=1;'";

              break;

         case ".xlsx":

              strconn = "provider=microsoft.ace.oledb.12.0;data source=" + pathname + ";extended properties='excel 12.0;hdr=yes;imex=1;'";

              break;  

        default: 

              strconn = "provider=microsoft.jet.oledb.4.0;data source=" + pathname + ";extended properties='excel 8.0;hdr=yes;imex=1;'";

              break; 

       }       

     //链接excel

     oledbconnection cnnxls = new oledbconnection(strconn);

     //读取excel里面有 表sheet1

     oledbdataadapter oda = new oledbdataadapter(string.format("select * from [{0}$]", sheetname), cnnxls);   

     dataset ds = new dataset();  

     //将excel里面有表内容装载到内存表中!

     oda.fill(tbcontainer); 

     return tbcontainer; 

   }

   这里需要注意的地方是,当文件的后缀名为.xlsx(excel2007/2010)时的连接字符串是"provider=microsoft.ace.oledb.12.0;....",注意中间红色部分不是"jet"。

  

  (3)、 .net 读取 xlsx文件 excel2007

       .net 读取excel 2007的xlsx文件和读取老的.xls文件是一样的,都是用oledb读取,仅仅连接字符串不同而已。  

 读取xlsx 用的是microsoft.ace.oledb.12.0;  

 具体操作方法如下:  

 public static datatable getexceltodatatablebysheet(string filefullpath, string sheetname)  

 {    

           //string strconn = "provider=microsoft.jet.oledb.4.0;" + "data source=" + filefullpath + ";extended properties='excel 8.0; hdr=no; imex=1'"; //此连接只能操作excel2007之前(.xls)文件  

             string strconn = "provider=microsoft.ace.oledb.12.0;" + "data source=" + filefullpath + ";extended properties='excel 12.0; hdr=no; imex=1'"; //此连接可以操作.xls与.xlsx文件  

             oledbconnection conn = new oledbconnection(strconn);  

            conn.open();  

             dataset ds = new dataset();  

             oledbdataadapter odda = new oledbdataadapter(string.format("select * from [{0}]", sheetname), conn);                    //("select * from [sheet1$]", conn);  

             odda.fill(ds, sheetname);  

             conn.close();  

             return ds.tables[0];     

 }     

 读取excel文件时,可能一个文件中会有多个sheet,因此获取sheet的名称是非常有用的。      

 具体操作方法如下:  

 //根据excel物理路径获取excel文件中所有表名  

 public static string[] getexcelsheetnames(string excelfile)  

 { 

          oledbconnection objconn = null;  

          system.data.datatable dt = null;    

             try 

             {  

                 //string strconn = "provider=microsoft.jet.oledb.4.0;" + "data source=" + excelfile + ";extended properties='excel 8.0; hdr=no; imex=1'"; //此连接只能操作excel2007之前(.xls)文件  

                    string strconn = "provider=microsoft.ace.oledb.12.0;" + "data source=" + excelfile + ";extended properties='excel 12.0; hdr=no; imex=1'"; //此连接可以操作.xls与.xlsx文件  

                objconn = new oledbconnection(strconn);  

                 objconn.open();  

                 dt = objconn.getoledbschematable(oledbschemaguid.tables, null);  

                 if (dt == null)  

                 {  

                     return null;  

                 }  

                 string[] excelsheets = new string[dt.rows.count];  

                 int i = 0;  

                 foreach (datarow row in dt.rows)  

                 {  

                     excelsheets[i] = row["table_name"].tostring();  

                    i++;  

                 }  

                  return excelsheets;  

             }  

             catch 

             {  

                 return null;  

             }  

             finally 

             {  

                 if (objconn != null)  

                 {  

                     objconn.close();  

                     objconn.dispose();  

                 }  

                 if (dt != null)  

                 {  www.2cto.com

                    dt.dispose();  

                 }  

            }  

 } 

 

 

 

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网