`
javatoyou
  • 浏览: 1083587 次
  • 性别: Icon_minigender_2
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

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

 
阅读更多

如何高效的将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的情况是否可以优化?除了我代码中的例子,我实在想不出其他办法。

  1. usingSystem;
  2. usingSystem.Data;
  3. usingSystem.Text;
  4. usingSystem.Windows.Forms;
  5. usingMicrosoft.Office.Interop.Excel;
  6. usingSystem.Data.OleDb;
  7. //引用-com-microsoftexcelobjects11.0
  8. namespaceWindowsApplication5
  9. {
  10. publicpartialclassForm1:Form
  11. {
  12. publicForm1()
  13. {
  14. InitializeComponent();
  15. }
  16. ///<SUMMARY>
  17. ///excel导入到oracle
  18. ///</SUMMARY>
  19. ///<PARAMname="excelFile">文件名</PARAM>
  20. ///<PARAMname="sheetName">sheet名</PARAM>
  21. ///<PARAMname="sqlplusString">oracle命令sqlplus连接串</PARAM>
  22. publicvoidTransferData(stringexcelFile,stringsheetName,stringsqlplusString)
  23. {
  24. stringstrTempDir=System.IO.Path.GetDirectoryName(excelFile);
  25. stringstrFileName=System.IO.Path.GetFileNameWithoutExtension(excelFile);
  26. stringstrCsvPath=strTempDir+"//"+strFileName+".csv";
  27. stringstrCtlPath=strTempDir+"//"+strFileName+".Ctl";
  28. stringstrSqlPath=strTempDir+"//"+strFileName+".Sql";
  29. if(System.IO.File.Exists(strCsvPath))
  30. System.IO.File.Delete(strCsvPath);
  31. //获取excel对象
  32. Microsoft.Office.Interop.Excel.ApplicationObjExcel=newMicrosoft.Office.Interop.Excel.Application();
  33. Microsoft.Office.Interop.Excel.WorkbookObjWorkBook;
  34. Microsoft.Office.Interop.Excel.WorksheetObjWorkSheet=null;
  35. 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);
  36. foreach(Microsoft.Office.Interop.Excel.WorksheetsheetinObjWorkBook.Sheets)
  37. {
  38. if(sheet.Name.ToLower()==sheetName.ToLower())
  39. {
  40. ObjWorkSheet=sheet;
  41. break;
  42. }
  43. }
  44. if(ObjWorkSheet==null)thrownewException(string.Format("{0}notfound!!",sheetName));
  45. //保存为csv临时文件
  46. ObjWorkSheet.SaveAs(strCsvPath,Microsoft.Office.Interop.Excel.XlFileFormat.xlCSV,Type.Missing,Type.Missing,false,false,false,Type.Missing,Type.Missing,false);
  47. ObjWorkBook.Close(false,Type.Missing,Type.Missing);
  48. ObjExcel.Quit();
  49. //读取csv文件,需要将表头去掉,并且将最后一列为null的字段处理为显示的null,否则oracle不会识别,这个步骤有没有好的替换方法?
  50. System.IO.StreamReaderreader=newSystem.IO.StreamReader(strCsvPath,Encoding.GetEncoding("gb2312"));
  51. stringstrAll=reader.ReadToEnd();
  52. reader.Close();
  53. stringstrData=strAll.Substring(strAll.IndexOf("/r/n")+2).Replace(",/r/n",",Null");
  54. byte[]bytes=System.Text.Encoding.Default.GetBytes(strData);
  55. System.IO.Streamms=System.IO.File.Create(strCsvPath);
  56. ms.Write(bytes,0,bytes.Length);
  57. ms.Close();
  58. //获取excel表结构
  59. stringstrConn="Provider=Microsoft.Jet.OLEDB.4.0;"+"DataSource="+excelFile+";"+"ExtendedProperties=Excel8.0;";
  60. OleDbConnectionconn=newOleDbConnection(strConn);
  61. conn.Open();
  62. System.Data.DataTabletable=conn.GetOleDbSchemaTable(System.Data.OleDb.OleDbSchemaGuid.Columns,
  63. newobject[]{null,null,sheetName+"$",null});
  64. //生成sqlldr用到的控制文件,文件结构参考sql*loader功能,本示例已逗号分隔csv,数据带逗号的用引号括起来。
  65. stringstrControl="loaddata/r/ninfile&apos;{0}&apos;/r/nappendintotable{1}/r/n"+   
  66.   "FIELDSTERMINATEDBY&apos;,&apos;OPTIONALLYENCLOSEDBY&apos;/"&apos;/r/n(";  
  67. strControl=string.Format(strControl,strCsvPath,sheetName);
  68. foreach(System.Data.DataRowdrowColumnsintable.Select("1=1","Ordinal_Position"))
  69. {
  70. strControl+=drowColumns["Column_Name"].ToString()+",";
  71. }
  72. strControl=strControl.Substring(0,strControl.Length-1)+")";
  73. bytes=System.Text.Encoding.Default.GetBytes(strControl);
  74. ms=System.IO.File.Create(strCtlPath);
  75. ms.Write(bytes,0,bytes.Length);
  76. ms.Close();
  77. //生成初始化oracle表结构的文件
  78. stringstrSql=@"droptable{0};          
  79.   createtable{0} 
  80.   (";
  81. strSql=string.Format(strSql,sheetName);
  82. foreach(System.Data.DataRowdrowColumnsintable.Select("1=1","Ordinal_Position"))
  83. {
  84. strSql+=drowColumns["Column_Name"].ToString()+"varchar2(255),";
  85. }
  86. strSql=strSql.Substring(0,strSql.Length-1)+");/r/nexit;";
  87. bytes=System.Text.Encoding.Default.GetBytes(strSql);
  88. ms=System.IO.File.Create(strSqlPath);
  89. ms.Write(bytes,0,bytes.Length);
  90. ms.Close();
  91. //运行sqlplus,初始化表
  92. System.Diagnostics.Processp=newSystem.Diagnostics.Process();
  93. p.StartInfo=newSystem.Diagnostics.ProcessStartInfo();
  94. p.StartInfo.FileName="sqlplus";
  95. p.StartInfo.Arguments=string.Format("{0}@{1}",sqlplusString,strSqlPath);
  96. p.StartInfo.WindowStyle=System.Diagnostics.ProcessWindowStyle.Hidden;
  97. p.StartInfo.UseShellExecute=false;
  98. p.StartInfo.CreateNoWindow=true;
  99. p.Start();
  100. p.WaitForExit();
  101. //运行sqlldr,导入数据
  102. p=newSystem.Diagnostics.Process();
  103. p.StartInfo=newSystem.Diagnostics.ProcessStartInfo();
  104. p.StartInfo.FileName="sqlldr";
  105. p.StartInfo.Arguments=string.Format("{0}{1}",sqlplusString,strCtlPath);
  106. p.StartInfo.WindowStyle=System.Diagnostics.ProcessWindowStyle.Hidden;
  107. p.StartInfo.RedirectStandardOutput=true;
  108. p.StartInfo.UseShellExecute=false;
  109. p.StartInfo.CreateNoWindow=true;
  110. p.Start();
  111. System.IO.StreamReaderr=p.StandardOutput;//截取输出流
  112. stringline=r.ReadLine();//每次读取一行
  113. textBox3.Text+=line+"/r/n";
  114. while(!r.EndOfStream)
  115. {
  116. line=r.ReadLine();
  117. textBox3.Text+=line+"/r/n";
  118. textBox3.Update();
  119. }
  120. p.WaitForExit();
  121. //可以自行解决掉临时文件csv,ctl和sql,代码略去
  122. }
  123. privatevoidbutton1_Click(objectsender,EventArgse)
  124. {
  125. TransferData(@"D:/test.xls","Sheet1","username/password@servicename");
  126. }
  127. }
  128. }
分享到:
评论

相关推荐

    excel数据导入oracle完整代码(C#)

    本示例将详细介绍如何使用C#编程语言将Excel数据导入Oracle数据库。这里,我们假设你已经具备一定的C#编程基础,对Oracle数据库有基本了解,并且安装了Visual Studio 2008和Oracle 10g。 首先,我们需要在C#项目中...

    c#写的Excel导入Oracle源码

    在"Excel导入Oracle"的过程中,主要步骤如下: 1. **读取Excel数据**:使用C#中的EPPlus库打开Excel文件,遍历工作表,读取每一行的数据,将其存储在内存中的数据结构,如List&lt;List&lt;string&gt;&gt;中。 2. **建立Oracle...

    c#批量导入excel数据到oracle数据库.rar

    在IT行业中,数据库管理和数据处理是至关重要的环节。本资源包提供了一个实用的解决方案,即使用C#编程语言批量导入Excel数据到...对于需要处理大量Excel数据并导入Oracle数据库的项目,这是一个非常实用的技术方案。

    excel导入oracle工具

    excel导入oracle工具

    excel 导入oracle

    "Excel导入Oracle"是一种常见的需求,特别是在系统初始化、数据迁移或数据分析时。"Xls2Ora"是一个专门为此目的设计的小工具,它简化了从Excel表格向Oracle数据库导入数据的过程。 首先,让我们详细了解Excel。...

    excel导入oracle(c#)

    本文将详细介绍如何使用C#语言将Excel数据导入Oracle数据库。C#作为.NET框架的主要编程语言,提供了丰富的库来处理这类任务,例如Microsoft.Office.Interop.Excel库用于操作Excel,而Oracle.DataAccess.Client库则...

    C#winform实现Excel导入数据库

    在IT行业中,C# WinForm是一种常见的桌面应用程序开发框架,而Excel数据的处理与数据库的交互是企业级应用中常见的需求。本知识点将详细介绍如何利用C# WinForm来实现从Excel文件导入数据到数据库。 首先,我们需要...

    C#Excel大量数据快速导入数据库

    当需要处理Excel中的大量数据并将其快速导入到数据库时,C#提供了一些高效的方法来实现这一目标。本文将详细讲解如何利用C#实现Excel数据的高效导入。 首先,我们需要了解如何在C#中读取Excel文件。.NET Framework...

    C# excel导入出错解决办法

    本文以某高职院校人才招聘管理系统中考生数据导入为例,研究在ASP.NET项目中,使用C#实现Excel数据导入到Oracle数据库。Excel数据导入分为以下四个步骤:(1)在本机上按照数据导入模板的要求,将需要导入的数据整理...

    C#读取Excel并保存Oracle 11g

    本主题聚焦于如何使用C#来读取Excel数据,并将其存储到Oracle 11g数据库中。这涉及到两个主要的技术领域:处理Excel文件和与Oracle数据库的交互。 首先,让我们详细了解一下如何在C#中读取Excel数据。通常,我们...

    c#winform智能Excel导入数据库程序源码

    可以自动检测excel中的信息是否符合规定。不符合给出提示。 其他功能有单位管理,类型管理,批次管理,数据查询,导出Txt文件 注意: 开发环境为Visual Studio 2008,数据库为SQL Server 2008r2,数据库文件在 DB...

    C# 写的数据导入ORACLE数据库

    将C#与Oracle结合,可以实现高效的数据交互,包括数据的导入操作。下面将详细阐述如何使用C#进行数据导入到Oracle数据库。 首先,为了连接到Oracle数据库,我们需要安装Oracle的数据提供程序,如ODP.NET(Oracle ...

    EXCEL导入ORACLE工具(含.net源码)

    标题 "EXCEL导入ORACLE工具(含.net源码)" 提供了关于一个特定软件工具的信息,该工具设计用于将Excel电子表格中的数据导入到Oracle数据库。这个工具的关键知识点包括: 1. **Excel数据处理**:Excel是Microsoft ...

    excel与oracle之间的导入导出工具

    描述中提到"自己写的一个excel与oracle之间的数据导出导入的小工具,c#+oracel+excel",这表明该工具是由C#编程语言编写的,并且利用了Oracle数据库驱动和Excel相关的API来实现功能。C#是一种面向对象的、类型安全的...

    Excel to Oracle 程序实例

    在这个"Excel to Oracle 程序实例"中,我们将探讨如何使用C#编程语言在.NET平台上构建一个应用程序,该程序能够读取Excel文件中的数据并将其导入Oracle数据库。这个过程涉及到多个技术层面,包括文件I/O操作、数据...

    c# 实现excel数据导入到数据库

    在C#中实现Excel数据导入到数据库是一项常见的任务,尤其在数据分析、报表生成或系统集成等领域。这个过程通常包括读取Excel文件中的数据,处理这些数据,然后将它们存储到数据库中。以下是一些关键的知识点和步骤:...

    Excel to Oracle数据导入工具(含源码)

    标题中的“Excel to Oracle数据导入工具(含源码)”指的是一个软件工具,它的主要功能是帮助用户将Excel电子表格中的数据高效地导入到Oracle数据库中。这个工具的特别之处在于它提供了源代码,这意味着用户可以查看、...

    【ASP.NET编程知识】c#将Excel数据导入到数据库的实现代码.docx

    ASP.NET 编程知识 - C# 将 Excel 数据导入到数据库的实现代码 本文主要讲解了使用 C# 将 Excel 数据导入到数据库的实现代码,涵盖了 ASP.NET 编程知识、C# 语言、数据库和软件/插件等相关知识点。 一、ASP.NET ...

    C#的sql server+Oracle导出程序

    标题中的"C#的sql server+Oracle导出程序"是指一个使用C#编程语言开发的应用程序,该程序能够从SQL Server和Oracle数据库中导出数据到Excel格式。这通常是为了数据分析、备份、报告生成或者在不同系统间转移数据的...

Global site tag (gtag.js) - Google Analytics