欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

.Net读取xlsx文件

程序员文章站 2022-03-24 22:23:34
连接 excel 表:      string sqlconnection="provider=microsoft.jet.oledb.4.0;data so...
连接 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();  

                 }  

            }  

 }