读写excel, EXCEL的数据转存到ACCESS[代码]

来源:互联网 发布:ios js rsa 编辑:程序博客网 时间:2024/06/05 03:44

       
        //@@@@@@@@@@@@@@@@@@@@@@@@@@第一个范例@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
       
        //以下的代码是从一个EXCEL中读取数据,写到ACCESS中。
        //引入EXCEL,在D盘建立一个EXCEL源数据文件,以及ACCESS的目标数据文件

        public static DataTable ExcelToDataTable(string strExcelFileName, string strSheetName)
        {
            string strConn = "Provider=Microsoft.Jet.OLEDB.4.0;" + "Data Source=" + strExcelFileName + ";" + "Extended Properties=Excel 5.0;";
            string strExcel = string.Format("select * from [{0}$]", strSheetName);
            DataSet ds = new DataSet();

            using (OleDbConnection conn = new OleDbConnection(strConn))
            {
                conn.Open();
                OleDbDataAdapter adapter = new OleDbDataAdapter(strExcel, strConn);
                adapter.Fill(ds, strSheetName);
                conn.Close();
            }

            return ds.Tables[strSheetName];
        }


        public static void InsertDataToAccess(OleDbConnection oleDbConn, string v0, string v1, string v2, string v3, string v4, string v5)
        {
            string strInsertString = "INSERT INTO t1 (id,[order],name,age,sex,demo) VALUES (@id,@order,@name,@age,@sex,@demo)";

            OleDbCommand oComm = new OleDbCommand(strInsertString, oleDbConn);

            oComm.Parameters.Add("@id", OleDbType.Char, 50);
            oComm.Parameters["@id"].Value = v0;

            oComm.Parameters.Add("@order", OleDbType.Char, 50);
            oComm.Parameters["@order"].Value = v1;

            oComm.Parameters.Add("@name", OleDbType.Char, 50);
            oComm.Parameters["@name"].Value = v2;

            oComm.Parameters.Add("@age", OleDbType.Char, 50);
            oComm.Parameters["@age"].Value = v3;

            oComm.Parameters.Add("@sex", OleDbType.Char, 50);
            oComm.Parameters["@sex"].Value = v4;

            oComm.Parameters.Add("@demo", OleDbType.Char, 50);
            oComm.Parameters["@demo"].Value = v5;
           
            oComm.ExecuteNonQuery();
           
        }


        private void Form1_Load(object sender, EventArgs e)
        {
            DataTable dtExcel = ExcelToDataTable("D://b.xls", "Sheet1");


            OleDbConnection oleDbConn = new OleDbConnection();
            oleDbConn.ConnectionString = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=d:/A.mdb;User Id=admin;Password=;";
            oleDbConn.Open();

            for (int i = 0; i < dtExcel.Rows.Count-1; i++)
            {
                string nowTime = System.DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss");
               
                InsertDataToAccess(oleDbConn,
                    dtExcel.Rows[i][0].ToString(),
                    dtExcel.Rows[i][1].ToString(),
                    dtExcel.Rows[i][2].ToString(),
                    dtExcel.Rows[i][3].ToString(),
                    dtExcel.Rows[i][4].ToString(),
                    nowTime
                    );
            }
            oleDbConn.Close();


            //@@@@@@@@@@@@@@@@@@@@@@@@@@第二个范例@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
            //以下的代码是对一个EXCEL文件的读写操作
            //代码使用基本条件
            //*using System.Reflection; // 引用这个才能使用Missing字段
            //*需要使用EXCEL外部引用
            //MISSING的作用是,通过反射产生一个函数的默认参数
            //在写外来对象组件操作过程中,有时对调用的方法中不用的参数调用Null错误,填充此参数即可。
           
           
            //功能开始
           
            Excel.Application xApp = new Excel.ApplicationClass();
            xApp.Visible = true;
           
           
            //得到WorkBook对象, 可以用两种方式之一: 下面的是打开已有的文件

            Excel.Workbook xBook = xApp.Workbooks._Open(@"D:/B.xls",
            Missing.Value, Missing.Value, Missing.Value, Missing.Value
            , Missing.Value, Missing.Value, Missing.Value, Missing.Value
            , Missing.Value, Missing.Value, Missing.Value, Missing.Value);
           
            //第二种方式  新建一个XLS文件
            //Excel.Workbook xBook = xApp.Workbooks.Add(Missing.Value);

            //取得当前xls文件的SHEET,第一句是取第一个,第二句是取活动的。
            Excel.Worksheet xSheet = (Excel.Worksheet)xBook.Sheets[1];
            //Excel.Worksheet xSheet=(Excel.Worksheet)xApp.ActiveSheet;

            //读取数据,通过Range对象

            Excel.Range rng1 = xSheet.get_Range("A1",Type.Missing);
           
            //读取,通过Range对象,但使用不同的接口得到Range
            Excel.Range rng2 = (Excel.Range)xSheet.Cells[3, 1];
            Console.WriteLine(rng2.Value2);

            //写入数据
            //无论是Range属性,Cells,Rows,Columns这些属性,其类型都是Excel.Range,都有Value2这个属性
            //Value得到它的值.   Value2则是针对数字的.

            Excel.Range rng3 = xSheet.get_Range("C6", Missing.Value);
            rng3.Value2 = 4;
            rng3.Interior.ColorIndex = 4; //设置Range的背景色(绿色)

            ////保存方式一:保存WorkBook
            //xBook.SaveAs(@"D:/CData.xls",
            //Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value,
            // Excel.XlSaveAsAccessMode.xlNoChange, Missing.Value, Missing.Value, Missing.Value,
            // Missing.Value, Missing.Value);

            ////保存方式二:保存WorkSheet
            //xSheet.SaveAs(@"D:/CData2.xls",
            //Missing.Value, Missing.Value, Missing.Value, Missing.Value,
            // Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value);


            //保存方式三
            xBook.Save();

            xSheet = null;
            xBook = null;
            xApp.Quit(); //这一句是非常重要的,否则Excel对象不能从内存中退出
            xApp = null;


            //@@@@@@@@@@@@@@@@@@@@@@@@@@第三个范例@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
            /**
             * 这是一个基于C#的对ACCESS数据库进行增删改查的程序,运行可以通过。
             *
             * 但我觉得程序结构上还不太优化,比如:
             *
             * 1、OleDbCommand odCommand = odcConnection.CreateCommand()和odCommand.CommandText = strSql;能不能单独提出来?
             *
             * 2、做一个功能比较全面的方法,只需要两个参数(conn,sql)能执行所有的SQL文。遇到更新、插入、删除还能把件数报出来。
             *
             * 3、INSERT 和 UPDATE 语句如果字段特别特别多,拼SQL文时,能不能做简化处理,比如用?来代替,象JAVA那样。怎么实现啊。
             *
             * 4、怎么做能让DB连接这部分功能,独立出来(做成基底,包括ACCESS、SQL、ORACLE)以后再用的时候,只要添上参数,就能跑SQL.
             *
             **/

            //建立一个接续,初期化
            OleDbConnection conn = initConn();

            //做查询
            string strSql = "select * from t1";
            SelectSta(conn, strSql);

            //做更新
            string strupdate = "update t1 set age = 12";
            UpdateStatus(conn, strupdate);

            //做插入
            string strrecorder = "4,3,'tom',43,1,'ddd'";
            string strinsert = "insert into t1 values(" + strrecorder + ")";//能不能改改,这样太别扭了。
            InsertStatus(conn, strinsert);

            //做删除
            string strDel = "delete from t1 where age <> '12'";
            DeleteStatus(conn, strDel);
            conn.Close();
        }

        //查询处理
        private void SelectSta(OleDbConnection odcConnection, string strSql)
        {
            OleDbCommand odCommand = odcConnection.CreateCommand();
            odCommand.CommandText = strSql;
            OleDbDataReader odrReader = odCommand.ExecuteReader();
            ArrayList Arr = new ArrayList();
            while (odrReader.Read())
            {
                Arr.Add(odrReader["NAME"].ToString());
                listBox1.Items.Add(odrReader["NAME"].ToString());
            }
        }

        //更新处理
        private void UpdateStatus(OleDbConnection conn, string strupdate)
        {
            OleDbCommand odCommand = conn.CreateCommand();
            odCommand.CommandText = strupdate;
            int intCnt = odCommand.ExecuteNonQuery();
            MessageBox.Show("一共有【"+intCnt+"】条数据被更新!");
        }

        //删除处理
        private void DeleteStatus(OleDbConnection conn, string strDel)
        {
            OleDbCommand odCommand = conn.CreateCommand();
            odCommand.CommandText = strDel;
            int intCnt = odCommand.ExecuteNonQuery();
            MessageBox.Show("一共有【" + intCnt + "】条数据被删除!");
        }

        //插入处理
        private void InsertStatus(OleDbConnection conn, string strinsert)
        {
            OleDbCommand odCommand = conn.CreateCommand();
            odCommand.CommandText = strinsert;
            int intCnt = odCommand.ExecuteNonQuery();
            MessageBox.Show("一共有【" + intCnt + "】条数据被插入!");
        }

        //初始连接
        private OleDbConnection initConn()
        {
            string strConn = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:/A.mdb";
            OleDbConnection odcConnection = new OleDbConnection(strConn);
            odcConnection.Open();
            return odcConnection;
        }