Excel导入oracle

转载 2012年03月21日 21:56:06
  将excel导入到oracle
  那就是使用oracle的sql*loader功能,而sqlldr只支持类似csv格式的数据,所以要自己把excel转换一下。
  实现步骤:
  用com组件读取excel-保存为csv格式-处理最后一个字段为null的情况和表头-根据excel结构建表-生成sqlldr的控制文件-用sqlldr命令导入数据
  这个性能虽然没有sql的bcp快,但还是相当可观的,在我机器上1万多数据不到4秒,而且导入过程代码比较简单,也同样没有循环拼接sql插入那么难以维护。
  这里也提个问题:处理csv文件的表头和最后一个字段为null的情况是否可以优化?
view plaincopy to clipboardprint?
using System;
using System.Data;
using System.Text;
using System.Windows.Forms;
using Microsoft.Office.Interop.Excel;
using System.Data.OleDb;
//引用-com-microsoft excel objects 11.0
namespace WindowsApplication5
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
///
/// excel导入到oracle
///
/// 文件名
/// sheet名
/// oracle命令sqlplus连接串
public void TransferData(string excelFile, string sheetName, string sqlplusString)
{
string strTempDir = System.IO.Path.GetDirectoryName(excelFile);
string strFileName = System.IO.Path.GetFileNameWithoutExtension(excelFile);
string strCsvPath = strTempDir +"\\"+strFileName + ".csv";
string strCtlPath = strTempDir + "\\" + strFileName + ".Ctl";
string strSqlPath = strTempDir + "\\" + strFileName + ".Sql";
if (System.IO.File.Exists(strCsvPath))
System.IO.File.Delete(strCsvPath);//获取excel对象
Microsoft.Office.Interop.Excel.Application ObjExcel = new Microsoft.Office.Interop.Excel.Application();
Microsoft.Office.Interop.Excel.Workbook ObjWorkBook;
Microsoft.Office.Interop.Excel.Worksheet ObjWorkSheet = null;
ObjWorkBook = ObjExcel.Workbooks.Open(excelFile, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing);
foreach (Microsoft.Office.Interop.Excel.Worksheet sheet in ObjWorkBook.Sheets)
{
if (sheet.Name.ToLower() == sheetName.ToLower())
{
ObjWorkSheet = sheet;
break;
}
}
if (ObjWorkSheet == null) throw new Exception(string.Format("{0} not found!!", sheetName));
//保存为csv临时文件
ObjWorkSheet.SaveAs(strCsvPath, Microsoft.Office.Interop.Excel.XlFileFormat.xlCSV, Type.Missing, Type.Missing, false, false, false, Type.Missing, Type.Missing, false);
ObjWorkBook.Close(false, Type.Missing, Type.Missing);
ObjExcel.Quit();
//读取csv文件,需要将表头去掉,并且将最后一列为null的字段处理为显示的null,否则oracle不会识别,这个步骤有没有好的替换方法?
System.IO.StreamReader reader = new System.IO.StreamReader(strCsvPath,Encoding.GetEncoding("gb2312"));
string strAll = reader.ReadToEnd();
reader.Close();
string strData = strAll.Substring(strAll.IndexOf("\r\n") + 2).Replace(",\r\n",",Null");
byte[] bytes = System.Text.Encoding.Default.GetBytes(strData);
System.IO.Stream ms = System.IO.File.Create(strCsvPath);
ms.Write(bytes, 0, bytes.Length);
ms.Close();
//获取excel表结构
string strConn = "Provider=Microsoft.Jet.OLEDB.4.0;" + "Data Source=" + excelFile + ";" + "Extended Properties=Excel 8.0;";
OleDbConnection conn = new OleDbConnection(strConn);
conn.Open();
System.Data.DataTable table = conn.GetOleDbSchemaTable(System.Data.OleDb.OleDbSchemaGuid.Columns,
new object[] { null, null, sheetName+"$", null });
//生成sqlldr用到的控制文件,文件结构参考sql*loader功能,本示例已逗号分隔csv,数据带逗号的用引号括起来。
string strControl ="load data\r\ninfile '{0}' \r\nappend into table {1}\r\n"+  
"FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '\"'\r\n("; 
strControl = string.Format(strControl, strCsvPath,sheetName);
foreach (System.Data.DataRow drowColumns in table.Select("1=1", "Ordinal_Position"))
{
strControl += drowColumns["Column_Name"].ToString() + ",";
}
strControl = strControl.Substring(0, strControl.Length - 1) + ")";
bytes=System.Text.Encoding.Default.GetBytes(strControl);
ms= System.IO.File.Create(strCtlPath);
ms.Write(bytes, 0, bytes.Length);
ms.Close(); //生成初始化oracle表结构的文件
string strSql = @"drop table {0};
create table {0}
(";
strSql = string.Format(strSql, sheetName);
foreach (System.Data.DataRow drowColumns in table.Select("1=1", "Ordinal_Position"))
{
strSql += drowColumns["Column_Name"].ToString() + " varchar2(255),";
}
strSql = strSql.Substring(0, strSql.Length - 1) + ");\r\nexit;";
bytes = System.Text.Encoding.Default.GetBytes(strSql);
ms = System.IO.File.Create(strSqlPath);
ms.Write(bytes, 0, bytes.Length);
ms.Close();
//运行sqlplus,初始化表
System.Diagnostics.Process p = new System.Diagnostics.Process();
p.StartInfo = new System.Diagnostics.ProcessStartInfo();
p.StartInfo.FileName = "sqlplus";
p.StartInfo.Arguments = string.Format("{0} @{1}", sqlplusString, strSqlPath);
p.StartInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden;
p.StartInfo.UseShellExecute = false;
p.StartInfo.CreateNoWindow = true;
p.Start();
p.WaitForExit();
//运行sqlldr,导入数据
p = new System.Diagnostics.Process();
p.StartInfo = new System.Diagnostics.ProcessStartInfo();
p.StartInfo.FileName = "sqlldr";
p.StartInfo.Arguments = string.Format("{0} {1}", sqlplusString, strCtlPath);
p.StartInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden;
p.StartInfo.RedirectStandardOutput = true;
p.StartInfo.UseShellExecute = false;
p.StartInfo.CreateNoWindow = true;
p.Start();
System.IO.StreamReader r = p.StandardOutput;//截取输出流
string line = r.ReadLine();//每次读取一行
textBox3.Text += line + "\r\n";
while (!r.EndOfStream)
{
line = r.ReadLine();
textBox3.Text += line + "\r\n";
textBox3.Update();
}
p.WaitForExit();
//可以自行解决掉临时文件csv,ctl和sql,代码略去
}
private void button1_Click(object sender, EventArgs e)
{
TransferData(@"D:\test.xls", "Sheet1", "username/password@servicename");
}
}
}

