.net把Excel倒入数据库问题全解!

本文详细解析了Microsoft Jet和ACE数据库引擎的区别,以及如何使用它们进行Excel文件的操作,包括参数设置、引用表名和列名的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、strConn ="Provider=Microsoft.Jet.OLEDB.4.0;Data Source="+filepath+";Extended Properties='Excel 8.0;HDR=No;IMEX=1'";

     上面的参数filepath是要传入的参数,那么现在对Microsoft.Jet.OLEDB和Microsoft.ACE.OLEDB做出解释!

     JET引擎:可以访问Office97-2003,但不能访问 Office 2007。

    ACE引擎:是随Office2007一起发布的数据库连接组件,既然可以访问2007,当然也向下兼容啦!

    特别注意:Microsoft.ACE.OLEDB.12.0可以访问正在打开的 Excel文件,而Microsoft.Jet.OLEDB.4.0是不可以的!

    还有特别注意:Extended Properties后面必须不能缺少单引号!同时用于Extended Properties值的有效Excel版本。

   对于Microsoft.Excel 8.0(97)、9.0(2000)和10.0(2002)工作薄,请用Excel 8.0

   对于 Microsoft Excel 5.0 和 7.0 (95) 工作簿,请使用 Excel 5.0。 
   对于 Microsoft Excel 4.0 工作簿,请使用 Excel 4.0。 
   对于 Microsoft Excel 3.0 工作簿,请使用 Excel 3.0。 

------------------------------------------------------------------
  HDR 表示第一行是否是标题行。
  若为 YES,则第一行是标题行(即列名称),不是数据; 
  若为 NO,则第一行不是标题行,跟后面的行一样,是数据。

--------------------------------------------------------------------

IMEX 表示混合数据类型时如何处理。
若为 0,则为输出模式,此情况下只能用作写入 Excel; 
若为 1,则为输入模式,此情况下只能用作读取 Excel,并且始终将 Excel 数据作为文本类型读取; 
若为 2,则为连接模式,此情况下既可用作写入、也可用作读取。 
Excel 第一行第一列可以存储字符串,第二行第一列又可以存储数字……同样的列,存储不同的数据类型,这就形成了混合数据类型。
所以若要读取混合数据类型,应该将 IMEX 设置为 1;若误设置为 0,则读取不到任何行;若误设置为 2 或省略,则有些数据读取出来是空白。
ps:IMEX=1只确保在某列前8行数据至少有一个是文本项的时候才起作用,它只是把查找前8行数据中数据类型占优选择的行为作了略微的改变。例如某列前8行数据全为纯数字,那么它仍然以数字类型作为该列的数据类型,随后行里的含有文本的数据仍然变空。


2、如何引用表名?


对 Excel 工作簿中表(或范围)的有效引用。 
若要引用完全使用的工作表的范围,请指定后面跟有美元符号的工作表名称。例如: 


select * from [Sheet1$]
若要引用工作表上的特定地址范围,请指定后面跟有美元符号和该范围的工作表名称。例如: 


select * from [Sheet1$A1:B10]
若要引用指定的范围,请使用该范围的名称。例如: 


select * from [MyNamedRange]

-------------------------------------------------------

可以引用Excel 工作簿中的三种对象:
• 整张工作表:[Sheet1$]  ,Sheet1 就是工作表的名称
• 工作表上的命名单元格区域:[MyNamedRange] (不需要指定工作表,因为整个xls中命名区域只能唯一)
XLS命名方法:选中单元格范围》插入》名称》定义
• 工作表上的未命名单元格区域 :[Sheet1$A1:B10]
(在关系数据库提供的各种对象中(表、视图、存储过程等),Excel 数据源仅提供相当于表的对象,它由指定工作簿中的工作表和定义的命名


区域组成。命名区域被视为“表”,而工作表被视为“系统表”)


注意:
•必须使用[](方括号),否将报:
FROM 子句语法错误
•必须跟$(美元符号),否则报:
Microsoft Jet 数据库引擎找不到对象'Sheet2'。请确定对象是否存在,并正确地写出它的名称和路径。
•如果工作表名称不对,或者不存在,将报:
'Sheet2$' 不是一个有效名称。请确认它不包含无效的字符或标点,且名称不太长。
•在 如何在 Visual Basic 或 VBA 中使用 ADO 来处理 Excel 数据   中提到可以使用
~  和 '(波浪线和单引号)代替[],使用ADO。NET测试没有成功,报:
FROM 子句语法错误
•当引用工作表明名([Sheet1$])时,数据提供程序认为数据表从指定工作表上最左上方的非空单元格开始。比如,工作表从第 3 行,C 列开


