由于一直基于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[];
}
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 = ;
int intFail = ; if (myDs != null && myDs.Tables[].Rows.Count > )
{
string accessConnectString = config.GetConnectionString("DataAccess");
OracleConnection conn = new OracleConnection(accessConnectString);
conn.Open();
OracleCommand com = null; #region 组装字段列表
string insertColumnString = "ID,";
DataTable dt = myDs.Tables[];
int k = ;
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[].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 = ; 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) > ;
if (exist)
{
//需要更新
//WriteString(updateSql);
com.CommandText = updateSql;
succeed = com.ExecuteNonQuery() > ;
}
else
{
//需要插入
//WriteString2(insertSql);
com.CommandText = insertSql;
succeed = com.ExecuteNonQuery() > ;
} 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 > || intFail > )
{
string tips = string.Format("数据导入成功:{0}个,失败:{1}个", intOk, intFail);
MessageUtil.ShowTips(tips);
}
}
}

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

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

来自:http://www.cnblogs.com/wuhuacong/archive/2010/04/28/1723142.html

有用的评论:

1、多个sheet 如何处理

可以分别取得几个Sheet的名字,如下代码:
DataTable dtSheetName = conn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables,
new object[] { null, null, null, "TABLE" });
string strSheetName = dtSheetName.Rows[]["TABLE_NAME"].ToString();
OleDbDataAdapter oda = new OleDbDataAdapter("select * from "
+ "[" + strSheetName + "]", conn);

2、这种方式还有一种弊端,导入上百万的数据记录时就是鸡肋,建议将从sheet中读取到的数据转换为datatable,然后采用SqlBulkCopy批量导入,效率会大幅度提升

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

  1. 代码执行批量Excel数据导入Oracle数据库

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

  2. 批量Excel数据导入Oracle数据库 导入excel错误:外部表不是预期的格式 解决方案

    在asp.net网站中导出Excel文件后,再把文件导入到数据库中. 读取Excel文件时,打开连接出错. 错误为:外部表不是预期的格式 解决:检查了一下,导出的Excel是标准文件不是html,没错 ...

  3. 利用TOAD实现把EXCEL数据导入oracle数据库

    利用TOAD实现把EXCEL数据导入oracle数据库 工具:   Toad11.7z(百度搜索,直接下载) 1.将Excel文件中某些字段导入到Oracle数据库的对应表 连接想要导入的数据库 ,然 ...

  4. 使用Plsql将Excel数据导入Oracle数据库

    1.在plsql页面,Tools-->ODBC Importer... 2.配置被导入的excel files 3.选择excel文件 4.选择Excel中要被导入的的sheet工作簿,选择之后 ...

  5. kettle将Excel数据导入oracle

    导读 Excel数据导入Oracle数据库的方法: 1.使用PL SQL 工具附带的功能,效率比较低 可参考这篇文章的介绍:http://www.2cto.com/database/201212/17 ...

  6. 将Excel数据导入mysql数据库的几种方法

    将Excel数据导入mysql数据库的几种方法 “我的面试感悟”有奖征文大赛结果揭晓! 前几天需要将Excel表格中的数据导入到mysql数据库中,在网上查了半天,研究了半天,总结出以下几种方法,下面 ...

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

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

  8. java实现EXCEL数据导入到数据库中的格式问题的解决

    之前作为项目甲方,加之java接触不多,在java web开发方面都是打下手的份. 对于EXCEL数据导入到数据库这个问题一直老是出现格式原因而导入失败也是未免惆怅,开发团队也是只说回去检查一下格式. ...

  9. Java使用iBatis批量插入数据到Oracle数据库

    Java使用iBatis批量插入数据到Oracle数据库 因为我们的数据跨库(mysql,oracle),单独取数据的话需要遍历好多遍,所以就想着先从mysql数据库中取出来的数据然后在oracle数 ...

随机推荐

  1. 初探AngularJs框架(二)

    一.创建Components组件 直接使用AngularCLI即可很方便的创建component组件,使用如下指令: ng g component components/news 这样就会在compo ...

  2. 转:三值逻辑与NULL的处理方式

    来自:<Microsoft SQL SERVER 2008技术内幕 T-SQL查询>P7 在SQL中谓词(逻辑表达式)的可能值为TRUE.FALSE和UNKNOWN.这就是所谓的三值逻辑, ...

  3. linux 禁止22端口号

    重启防火墙命令#systemctl restart iptables.service 查看端口号#iptables -L首先修改配置文件 vi /etc/ssh/sshd_config 增加新端口号P ...

  4. php 获取ip地址的5种方法,插入用户登录日志实例

    php 获取ip地址的5种方法,插入用户登录日志实例,推荐使用第二种方法 <?php //方法1: $ip = $_SERVER["REMOTE_ADDR"]; echo $ ...

  5. jenkins2

    创建工程 Eclipse创建工程:注意工程的路径,不是/home/svn,这个是svn的根目录. 是工程上传的路径,Apple直接下面有pom文件. 创建工程,创建一个任务就是创建一个工程. 需要注意 ...

  6. Matlab基础部分2-数组和矩阵分析

    矩阵块操作: 矩阵尺寸改变: 矩阵的查找: 矩阵的排序: 矩阵求和: 矩阵的求积: 矩阵的差分: 全零矩阵: 单位矩阵: 随机矩阵: 伴随矩阵: 方针行列式计算: 特征值: 对角矩阵: 三角矩阵: 矩 ...

  7. Linux系统管理和维护常用命令

    Linux系统管理和维护常用命令 ls 命令 功能说明 ls 命令显示指定工作目录下的内容,列出工作目录所包含的文件及子目录. 语法结构: ls [选项] [路径或文件] ls 选项及说明 -a 显示 ...

  8. 再论sklearn分类器

    https://www.cnblogs.com/hhh5460/p/5132203.html 这几天在看 sklearn 的文档,发现他的分类器有很多,这里做一些简略的记录. 大致可以将这些分类器分成 ...

  9. 统计py文件中的代码行

    希望是输入一个合法的文件夹的路径,然后代码自动读取该文件夹下的每个py结尾的文件内的代码行数,最后汇总一个数,但现在只是有思路,却没时间写,这是能读取同级文件下的某个文件, with open('te ...

  10. topcoder srm 683 div1

    problem1 link 肯定存在相邻两堆满足不会存在任何操作在这两堆之间进行.然后就成为一条链,那么只需要维护链的前缀和即可判断当前堆和前一堆之间需要多少次操作. problem2 link 对于 ...