zoukankan      html  css  js  c++  java
  • 批量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);
                    }
                }
            }

    以上代码,为了方便,使用了输出脚本的方式进行验证对比,一般情况下也是用得着的。

    最后附上该程序的源码,和大家分享学习:https://files.cnblogs.com/wuhuacong/ImportExcelToOracle.rar 

    主要研究技术:代码生成工具、会员管理系统、客户关系管理软件、病人资料管理软件、Visio二次开发、酒店管理系统、仓库管理系统等共享软件开发
    专注于Winform开发框架/混合式开发框架Web开发框架Bootstrap开发框架微信门户开发框架的研究及应用
      转载请注明出处:
    撰写人:伍华聪  http://www.iqidi.com 
        
  • 相关阅读:
    图片《小美眉》
    redhat基本知识
    Linux 求助。设置分辨率?

    PHP close
    别想一个人承担一切
    java charAt返回char,不是int
    我的计算器
    支付宝面试小贴士
    java string charAt length()疑惑
  • 原文地址:https://www.cnblogs.com/wuhuacong/p/1723142.html
Copyright © 2011-2022 走看看