在access里写脚本。access除了数据库,还内含VB的脚本功能,可惜我们大多数人都没研究过,里面可以实现一切access菜单里的功能,包括你想要的导入。

解决方案 »

  1.   


    using System;
    using System.Collections.Generic;
    using System.Text;
    using System.Data.OleDb;
    using System.Data;
    using System.Windows.Forms;
    using Microsoft.Office.Interop.Excel;namespace LandaControl7_ValidateExcel
    {
        /// <summary>
        /// 读取 Excel
        /// </summary>
        class ExcelForCheck
        {
            #region 通用读取 Excel (多表读取,一次读取,集中处理)
            /*
             * http://www.qudong.com/soft/program/asp/asp-netshili/20080317/1169.html
             * 对于 Microsoft Excel 8.0 (97)、9.0 (2000) 、10.0 (2002)和 11.0(2003) 工作簿,请使用 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。 
             * Provider=Microsoft.Jet.OLEDB.4.0;Extended Properties=\"Excel 8.0;HDR=NO\";data source=" + xlsPath;
             * 如果希望第一行作为数据显示,而非列名,可以在连接串的 Extended Properties 属性指定:HDR=NO,
             * 注意: Excel 8.0;HDR=NO  需要使用双引号(这里的反斜扛,是C#中的转义)
             * 可以通过 Extended Properties 中指定 IMEX=1,"IMEX=1;"通知驱动程序始终将“互混”数据列作为文本读取
             * 有网友说,将每个单元都加上引号,这固然是个方案,但是工作量何其大啊,又不零活,庆幸找到"治本药方"
             * 
             * 这里我们就不需要对SELEC 语句进行“硬编码”,可以根据需要动态的构造FROM 字句的“表名”。
             * 不仅可以,获取表明,还可以获取每张表内的字段名、字段类型等信息:
             * tblSchema = conn.GetOleDbSchemaTable(OleDbSchemaGuid.Columns, new object[] { null, null, null, null });
             * 在ADO.nET 1.x 时候只有OleDb提供了GetOleDbSchemaTable 方法,而SqlClient或者OrcaleClient没有对应的方法,
             * 因为对应数据库已经提供了类似功能的存储过程或者系统表供应用程序访问,比如对于Sql Server: 
             * SELECT * FROM Northwind.INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = N'Customers'
             * 
             * HDR用来设置是否将Excel表中第一行作为字段名,“YES”代表是,“NO”代表不是即也为数据内容;
             * IMEX是用来告诉驱动程序使用Excel文件的模式,其值有0、1、2三种,分别代表导出、导入、混合模式
             * 
             * HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Jet\4.0\Engines\Excel”下的该注册表值来更改采样行数。
             * 但是这种改进还是没有根本上解决问题,即使我们把IMEX设为“1”, TypeGuessRows设得再大,例如1000,假设数据表有1001行,某列前1000行全为纯数字,
             * 该列的第1001行又是一个文本,ISAM驱动的这种机制还是让这列的数据变成空
             * */
            public DataSet ExcelReader(string excelName)
            {
                DataSet ds = new DataSet();
                OleDbConnection conn = null;
                try
                {
                    // 拼写连接字符串,打开连接
                    string strConn = "Provider=Microsoft.Jet.OleDb.4.0;" + "data source=" + excelName + ";Extended Properties='Excel 8.0; HDR=YES; IMEX=1'";
                    conn = new OleDbConnection(strConn);
                    conn.Open();                // 取得Excel工作簿中所有工作表
                    System.Data.DataTable schemaTable = conn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null);  //获取Excel中的对应表名称
                    //System.Data.DataTable colTable = conn.GetOleDbSchemaTable(OleDbSchemaGuid.Columns, null);  //获取Excel中的对应列名称
                    OleDbDataAdapter sqlada = new OleDbDataAdapter();                // 遍历工作表取得数据并存入Dataset
                    foreach (DataRow dr in schemaTable.Rows)
                    {
                        string strSql = "Select * From [" + dr[2].ToString().Trim() + "]";
                        OleDbCommand objCmd = new OleDbCommand(strSql, conn);
                        sqlada.SelectCommand = objCmd;
                        sqlada.Fill(ds, dr[2].ToString().Trim());
                    }
                }
                catch { return null; }
                finally
                {
                    if (conn.State != ConnectionState.Closed && conn != null)
                    {
                        conn.Close();
                        //KillProcess("excel");
                    }
                }
                return ds;
            }
            #endregion        #region 指定文件名 [Sheet1$] 导出
            public DataSet GetDataFromExcel(string filePath)
            {
                //DataSet myDataSet = new DataSet();
                ////创建一个数据链接 
                ////string strCon = " Provider = Microsoft.Jet.OLEDB.4.0 ; Data Source = c:\\sample.xls;Extended Properties=Excel 8.0";
                //string strCon = " Provider = Microsoft.Jet.OLEDB.4.0 ; Data Source = "+filePath+";Extended Properties=Excel 8.0;HDR=NO;IMEX=1";
                //OleDbConnection myConn = new OleDbConnection(strCon);
                //string strCom = " SELECT * FROM [Sheet1$] ";
                ////myConn.Open();
                ////打开数据链接,得到一个数据集 
                //OleDbDataAdapter myCommand = new OleDbDataAdapter(strCom, myConn);
                ////创建一个 DataSet对象 
                //myDataSet = new DataSet();
                ////得到自己的DataSet对象 
                //myCommand.Fill(myDataSet);
                ////myCommand.Fill(myDataSet, "[Sheet1$]");
                ////关闭此数据链接 
                ////myConn.Close();  
                //return myDataSet;            string strCon = " Provider = Microsoft.Jet.OLEDB.4.0 ; Data Source = " + filePath + ";Extended Properties=Excel 8.0";
                System.Data.OleDb.OleDbConnection conn = new System.Data.OleDb.OleDbConnection(strCon);
                string sql = " Select * FROM [Sheet1$] ";
                System.Data.OleDb.OleDbDataAdapter adp = new System.Data.OleDb.OleDbDataAdapter(sql, conn);
                DataSet dss = new DataSet();
                adp.Fill(dss, "[Sheet1$]");
                return dss;        }
            #endregion        #region 从指定行处读取 Excel
            public void ReadExcel(string sExcelFile,System.Windows.Forms.DataGridView dgBom)
            {
                System.Data.DataTable ExcelTable;
                DataSet ds = new DataSet();
                //Excel的连接
                OleDbConnection objConn = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + sExcelFile + ";" + "Extended Properties=Excel 8.0;");
                objConn.Open();
                System.Data.DataTable schemaTable = objConn.GetOleDbSchemaTable(System.Data.OleDb.OleDbSchemaGuid.Tables, null);
                string tableName = schemaTable.Rows[0][2].ToString().Trim();//获取 Excel 的表名,默认值是sheet1
                string strSql = "select * from [" + tableName + "]";
                OleDbCommand objCmd = new OleDbCommand(strSql, objConn);
                OleDbDataAdapter myData = new OleDbDataAdapter(strSql, objConn);
                myData.Fill(ds, tableName);//填充数据            dgBom.DataSource =ds;
                objConn.Close();
               
                ExcelTable = ds.Tables[tableName];
                int iColums = ExcelTable.Columns.Count;//列数
                int iRows = ExcelTable.Rows.Count;//行数            //定义二维数组存储 Excel 表中读取的数据
                string[,] storedata = new string[iRows, iColums];
             
                for(int i=0;i<ExcelTable.Rows.Count;i++)
                    for (int j = 0; j < ExcelTable.Columns.Count; j++)
                    {
                        //将Excel表中的数据存储到数组
                        storedata[i, j] = ExcelTable.Rows[i][j].ToString();
                    }
                int excelBom = 0;//记录表中有用信息的行数,有用信息是指除去表的标题和表的栏目,本例中表的用用信息是从第三行开始
                //确定有用的行数
                for (int k = 2; k < ExcelTable.Rows.Count; k++)
                    if (storedata[k, 1] != "")
                        excelBom++;
                if (excelBom == 0)
                {
                    //Response.Write("<script language=javascript>alert('您导入的表格不合格式!')</script>");
                }
                else
                {
                    //LoadDataToDataBase(storedata,excelBom)//该函数主要负责将 storedata 中有用的数据写入到数据库中,在此不是问题的关键省略 
                }        }
            #endregion        #region 杀死 Excel 进程,ok
            private void KillProcess(string processName)
            {
                System.Diagnostics.Process myproc = new System.Diagnostics.Process();
                //得到所有打开的进程 
                try
                {
                    foreach (System.Diagnostics.Process thisproc in System.Diagnostics.Process.GetProcessesByName(processName))
                    {
                        thisproc.Kill();
                    }
                }
                catch (Exception Exc)
                {
                    throw new Exception("", Exc);
                }
            }
            #endregion 
                
        }
    }
      

  2.   

    到网上搜ADOX,ADODB,有源码,直接拿来使用,建库建表不需几行代码即可实现
    都是COM组件,要添加引用
      

  3.   

    感谢楼上的代码提示 针对代码 ,我有一个问题就是楼上省略的部分:
    LoadDataToDataBase(storedata,excelBom)//该函数主要负责将 storedata 中有用的数据写入到数据库中,在此不是问题的关键省略
    我想明白如何操作,能把数组storedata中的数据放入到数据库当中呢?谢谢!
      

  4.   

    这个是VBA
    Access可以写,excel也可以写。
      

  5.   

    我现在不是很明白在C#中如何将Dataset中得到的excel表数据放入数据库的相应表中.就是上面例子中的用数组storedata取得的有效数据导入数据库的具体过程.请高手指点一下.
    谢谢!