始,第3行,C列之前以及第1、2行全为空,则只会显示从第3行,C列开始的数据;以最后表最大范围内的非空单元结束;
•因此,如需要精确读取范围,应该使用命名区域 [NamedRange],或者指定地址:[Sheet1$A1:C10]


4。如何引用列名?
•根据默认连接字符串中,数据提供程序会将有效区域内的第一行作为列名,如果此行某单元格为空则用F1、F2表示,其中序数,跟单元格的位


置一致,从1开始;
•如果希望第一行作为数据显示,而非列名,可以在连接串的 Extended Properties 属性指定:HDR=NO
默认值为:HDR=NO (应该为 HDR=YES,即默认将第一行作为列名,竟然一直没有发现这个错误,汗upadted 2007年8月18日)格式如下:


        string connStr = "Provider=Microsoft.Jet.OLEDB.4.0;" +
                        "Extended Properties=\"Excel 8.0;HDR=NO\";" + 
                        "data source=" + xlsPath;注意: Excel 8.0;HDR=NO  需要使用双引号(这里的反斜扛,是C#中的转义)


以下是源码:

  protected void Page_Load(object sender, EventArgs e)
        {
           


        }
        protected void BtnUpload_Click(object sender, EventArgs e)
        {
            bool b = Upload(fuExcel);
            if (!b)
            {
                return;
            }
            string name = fuExcel.FileName;
            string filepath = Server.MapPath("~/upload/") + name;
            DataSet ds = ExcelDataSource(filepath, ExcelSheetName(filepath)[0].ToString());
            GridView1.DataSource = ds;
            GridView1.DataBind();
        }
        private bool Upload(FileUpload myFileUpload)
        {


            bool flag = false;
            //是否容许上传
            bool fileAllow = false;
            //设定容许上传的扩展文件类名类型
            string[] allowExtensions = {".xls"};
            //获取网站根目录路径
            string path = HttpContext.Current.Request.MapPath("~/upload/");
            //检查是否有文件)
            if (myFileUpload.HasFile)
            {
                string fileExtension = System.IO.Path.GetExtension(myFileUpload.FileName).ToLower();
                for (int i = 0; i < allowExtensions.Length; i++)
                {
                    if (fileExtension == allowExtensions[i])
                    {
                        fileAllow = true;
                    }
                }
            }


            if (fileAllow)
            {
                myFileUpload.SaveAs(path + myFileUpload.FileName);
                //用一个标识代表上传成功
                flag = true;
            }
            else
            { 
              //这里加一个判断
                flag = false;
            }
            return flag;
        }


        /// <summary>
        /// 
        /// </summary>
        /// <param name="filepath">绝对路径</param>
        /// <param name="sheetname">Excel中的工作表</param>
        /// <returns></returns>
        public DataSet ExcelDataSource(string filepath, string sheetname)
        {
            string strConn=string.Empty;
            strConn ="Provider=Microsoft.Jet.OLEDB.4.0;Data Source="+filepath+";Extended Properties='Excel 8.0;HDR=No;IMEX=1'";
            OleDbConnection conn = new OleDbConnection(strConn);
            conn.Open();
            OleDbDataAdapter adapter = new OleDbDataAdapter("select * from [" + sheetname + "]", conn);
            DataSet ds = new DataSet();
            adapter.Fill(ds);
            conn.Close();
            return ds;
        }
        /// <summary>
        /// 获取Excle中有多少个WorkSheet
        /// </summary>
        /// <param name="filePath"></param>
        /// <returns></returns>
        public ArrayList ExcelSheetName(string filePath)
        {
            ArrayList al = new ArrayList();
            string strConn = string.Empty;
            strConn = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source="+filePath+";Extended ProPerties='Excel 8.0;HDR=No;IMEX=1'";
            OleDbConnection conn = new OleDbConnection(strConn);
            conn.Open();
            DataTable sheetNames = conn.GetOleDbSchemaTable(System.Data.OleDb.OleDbSchemaGuid.Tables, new object[] { null,null,null,"TABLES"});
            conn.Close();
            foreach (DataRow dr in sheetNames.Rows)
            {
                al.Add(dr[2]);
            }
            return al;
        }
    }




   


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值