本帖最后由 samt007 于 2018-2-17 08:23 编辑

Introduction介绍

Excel文档的数据如何读取到Oracle数据库一直是值得深究的问题。

目前相信大部分程序员都是直接用工具将Excel的数据读取到Oracle数据库的。例如Toad,PL/SQL Developer的Excel数据导入功能。

也有一部分程序开发的是:先将Excel转换为一个逗号分隔符等的文本文件(CSV等),然后写代码通过特定的符号(TAB符号或者逗号等)将数据拆分并且识别。

其实上面的读取Excel的办法都不是最好用的办法。举个例子,用Toad等工具来做,程序开发工程师来做是可以的,但是不可以将这个工作交给普通用户做(当用户想导入数据的时候)。如果用文本来做,先要做一个转换,对于用户来说无疑是多做了一个动作,操作不方便。

综上所述,其实最方便的还是:如何在Oracle数据库用PL/SQL直接读取Excel的内容,这才是最好的做法。

在PL/SQL直接解析并读取Excel,有一个蛮不错的办法,就是用Java的POI组件。确实是不错,但是要先导入POI的Java类,然后再在Oracle里面写一段Pkg的class类解析Excel。是可行的。我也研究过,发现有一些限制(可能是和POI的版本太低有关系)。

这里提出一个更加好的办法,就是用Oracle自带的utl_raw 包(二进制处理包)和dbms_xmldom包,将Excel文件对应的Blob大文本字段进行解析,最后再将解析出来的内容用管道表函数输出一个虚拟的表格。这样子就是很直观了,直接将一个Excel文档解析为一个表格!

可能大家比较关心解析的效率。所以针对效率方面,经过测试,还是非常不错的。下面有专门测试解析效率的主题。

另外一个比较关心的问题:Excel里面可以有很多公式列,那对于公式列读取出来的结果是什么?另外,一些特殊的格式栏位是否可以正确识别?经过测试,这些都可以得到正确的解析。例如公式列,解析的是公式计算的结果。

先简单测试一下实现的效果。

现在有这么一个Excel文档:XLS文件导入样本.xls,想将它导入到Oracle数据库中。

T1.jpg (89.11 KB, 下载次数: 562)

2015-5-13 16:46 上传

然后将它上传到服务器的某个文件夹。注意,这个文件路径(/data/uat/apps/apps_st/appl/attchment/12.0.0/BATCH_UPLOAD_TEMP/)必须是在all_directories有定义的。否则用PLSQL无法直接读取文件。值得一提的是,这个步骤并不是必须的,你也可以将Excel文件上传到Blob大字段中,然后再直接读取。常见的是FND_LOBS表的FILE_DATA字段。

T3.jpg (45.94 KB, 下载次数: 524)

2015-5-13 16:51 上传

最后一步,用下面的函数就可以直接读取出Excel文本的内容了(注意输入的参数):

SELECT* FROM TABLE(XYG_PUB_DATA_UPLOAD_PKG.CONVER_EXCEL_TO_TAB(XYG_ALD_FILE_PKG.CONVERT_FILE_BLOB('XYG_BATFILE','XLS文件导入样本.xls'),'',1))

T2.jpg (125.97 KB, 下载次数: 507)

2015-5-13 16:46 上传

必须要说明的是,栏位BATCH_CODE=工作表的名称。

如果有多个工作表,那BATCH_CODE是不同的。

附上Blob字段的Excel的读取方法:

SELECT*FROMTABLE(XYG_PUB_DATA_UPLOAD_PKG.CONVER_EXCEL_TO_TAB((SELECTFILE_DATAFROMFND_LOBSWHEREFILE_ID=81171130),NULL,1));

注意和说明

如果是用Excel直接导入,需要注意的地方:

1 目前只支持30个栏位导入!应该是足够了!另外,管道表函数的对象的每个栏位都是Varchar2类型,内容最长4000字节。

2 由于一个Excel可能会有多个工作表,所以,在导入的时候,必须要指定导入的Excel的工作表页签的名称。

3 完全支持直接日期栏位的导入!日期栏位的格式也没限制。非常好!

4 对于数字的类型,由于系统自动转换为浮点型,为了转换的时候不出异常,所以精度不可以超过15位。

5 对于公式列,它也完美支持!导入的结果就是公式的计算结果。举个例子,一个栏位引用另外一个日期的栏位的,那导入的就是日期!

6 如果用户在打开Excel(未关闭文档的情况下),也可以用FND的标准加载功能直接加载。不过必须要注意导入之前先保存。

7 目前已经完美支持xls和xlsx文档的导入,系统会自动对导入的文档进行识别,然后分别调用不同的代码,将文档的内容解析出来。