oracle 导入EXCEL数据的简单方法

前几天遇到需要把excel中的数据导入oracle 数据表的问题,起初我首先尝试的是最方便的,大家最容易想到的方法: 如需要插入数据的表 Area,  select * from Area fo...
  • shiqq
  • shiqq
  • 2014年05月20日 20:48
  • 886

读取Excel数据、批量导入到Oracle数据库

/** * @Description: 得到Excel文档,把文档中的数据批量导入到数据库中 * 1、找到上传的数据,2、把数据放到List集合中,3、把List集合中的数据更新到数据库 * @ret...
  • haima573979352
  • haima573979352
  • 2013年10月29日 11:54
  • 2914

用toad for oracle将excel数据导入数据库

用toad for oracle将excel数据导入数据库 连接想要导入的数据库 ,然后Database->Import->Table Data打开了导入窗口,选择一个数据库表,点击Show Da...
  • yangwenxue_admin
  • yangwenxue_admin
  • 2016年01月22日 09:54
  • 4036

Java代码实现excel数据导入到Oracle

1.首先需要两个jar包jxl.jar,ojdbc.jar(注意版本,版本不合适会报版本错误) 2.代码: Java代码   import java.io.File;  ...
  • lulin27860
  • lulin27860
  • 2014年02月11日 10:18
  • 1453

如何把数万行的Excel数据导入到Oracle数据库中

我们知道,当处理小批量的数据时,Excel还是挺方便的。但当数据量有数万,数十万时,Oracle数据库就显现出其优势来了。那么,如何把数万条数据的Excel格式文件导入到Oracle中呢?下面我们含有...
  • doovin
  • doovin
  • 2016年10月25日 10:22
  • 1320

使用PL/SQLDeveloper把excel数据导入到数据库

举例一个行政区划的excel数据表,如下: 把文件保存成txt文档,如下: 使用PL/SQL Developer将数据导入到oracle中,在Tools栏找到Text importer选项,如下:...
  • huangyanlong
  • huangyanlong
  • 2015年04月21日 08:44
  • 6591

使用PLSQL Developer中的ODBC导入器将Excel表导入Oracle数据库

使用PLSQL Developer中的ODBC导入器将Excel表导入Oracle数据库
  • BinGISer
  • BinGISer
  • 2017年11月27日 19:24
  • 314

Delphi Excel导入 的通用程序

Delphi Excel导入 的通用程序 . 分类: delphi 2012-09-24 18:20 257人阅读 评论(0) 收藏 举报  exceldelphiinteger数据库c步骤: ...
  • wozengcong
  • wozengcong
  • 2014年08月30日 09:49
  • 1503

利用java导入导出excel到oracle数据库

原地址:http://jingyan.baidu.com/article/1709ad80a975fe4634c4f0ae.html 方法/步骤 1 用到的JAR包如下(可以...
  • shuiluobu
  • shuiluobu
  • 2014年05月04日 15:30
  • 2017

POI一键导入Excel数据到数据库

Apache POI是Apache软件基金会的开放源码函式库,POI提供API给Java程序对Microsoft Office格式档案读和写的功能。 直接...
  • zwz568017880
  • zwz568017880
  • 2014年06月20日 14:34
  • 2626
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Excel导入oracle
举报原因:
原因补充:

(最多只允许输入30个字)