批量Excel数据导入Oracle数据库

由于一直基于Oracle数据库上做开发,因此常常会需要把大量的Excel数据导入到Oracle数据库中,其实如果从事SqlServer数据库的开发,那么思路也是一样的,本文主要介绍如何导入Excel数据进入Oracle数据库的内容。

一般我们拿到的Excel数据,都会有一个表头说明,然后下面是一连串的数据内容,如下图所示:

 

而Oracle中数据库一般为英文名称,中文名称就需要转义,为了方便导入,我把中文名称对照数据库的字段,把表头修改为对应的字段名称,如果没有数据库对应的字段,那么删除Excel的无用列即可,如下所示。

 

首先我们在导入Excel的例子中加载显示要导入的数据,一个是为了直观,第二个也是为了检查数据的有效性,避免出错,界面如下所示:

 

在介绍导入操作前,我们先要分析下数据,否则就很容易出现错误的语句,一般日期的格式、数字的格式就要特别注意,文本格式一般看是否超出字段的长度,一般成功导入前都会发生好多次的错误问题,解决了这些格式的问题,基本上就OK了。如下面日期和数字的格式问题,就必须注意转换为对应的内容格式:

 

下面介绍具体的显示数据和导入数据的操作代码:

 显示Excel数据的代码如下所示:

        private string connectionStringFormat = "Provider = Microsoft.Jet.OLEDB.4.0 ; Data Source = '{0}';Extended Properties=Excel 8.0";
        private DataSet myDs = new DataSet();

        private void btnViewData_Click(object sender, EventArgs e)
        {
            if (this.txtFilePath.Text == "")
            {
                MessageUtil.ShowTips("请选择指定的Excel文件");
                return;
            }

            string connectString = string.Format(connectionStringFormat, this.txtFilePath.Text);
            try
            {
                myDs.Tables.Clear();
                myDs.Clear();
                OleDbConnection cnnxls = new OleDbConnection(connectString);
                OleDbDataAdapter myDa = new OleDbDataAdapter("select * from [Sheet1$]", cnnxls);
                myDa.Fill(myDs, "c");

                dataGrid1.DataSource = myDs.Tables[0];
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }

导入操作的代码如下所示(由于数据格式需要验证,以及需要判断数据库是否存在指定关键字的记录,如果存在,那么更新,否则插入新的记录,如果仅仅是第一次导入,操作代码可以更为精简一些):

        private void btnSaveData_Click(object sender, EventArgs e)
        {
            if (this.txtFilePath.Text == "")
            {
                MessageUtil.ShowTips("请选择指定的Excel文件");
                return;
            }

            if (MessageUtil.ShowYesNoAndWarning("该操作将把数据导入到系统的用户数据库中,您确定是否继续?") == DialogResult.Yes)
            {
                InsertData();
            }
        }

        private bool CheckIsDate(string columnName)
        {
            string str = ",PREPARE_DATE,COPY_DATE,COPY_VALIDITY,BUSINESS_VALIDITY,OPENING_APPROVAL_DATE,OPENING_DATE,EDITTIME,LICENSE_DATE,LICENSE_VALIDITY,TEMP_OPENING_DATE,LICENSE_START_DATE,ADDTIME,EDITTIME,";
            return str.Contains("," + columnName.ToUpper() + ",");
        }

        private bool CheckIsNumeric(string columnName)
        {
            string str = ",FIXED_CAPITAL,REG_CAPITAL,MARGIN,PARK_AREA,PARK_SPACE_NUMBER,";
            return str.Contains("," + columnName.ToUpper() + ",");
        }

        private void InsertData()
        {
            int intOk = 0;
            int intFail = 0;

            if (myDs != null && myDs.Tables[0].Rows.Count > 0)
            {
                string accessConnectString = config.GetConnectionString("DataAccess");
                OracleConnection conn = new OracleConnection(accessConnectString);
                conn.Open();
                OracleCommand com = null;

                #region 组装字段列表
                string insertColumnString = "ID,";
                DataTable dt = myDs.Tables[0];
                int k = 0;
                foreach (DataColumn col in dt.Columns)
                {
                    insertColumnString += string.Format("{0},", col.ColumnName);
                }
                insertColumnString = insertColumnString.Trim(',');

                #endregion

                try
                {
                    foreach (DataRow dr in dt.Rows)
                    {
                        if (dr[0].ToString() == "")
                        {
                            continue;
                        }

                        #region 组装Sql语句
                        string insertValueString = "SEQ_TBPARK_ENTERPRISE.Nextval,";
                        string updateValueString = "";
                        string COMPANY_CODE = dr["COMPANY_CODE"].ToString().Replace("<空>", "");

                        #region 拼接Sql字符串

                        for(int i = 0; i < dt.Columns.Count; i++)
                        {
                            string originalValue = dr[i].ToString().Replace("<空>", "");
                            //if (!CheckIsDate(dt.Rows[0][i].ToString()))
                            if (!CheckIsDate(dt.Columns[i].ColumnName))
                            {
                                if (!string.IsNullOrEmpty(originalValue))
                                {
                                    if (CheckIsNumeric(dt.Columns[i].ColumnName))
                                    {
                                        insertValueString += string.Format("'{0}',", Convert.ToDecimal(originalValue));
                                        updateValueString += string.Format("{0}='{1}',", dt.Columns[i].ColumnName, Convert.ToDecimal(originalValue));
                                    }
                                    else
                                    {
                                        insertValueString += string.Format("'{0}',", originalValue);
                                        updateValueString += string.Format("{0}='{1}',", dt.Columns[i].ColumnName, originalValue);
                                    }
                                }
                                else
                                {
                                    insertValueString += string.Format("NULL,");
                                    updateValueString += string.Format("{0}=NULL,", dt.Columns[i].ColumnName);
                                }
                            }
                            else
                            {
                                if (!string.IsNullOrEmpty(originalValue))
                                {
                                    insertValueString += string.Format("to_date('{0}','yyyy-mm-dd'),", Convert.ToDateTime(originalValue).ToString("yyyy-MM-dd"));
                                    updateValueString += string.Format("{0}=to_date('{1}','yyyy-mm-dd'),", dt.Columns[i].ColumnName, Convert.ToDateTime(originalValue).ToString("yyyy-MM-dd"));
                                }
                                else
                                {
                                    insertValueString += string.Format("NULL,");
                                    updateValueString += string.Format("{0}=NULL,", dt.Columns[i].ColumnName);
                                }
                            }
                        }
                        insertValueString = insertValueString.Trim(',');
                        updateValueString = updateValueString.Trim(','); 
                        #endregion

                        string insertSql = string.Format(@"INSERT INTO tbpark_enterprise ({0}) VALUES({1})", insertColumnString, insertValueString);
                        string updateSql = string.Format("Update tbpark_enterprise set {0} Where COMPANY_CODE='{1}' ", updateValueString, COMPANY_CODE);
                        string checkExistSql = string.Format("Select count(*) from tbpark_enterprise where COMPANY_CODE='{0}' ", COMPANY_CODE);
                        #endregion

                        #region 写入数据
                        try
                        {
                            com = new OracleCommand();
                            com.Connection = conn;
                            com.CommandText = checkExistSql;
                            object objCount = com.ExecuteScalar();

                            bool succeed = false;
                            bool exist = Convert.ToInt32(objCount) > 0;
                            if (exist)
                            {
                                //需要更新
                                //WriteString(updateSql);
                                com.CommandText = updateSql;
                                succeed = com.ExecuteNonQuery() > 0;
                            }
                            else
                            {
                                //需要插入
                                //WriteString2(insertSql);
                                com.CommandText = insertSql;
                                succeed = com.ExecuteNonQuery() > 0;
                            }

                            if (succeed)
                            {
                                intOk++;
                            }
                            else
                            {
                                intFail++;
                            }
                        }
                        catch (Exception ex)
                        {
                            intFail++;
                            WriteString(com.CommandText);
                            LogHelper.Error(ex);
                            break;
                        }

                        #endregion
                    }

                    #region 关闭
                    if (conn != null && conn.State != ConnectionState.Closed)
                    {
                        conn.Close();
                    }
                    if (com != null)
                    {
                        com.Dispose();
                    }
                    #endregion
                }
                catch (Exception ex)
                {
                    LogHelper.Error(ex);
                    MessageUtil.ShowError(ex.ToString());
                }

                if (intOk > 0 || intFail > 0)
                {
                    string tips = string.Format("数据导入成功:{0}个,失败:{1}个", intOk, intFail);
                    MessageUtil.ShowTips(tips);
                }
            }
        }

 本文转自博客园伍华聪的博客,原文链接:批量Excel数据导入Oracle数据库,如需转载请自行联系原博主。

时间: 2024-07-29 15:47:42

批量Excel数据导入Oracle数据库的相关文章

excel 数据导入oracle中有哪些方法

问题描述 excel 数据导入oracle中有哪些方法 数据初始化时,很多excel文件上的数据需要导入到数据库中,不知道有一些什么好方法?目前,我是用程序导入的,但是速度肯定不如直接操作数据库,简单一点的表目前是弄了一个中间表,先讲数据导入到中间表,然后对一些字段进行处理,存储过程,讲数据复制到目标表中,但是,也存在一些问题,就是,如果想要查一个关联的id,返回多个的时候,需要把信息保存下来,但是本条数据不处理,相当于程序中的continue,还有异常的处理,父子关系,比如说,一个父对象,下面

将Excel数据导入Access数据库

access|excel|数据|数据库 将Excel数据导入Access数据库   最近,有一些网友常常问到关于Execl数据库操作的问题,其中不少是关于"Excel数据导入Access "的问题.至于将Execl数据导入Access的方法有两种:一种是直接导入法:另一种是建立连接法.而我们在日常工作中用的最多的是直接导入法,限于篇幅,我这里就只讲直接导入法,希望能给大家带来参考. 具体操作可以按以下步骤进行: 1. 启动Microsoft Access2000: 2.  建立一个空数

c#将Excel数据导入到数据库的实现代码

 这篇文章主要介绍了c#将Excel数据导入到数据库的实现代码,有需要的朋友可以参考一下 假如Excel中的数据如下:     数据库建表如下:     其中Id为自增字段:     代码:      代码如下: using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; usin

提问如何用vb.net实现将excel文件导入oracle数据库

问题描述 提问如何用vb.net实现将excel文件导入oracle数据库,或者是csv文件也可以需要新建一个表,将文本中的内容导入这个表,需要有框架,大体就是选择一个文件,导入就可以 解决方案 解决方案二:Refertothreadfollowshttp://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=150437&SiteID=1DimMyCommandAsSystem.Data.OleDb.OleDbDataAdapterDimMyConn

用npoi将excel数据导入到数据库,数据0.9变成了.9怎么办

问题描述 用npoi将excel数据导入到数据库,数据0.9变成了.9怎么办 DataTable table = new DataTable(); OpenFileDialog opfile = new OpenFileDialog(); opfile.Filter = " xlsx files(*.xls)|*.xls|All files(*.*)|*.*";//选择保存的格式(显示格式|实际格式) if (opfile.ShowDialog() == DialogResult.OK

easyui-关于spring mvc框架 easyUI界面将excel数据导入到数据库中的方法

问题描述 关于spring mvc框架 easyUI界面将excel数据导入到数据库中的方法 将一个excel表格的文件导入到数据库中,在界面调用得到所有数据的方法将数据显示在页面上,如何将excel表格的文件导入到数据库中呢 解决方案 可以使用poi 插件,对Excel进行操作,获取数据,保存到数据库中

asp.net中EXCEL数据导入到数据库的方法_实用技巧

本文实例讲述了asp.net中EXCEL数据导入到数据库的方法.分享给大家供大家参考.具体分析如下: excel是办公中非常常用的一个办公表格了,但我们在开发中通常会需要直接把excel数据快速导入到数据库中了,这里整理了一个asp.net中EXCEL数据导入到数据库的例子供各位参考学习. 注意:EXCEL中的第一行不能导入.下面是源码:IntoExcel.aspx: 复制代码 代码如下: <%@ Page  AutoEventWireup="true" CodeFile=&qu

excel数据导入mysql数据库二种方法

下面我们要讲二种excel数据导入mysql教程数据库教程方法了,这二种方法比较简单,也是很方便的,以前我把excel数据导入到mysql数据库都是用php教程程序来实例,现在我们不需要程序,用现有的工具就行了. 方法一,利用phpmyadmin把excel数据导入mysql数据库方法如下 这是excel的,必须是这种样子的. 在phpmyadmin导入文件的格式应该如上图配置.(注意一点,导入的excel表的结构必须与mysql数据表的结构,数据类型等一致就ok了.否则会导入失败的. 方法二,

导入Excel数据到Oracle数据库的脚本

在cmd运行窗口中输入:sqlldr customermanager/123@orcl control="E:\CustomerData\excelInputOracle\insert.ctl" log=E:\CustomerData\excelInputOracle\log.txt skip=1 说明: { sqlldr是sqlloader的命令语句 customermanager/123@orcl是连接数据库,用户名/密码@服务名 control控制命令 后接控制文本的地址 log