但是,我觉得用xls是最好的,因为并不是所有的电脑都安装了2003以上的版本,用xls是最大兼容性的。

导入效率的测试

效率测试:

1 解析文档:DG订单排产顺序20150423.xls

文档大小:1.5mb,数据量:4600行。栏位数:27,其中有某些字段的内容比较多,例如物料编码描述等

解析时间:36秒。

2 解析文档:科目为差旅费.xls

文档大小:3mb,数据量:9000行。栏位数:20,其中有某些字段的内容比较多,例如2个科目的描述字段等

解析时间:65秒

3 解析文档:20150212用户职责明细导出.xls

文档大小:577kb,数据量:3000行,栏位数:11。字段内容比较少。

解析时间:14秒

4 解析文档:数据收集模板(深圳汽玻夹层第二批)2011-11-08.xls

文档大小:347kb,数据量:1572行,栏位数:17。字段的内容都不多。以数字为主。

解析时间:7秒

从上面发现一个规律,基本上解析时间和文档的大小成正比。

平均1mb的文件的解析时间要30秒左右。

应该还是可以接受的,因为导入的数据量一般不会很多!

需要注意的是,这个数据量不单纯是指记录行数,也包括记录的内容的多少。例如有某些字段的内容如果很多的话,就算行数少,数据量也很大!

---------------------------

---版主提醒了一下,让测试数据行比较多的,所以我干脆测试了11万行的记录(Excel行数),xlsx还是可以正常读取的。解析耗时4分钟左右:

T5.jpg (65.37 KB, 下载次数: 490)

2015-5-14 09:44 上传

T4.jpg (186.54 KB, 下载次数: 494)

2015-5-14 09:44 上传

附上开发的时候参考的源代码如下:

parse_excel.txt

(15.1 KB, 下载次数: 844)

2015-5-13 16:50 上传

点击文件名下载附件

文档:

2015-5-14 09:30 上传

点击文件名下载附件

核心代码:

2015-5-14 09:31 上传

点击文件名下载附件

http://wenku.baidu.com/view/4866e3171711cc7931b716da

贴上一个代码:XYG_PUB_CONST_PKG是一些固定值来的,你可以先干掉这个参数也可以的。

我也贴一下给你吧:

CREATE OR REPLACE PACKAGE APPS.XYG_PUB_CONST_PKG

AS

/******************************************************************************

NAME:       XYG_PUB_CONST_PKG

PURPOSE:    固定值的PKG

REVISIONS:

Ver        Date        Author           Description

---------  ----------  ---------------  ------------------------------------

1.0        2010/10/13   Sam.T          1,New Create the pkg

1.1        2010/10/15   Sam.T          1,Add Function Err_XXXX

1.2        2011/01/18   Sam.T          1,Add AUTO MAIL DEFAULT SENDER

1.3        2014/12/26   Sam.T          1,修正自动邮件的收件人等信息的获取。

******************************************************************************/

C_ITEM_RETURN_NUM CONSTANT NUMBER:=0;

C_ITEM_RETURN_CHAR CONSTANT VARCHAR2(1):=NULL;

C_ITEM_ERR_CODE CONSTANT NUMBER:= -20120;

C_RETURN_NUM CONSTANT NUMBER:=-1;

C_RETURN_CHAR CONSTANT VARCHAR2(1):=NULL;

C_TRUE CONSTANT NUMBER:=1;

C_FALSE CONSTANT NUMBER:=0;

END;

-----------------------bug修复日志:

2015.5.27:

感谢网上的兄台的的测试和反馈,我开始确实没太注意这个问题。

经过确认,这确实是这个程序的一个bug,我已经修正过来了。

修正过程:

1 查找代码:

t_sheets(i-1).name--P_BATCH_CODE

替换为:

t_data(i).name--t_sheets(i-1).name--P_BATCH_CODE fix sheets name bug by sam.t2015.5.27

2 查找代码:

t_sheet_names(i)--P_BATCH_CODE

替换为:

t_data(i).name--t_sheet_names(i)--P_BATCH_CODE  fix sheets name bug by sam.t2015.5.27

-------END 2015.5.27

-----2018.2.17更新:更新文件处理的PKG代码:XYG_ALD_FILE_PKG2

使用样例:SELECT XYG_ALD_FILE_PKG2.FILE2BLOB('XYG_EXPORT_DATA','em75109732o1.xlsx') FROM DUAL

备注:可以代替这个XYG_ALD_FILE_PKG.CONVERT_FILE_BLOB

2018-2-17 08:22 上传

点击文件名下载附件

