c#中高效的excel导入oracle的方法

2009年04月21日 星期二 下午 07:57

如何高效的将excel导入到oracle?和前两天的SqlBulkCopy 导入到sqlserver对应,oracle也有自身的方法,只是稍微复杂些.
那就是使用oracle的sql*loader功能,而sqlldr只支持类似csv格式的数据,所以要自己把excel转换一下。
实现步骤:
用com组件读取excel-保存为csv格式-处理最后一个字段为null的情况和表头-根据excel结构建表-生成sqlldr的控制文件-用sqlldr命令导入数据
这个性能虽然没有sql的bcp快,但还是相当可观的,在我机器上1万多数据不到4秒,而且导入过程代码比较简单,也同样没有循环拼接sql插入那么难以维护。

这里也提个问题:处理csv文件的表头和最后一个字段为null的情况是否可以优化?除了我代码中的例子,我实在想不出其他办法。

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");

}

}

}

转载于:https://www.cnblogs.com/hanhaodong/archive/2010/06/30/1768167.html

c#中高效的excel导入oracle的方法相关推荐

  1. c#中高效的excel导入oracle的方法(转)

    如何高效的将excel导入到oracle?和前两天的SqlBulkCopy 导入到sqlserver对应,oracle也有自身的方法,只是稍微复杂些. 那就是使用oracle的sql*loader功能 ...

  2. dataset中的数据批量导入oracle数据库,c#如何将dataset中的数据批量导入oracle数据库...

    c#如何将dataset中的数据批量导入oracle数据库以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! c#如何将da ...

  3. oracle将excel导入,Win7系统把Excel数据导入oracle的方法(图文)

    今天本教程小编分享Win7系统把Excel数据导入oracle的方法,操作数据库时,将Excel的数据导入到oracle中是非常常见的方式,但是有很多新手用户不知道Win7系统怎么把Excel数据导入 ...

  4. excel+导入oracle+工具,EXCEL导入ORACLE工具(Xls To Ora)下载 v1.9免费版-下载啦

    Xls To Ora是一款专业的Excel导入Oracle软件,能够将Excel表格中的数据快速的导入到Oracle数据库中,支持批量导入多个XML文件,向导式的操作方式,只需按照步骤就可以完成了,需 ...

  5. oracle+excel转txt,Excel数据导入Oracle的方法

    Excel数据导入Oracle的方法 最近同事遇到了每天手工导入Excel数据到Oracle的问题,他目前的操作是使用PL/SQL Developer中的复制粘贴方法,这样每天都需要进行手工的操作,很 ...

  6. oracle如何导入excel数据库文件,如何将excel导入oracle数据库的教程

    在Excel中录入好数据以后就需要导入到oracle数据库,或许有些朋友不知道该如何做.下面是学习啦小编带来的关于如何将excel导入oracle数据库的教程,欢迎阅读! 如何将excel导入orac ...

  7. access数据库导入oracle数据库,将excel表格导入access数据库再导入oracle数据库方法-如何将ACCESS数据库的文件导入到ORACLE中?...

    怎样将excel中的数据导入到oracle数据库中 敢问楼主,表A存在几列,表B存在几列,表C存在几列 常规方法(表中列和excel中列一致) PLSQL 中 : select * from A up ...

  8. dataset中的数据批量导入oracle数据库,C#如何把某个文件夹下的所有Excel文件导入Oracle数据库。详细点!...

    满意答案 o8wlfkcnr 推荐于 2016.01.01 采纳率:45%    等级:7 已帮助:311人 用下面这个方法把excel导入dataview,再把它导入database就简单了 pub ...

  9. Excel百万数据导入oracle,excel表数据导入oracle的方法!(超级有用)

    excel表导入oracle数据库的方法,这些方法也可以用于将其它格式的数据导入到oracle中,这里只是以excel为例.oracle9i以上.21村落‑i3?:L L4s9U#[z:u,U‑l方法 ...

最新文章

  1. 用Microsoft DirectX光线跟踪改善渲染质量
  2. xlrd.biffh.XLRDError: Excel xlsx file; not supported
  3. 机虚拟磁盘附加到计算机上,解决在NAS的共享文件夹下的VHDX虚拟磁盘无法附加到系统...
  4. 省赛组队赛3 比赛总结
  5. 个人发卡网搭建源码_免费建设一个个人网站到底能不能实现
  6. Delphi通过ICMP检测与远程主机连接
  7. weui-react项目实战新心得
  8. 3种类型的程序员:“虫族”,“人族”,“神族”(转载)
  9. cshop是什么开发语言_国内程序员那么多,为什么不开发一个属于自己的编程语言?...
  10. 探索python--Robert J. Brunner
  11. Google的Guava开发库快速快速入门
  12. FastDFS单机、单节点和多节点集群部署文档
  13. Java写的斗地主游戏源码
  14. WBS和TASK的区别?
  15. 基于opencv的数字识别
  16. UDP实时图像传输进阶篇——1080P视频传输
  17. shap 模型_使用shap loss值调试监控模型
  18. htc系统Android 7.1,HTC太强大,被誉为刷机之王,一路升到安卓7
  19. (企业)注册公众平台步骤---订阅号
  20. 代码随想录Day01 | LeetCode704.二分查找、LeetCode27.移除元素

热门文章

  1. APE到底比MP3文件“好听”多少
  2. html5制作心路历程,一个真正0基础小白学习前端开发的心路历程
  3. 使用Oracle Wrap工具加密你的代码
  4. 监控某个dll被修改_浅谈动力环境监控系统技术标准
  5. 2022-04-25 安装PostgreSQL的发现小bug
  6. 2.2 The Environment Abstraction Layer (EAL)
  7. Unity直接导出Android Apk包环境配置
  8. 手机游戏行业洗牌在即 成本增长小团队出局
  9. JavaScript事件触发列表与解说
  10. 通过draggable实现布局_营销推广引流之百度霸屏内容详解 如何通过百度霸屏布局实现立体打法!...