热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Excel数据导入到Oracle

批量Excel数据导入Oracle数据库本篇来源:http:www.cnblogs.comwuhuacongarchive201004281723142.html

批量Excel数据导入Oracle数据库

本篇来源:http://www.cnblogs.com/wuhuacong/archive/2010/04/28/1723142.html

 

由于一直基于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 


推荐阅读
  • 本文介绍了数据库的存储结构及其重要性,强调了关系数据库范例中将逻辑存储与物理存储分开的必要性。通过逻辑结构和物理结构的分离,可以实现对物理存储的重新组织和数据库的迁移,而应用程序不会察觉到任何更改。文章还展示了Oracle数据库的逻辑结构和物理结构,并介绍了表空间的概念和作用。 ... [详细]
  • 本文是一位90后程序员分享的职业发展经验,从年薪3w到30w的薪资增长过程。文章回顾了自己的青春时光,包括与朋友一起玩DOTA的回忆,并附上了一段纪念DOTA青春的视频链接。作者还提到了一些与程序员相关的名词和团队,如Pis、蛛丝马迹、B神、LGD、EHOME等。通过分享自己的经验,作者希望能够给其他程序员提供一些职业发展的思路和启示。 ... [详细]
  • 本文介绍了如何使用php限制数据库插入的条数并显示每次插入数据库之间的数据数目,以及避免重复提交的方法。同时还介绍了如何限制某一个数据库用户的并发连接数,以及设置数据库的连接数和连接超时时间的方法。最后提供了一些关于浏览器在线用户数和数据库连接数量比例的参考值。 ... [详细]
  • Oracle Database 10g许可授予信息及高级功能详解
    本文介绍了Oracle Database 10g许可授予信息及其中的高级功能,包括数据库优化数据包、SQL访问指导、SQL优化指导、SQL优化集和重组对象。同时提供了详细说明,指导用户在Oracle Database 10g中如何使用这些功能。 ... [详细]
  • MySQL中的MVVC多版本并发控制机制的应用及实现
    本文介绍了MySQL中MVCC的应用及实现机制。MVCC是一种提高并发性能的技术,通过对事务内读取的内存进行处理,避免写操作堵塞读操作的并发问题。与其他数据库系统的MVCC实现机制不尽相同,MySQL的MVCC是在undolog中实现的。通过undolog可以找回数据的历史版本,提供给用户读取或在回滚时覆盖数据页上的数据。MySQL的大多数事务型存储引擎都实现了MVCC,但各自的实现机制有所不同。 ... [详细]
  • 本文介绍了一个免费的asp.net控件,该控件具备数据显示、录入、更新、删除等功能。它比datagrid更易用、更实用,同时具备多种功能,例如属性设置、数据排序、字段类型格式化显示、密码字段支持、图像字段上传和生成缩略图等。此外,它还提供了数据验证、日期选择器、数字选择器等功能,以及防止注入攻击、非本页提交和自动分页技术等安全性和性能优化功能。最后,该控件还支持字段值合计和数据导出功能。总之,该控件功能强大且免费,适用于asp.net开发。 ... [详细]
  • 如何实现织梦DedeCms全站伪静态
    本文介绍了如何通过修改织梦DedeCms源代码来实现全站伪静态,以提高管理和SEO效果。全站伪静态可以避免重复URL的问题,同时通过使用mod_rewrite伪静态模块和.htaccess正则表达式,可以更好地适应搜索引擎的需求。文章还提到了一些相关的技术和工具,如Ubuntu、qt编程、tomcat端口、爬虫、php request根目录等。 ... [详细]
  • 本文介绍了通过ABAP开发往外网发邮件的需求,并提供了配置和代码整理的资料。其中包括了配置SAP邮件服务器的步骤和ABAP写发送邮件代码的过程。通过RZ10配置参数和icm/server_port_1的设定,可以实现向Sap User和外部邮件发送邮件的功能。希望对需要的开发人员有帮助。摘要长度:184字。 ... [详细]
  • 本文介绍了在Windows环境下如何配置php+apache环境,包括下载php7和apache2.4、安装vc2015运行时环境、启动php7和apache2.4等步骤。希望对需要搭建php7环境的读者有一定的参考价值。摘要长度为169字。 ... [详细]
  • Java自带的观察者模式及实现方法详解
    本文介绍了Java自带的观察者模式,包括Observer和Observable对象的定义和使用方法。通过添加观察者和设置内部标志位,当被观察者中的事件发生变化时,通知观察者对象并执行相应的操作。实现观察者模式非常简单,只需继承Observable类和实现Observer接口即可。详情请参考Java官方api文档。 ... [详细]
  • Windows7 64位系统安装PLSQL Developer的步骤和注意事项
    本文介绍了在Windows7 64位系统上安装PLSQL Developer的步骤和注意事项。首先下载并安装PLSQL Developer,注意不要安装在默认目录下。然后下载Windows 32位的oracle instant client,并解压到指定路径。最后,按照自己的喜好对解压后的文件进行命名和压缩。 ... [详细]
  • Oracle优化新常态的五大禁止及其性能隐患
    本文介绍了Oracle优化新常态中的五大禁止措施,包括禁止外键、禁止视图、禁止触发器、禁止存储过程和禁止JOB,并分析了这些禁止措施可能带来的性能隐患。文章还讨论了这些禁止措施在C/S架构和B/S架构中的不同应用情况,并提出了解决方案。 ... [详细]
  • 本文介绍了Oracle存储过程的基本语法和写法示例,同时还介绍了已命名的系统异常的产生原因。 ... [详细]
  • 本文介绍了lua语言中闭包的特性及其在模式匹配、日期处理、编译和模块化等方面的应用。lua中的闭包是严格遵循词法定界的第一类值,函数可以作为变量自由传递,也可以作为参数传递给其他函数。这些特性使得lua语言具有极大的灵活性,为程序开发带来了便利。 ... [详细]
  • 本文介绍了一个在线急等问题解决方法,即如何统计数据库中某个字段下的所有数据,并将结果显示在文本框里。作者提到了自己是一个菜鸟,希望能够得到帮助。作者使用的是ACCESS数据库,并且给出了一个例子,希望得到的结果是560。作者还提到自己已经尝试了使用"select sum(字段2) from 表名"的语句,得到的结果是650,但不知道如何得到560。希望能够得到解决方案。 ... [详细]
author-avatar
懿子vae_742
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有