excel打开oracle,Oracle PLSQL读取(解析)Excel文档相关推荐

  1. Java面试poi中excel版本大小_java 中 poi解析Excel文件版本问题解决办法

    java 中 poi解析Excel文件版本问题解决办法 发布时间:2020-10-02 03:46:15 来源:脚本之家 阅读:91 作者:程诺 poi解析Excel文件版本问题解决办法 poi解析E ...

  2. Oracle EBS R12.2 新特性文档

    附件描述: 附件包含EBS从R12版本到R12.2版本的一些改进特征 Attached is document describing important enhancements to EBS sin ...

  3. python读取docx中表格 图片_python 解析docx文档的方法,以及提取插入的文本对象和图片...

    首先安装docx模块,通过pip install docx或者在docx官方链接上下载安装都可以 下面来看下如何解析docx文档:文档格式如下 有3个部分组成 1 正文:text文档 2 一个表格. ...

  4. Oracle Enterprise Manager Cloud Control最新文档合集

    2019独角兽企业重金招聘Python工程师标准>>> Oracle Enterprise Manager Cloud Control最新文档合集 Oracle企业管理器系列产品为当 ...

  5. java使用org.w3c.dom解析XML文档,创建、增删查改,保存,读取,遍历元素等操作

    全栈工程师开发手册 (作者:栾鹏) java教程全解 java使用org.w3c.dom(java dom)解析XML文档,创建.增删查改,保存,读取,遍历元素等操作 在保存文件时需要载入crimso ...

  6. JAVA解析html文档,替换img图片路径成base64编码,并将文章存入数据库

    转载自  JAVA解析html文档,替换img图片路径成base64编码,并将文章存入数据库 开发环境:struts2+ spring + hibernate 数据库:oracle 需求:在HTML编 ...

  7. 如何在谷歌chrome中打开、编辑、保存微软Office文档?

    历史背景 在2015年的主流浏览器版本中,因为可以直接调用微软开源的 ActiveX控件,可以实现微软Office软件的在线编辑及审阅功能,但是从2015年开始,各大主流浏览器先后取消了对 NPAPI ...

  8. libxml -- 解析 XML 文档

    参考 http://xmlsoft.org/ http://www.miidoo.cn/info_detail-204.html http://www.blogjava.net/wxb_nudt/ar ...

  9. [Xcode 实际操作]七、文件与数据-(17)解析JSON文档

    目录:[Swift]Xcode实际操作 本文将演示如何解析JSON文档. 项目中已添加一份JSON文档:menu.json 1 { 2 "menu": 3 { 4 "id ...

  10. java 检索编号输出信息_java,_java 如何解析txt文档,输入检索信息,然后输出,java - phpStudy...

    java 如何解析txt文档,输入检索信息,然后输出 请输入代码需求: 请解析config.txt,文件格式包括段落名称.字段名称和字段值.段落名称的值为:"segment:"右边 ...

最新文章

  1. oracle10g 学习 方向DBA三
  2. 机器学习算法之线性回归
  3. c++ 将文件内容输出到word上_原来PDF转Word可以这么简单,只需要一个键!办公起来真方便...
  4. private-bower
  5. 发布过程5分钟内load飙升问题排查
  6. 如何MATLAB中将一个向量或者矩阵强行转换为列向量
  7. Linux下Select多路复用实现简易聊天室
  8. 用cmd 查看本机的IP地址
  9. 文本比较/文本对比在线工具
  10. SQL DELETE FROM的用法
  11. 【容器化部署简介】 基于腾讯云TKE: kubernetes(k8s), github actions, devops
  12. 什么是java full gc_关于Java垃圾回收,你必须要知道FullGC是什么
  13. 线上服务应急攻关方法论
  14. 基于JARM指纹的C2识别
  15. 火焰图:全局视野的Linux性能剖析
  16. 译文: C28x Compiler Error and Warning Messages
  17. [渝粤教育] 西南科技大学 建筑CAD 在线考试复习资料(1)
  18. 杭电2015‘11校赛 1007油菜花王国
  19. Corsiniの时光漏
  20. 如何使用CorelDRAW 2019绘制谷歌浏览器Logo

热门文章

  1. plist 与 JOSN的解析
  2. 银行网站 ca服务器的安装,建行网银CA认证系统建设案例介绍
  3. 时间与时间戳之间的转换
  4. 为了让智能手机厂商早日推出 5G 手机,高通真是操碎了心
  5. wps垂直居中快捷键_word如何设置垂直居中 wpsword设置垂直居中
  6. 关于magic-api的使用入门
  7. 17个改变世界的数学公式!
  8. java版本PID放大/eTerm放大软件介绍
  9. 如何搭建个人服务器(网站/游戏)?
  10. 如何看懂公司的财务报表(2)