楼主: samt007

Oracle PLSQL读取(解析)Excel文档

[复制链接]
论坛徽章:
6
ITPUB9周年纪念徽章
日期:2010-10-08 09:31:212010广州亚运会纪念徽章:龙舟
日期:2010-11-22 14:38:232010广州亚运会纪念徽章:现代五项
日期:2010-11-22 14:38:282011新春纪念徽章
日期:2011-02-18 11:42:47优秀写手
日期:2014-07-31 06:00:12马上加薪
日期:2014-08-06 15:11:58
31#
发表于 2015-5-14 19:40 | 只看该作者
楼主能够提供完整的代码呢!

使用道具 举报

回复
论坛徽章:
8
ITPUB9周年纪念徽章
日期:2010-10-08 09:28:522011新春纪念徽章
日期:2011-02-18 11:43:332013年新春福章
日期:2013-02-25 14:51:24优秀写手
日期:2013-12-18 09:29:092014年新春福章
日期:2014-02-18 16:42:02马上有房
日期:2014-02-18 16:42:02秀才
日期:2017-03-20 13:42:20秀才
日期:2017-07-11 13:54:02
32#
 楼主| 发表于 2015-5-14 20:54 | 只看该作者
llkyq 发表于 2015-5-14 19:40
楼主能够提供完整的代码呢!

核心代码全部提供了~下载过来稍微修改一下就可以使用了。
共享资源嘛~

使用道具 举报

回复
论坛徽章:
5
慢羊羊
日期:2015-03-04 14:55:272015年新春福章
日期:2015-03-06 11:59:47喜羊羊
日期:2015-04-02 19:59:02懒羊羊
日期:2015-05-17 21:03:29懒羊羊
日期:2015-05-20 20:04:36
33#
发表于 2015-5-14 22:05 | 只看该作者
samt007 发表于 2015-5-14 17:29
不瞒你,之前我这边开发导入的程序,就是在Excel文档加入一个宏(用VB代码),让用户点一个转换的按钮,先自 ...

我的意思是有办法做到不给用户增加任何额外操作,就选择上传的xls文档就可以,而且速度快,兼容性高,代码量少。
你这次的做法和上次相比,把跟业务无关的操作减到了最少,这个想法非常好。但具体实现上不止这一种方法,哪种更好是可以讨论一下的。我说的用js脚本的方法你也可以尝试一下,不要现在就下定论,下次再遇到类似问题时武器库也可以多一种技术选择。

使用道具 举报

回复
论坛徽章:
8
ITPUB9周年纪念徽章
日期:2010-10-08 09:28:522011新春纪念徽章
日期:2011-02-18 11:43:332013年新春福章
日期:2013-02-25 14:51:24优秀写手
日期:2013-12-18 09:29:092014年新春福章
日期:2014-02-18 16:42:02马上有房
日期:2014-02-18 16:42:02秀才
日期:2017-03-20 13:42:20秀才
日期:2017-07-11 13:54:02
34#
 楼主| 发表于 2015-5-15 07:39 | 只看该作者
komicakomica 发表于 2015-5-14 22:05
我的意思是有办法做到不给用户增加任何额外操作,就选择上传的xls文档就可以,而且速度快,兼容性高,代码 ...

嗯,js也许是个好办法,不过首先要解决的是如何让系统自动调用js解析为txt文本(而不是手工在Excel点按钮之类的动作)。
我之前试过在HTML增加一个按钮,调用js,自动将html的内容转换为excel输出。
---
或者你可以研究一下然后分享出来~

使用道具 举报

回复
论坛徽章:
6
ITPUB9周年纪念徽章
日期:2010-10-08 09:31:212010广州亚运会纪念徽章:龙舟
日期:2010-11-22 14:38:232010广州亚运会纪念徽章:现代五项
日期:2010-11-22 14:38:282011新春纪念徽章
日期:2011-02-18 11:42:47优秀写手
日期:2014-07-31 06:00:12马上加薪
日期:2014-08-06 15:11:58
35#
发表于 2015-5-15 08:20 | 只看该作者
samt007 发表于 2015-5-14 20:54
核心代码全部提供了~下载过来稍微修改一下就可以使用了。
共享资源嘛~

因为没有功力不够,不知如何修改,是否可以提供Package XYG_ALD_FILE_PKG 的代码!

使用道具 举报

回复
论坛徽章:
8
ITPUB9周年纪念徽章
日期:2010-10-08 09:28:522011新春纪念徽章
日期:2011-02-18 11:43:332013年新春福章
日期:2013-02-25 14:51:24优秀写手
日期:2013-12-18 09:29:092014年新春福章
日期:2014-02-18 16:42:02马上有房
日期:2014-02-18 16:42:02秀才
日期:2017-03-20 13:42:20秀才
日期:2017-07-11 13:54:02
36#
 楼主| 发表于 2015-5-15 09:46 | 只看该作者
llkyq 发表于 2015-5-15 08:20
因为没有功力不够,不知如何修改,是否可以提供Package XYG_ALD_FILE_PKG 的代码!

XYG_ALD_FILE_PKG.CONVERT_FILE_BLOB
所以主要是:CONVERT_FILE_BLOB的代码,其实在PDF有的。我贴一下给你,你再稍微改一下就可以了:
   FUNCTION CONVERT_FILE_BLOB(
      P_FILEDIR  IN VARCHAR2  ---文件路径 /usr/usr/glmr/customer
     ,P_FILENAME  IN VARCHAR2  ---文件名称 DHS.csv
     ,P_RAISE          IN NUMBER DEFAULT XYG_PUB_CONST_PKG.C_TRUE
   )
      RETURN BLOB
   IS
       L_RESULT              BLOB := empty_blob();
       L_FILEDIR             VARCHAR2(240);
       l_files               bfile;
       l_dest_offset        BINARY_INTEGER;
       l_src_offset        BINARY_INTEGER;
       L_PROCESS_PHASE       NUMBER;
   BEGIN
      L_PROCESS_PHASE := 0;
      
      SELECT DIRECTORY_NAME
        INTO L_FILEDIR
        FROM all_directories
       WHERE 1=1
         AND (UPPER(DIRECTORY_PATH) = CASE WHEN SUBSTR(P_FILEDIR,-1) = '/' THEN UPPER(SUBSTR(P_FILEDIR,1,LENGTH(P_FILEDIR)-1))
                                      ELSE UPPER(P_FILEDIR)
                                      END
          OR UPPER(DIRECTORY_PATH) = UPPER(P_FILEDIR)
          OR DIRECTORY_NAME = P_FILEDIR)
         AND ROWNUM <=1;
         
      --DBMS_OUTPUT.PUT_LINE('L_FILEDIR:'||L_FILEDIR);
      L_PROCESS_PHASE := 1;
      
      l_files := bfilename (L_FILEDIR,P_FILENAME);
      dbms_lob.createtemporary(lob_loc => L_RESULT,  
                           cache   => true,  
                           dur     => dbms_lob.call);
      l_dest_offset := 1;
      l_src_offset := 1;
      dbms_lob.open(l_files,dbms_lob.lob_readonly);
      dbms_lob.loadblobfromfile(L_RESULT--dest_lob    IN OUT NOCOPY  BLOB,
                              ,l_files--src_lob     IN            BFILE,
                              ,dbms_lob.lobmaxsize--amount      IN            INTEGER,
                              ,l_dest_offset--dest_offset IN            INTEGER := 1,
                              ,l_src_offset--src_offset  IN            INTEGER := 1
                               );
      L_PROCESS_PHASE := 2;
      dbms_lob.close(l_files);
      
      L_PROCESS_PHASE := 99;
      
      RETURN L_RESULT;
   EXCEPTION
      WHEN OTHERS
      THEN
         IF P_RAISE = XYG_PUB_CONST_PKG.C_TRUE
         THEN
            XYG_PUB_COMMON_PKG.RAISE_ERROR(
               '-20001'                                   --'ERR_DEFAULT_CODE'
              ,SQLERRM
              ,'转换文件有异常错误!进度:'||L_PROCESS_PHASE
            );
                  --DBMS_OUTPUT.PUT_LINE ('THERE ARE SOME ERROR, PLEASE CONTACT WITH MIS');
         ELSE
            --UTL_FILE.FCLOSE (L_FILEHANDLE);
            RETURN empty_blob();
         END IF;
   END;

使用道具 举报

回复
论坛徽章:
6
ITPUB9周年纪念徽章
日期:2010-10-08 09:31:212010广州亚运会纪念徽章:龙舟
日期:2010-11-22 14:38:232010广州亚运会纪念徽章:现代五项
日期:2010-11-22 14:38:282011新春纪念徽章
日期:2011-02-18 11:42:47优秀写手
日期:2014-07-31 06:00:12马上加薪
日期:2014-08-06 15:11:58
37#
发表于 2015-5-15 09:52 | 只看该作者
samt007 发表于 2015-5-15 09:46
XYG_ALD_FILE_PKG.CONVERT_FILE_BLOB
所以主要是:CONVERT_FILE_BLOB的代码,其实在PDF有的。我贴一下给 ...

非常感谢您的耐心,我昨晚有把这个从您的PDF档Copy下来,今天测试发现编译不过。缺少了 XYG_PUB_CONST_PKG.C_TRUE, 看您提供的文档,没有找到这个PKG。

使用道具 举报

回复
论坛徽章:
8
ITPUB9周年纪念徽章
日期:2010-10-08 09:28:522011新春纪念徽章
日期:2011-02-18 11:43:332013年新春福章
日期:2013-02-25 14:51:24优秀写手
日期:2013-12-18 09:29:092014年新春福章
日期:2014-02-18 16:42:02马上有房
日期:2014-02-18 16:42:02秀才
日期:2017-03-20 13:42:20秀才
日期:2017-07-11 13:54:02
38#
 楼主| 发表于 2015-5-15 10:53 | 只看该作者
llkyq 发表于 2015-5-15 09:52
非常感谢您的耐心,我昨晚有把这个从您的PDF档Copy下来,今天测试发现编译不过。缺少了 XYG_PUB_CONST_PK ...

所以我让你们可以先适当修改一下。
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;

使用道具 举报

回复
论坛徽章:
32
祖国60周年纪念徽章
日期:2009-10-09 08:28:002013年新春福章
日期:2013-02-25 14:51:24迷宫蛋
日期:2013-06-28 11:09:23ITPUB季度 技术新星
日期:2013-07-30 16:04:58优秀写手
日期:2013-12-18 09:29:132014年新春福章
日期:2014-02-18 16:43:09马上有钱
日期:2014-02-18 16:43:09红孩儿
日期:2014-03-04 16:40:38美羊羊
日期:2015-02-16 16:36:28懒羊羊
日期:2015-03-04 14:52:11
39#
发表于 2015-5-15 11:29 | 只看该作者
这个excel二进制格式已经开放了吗?对这个不大了解哈。

使用道具 举报

回复
论坛徽章:
8
ITPUB9周年纪念徽章
日期:2010-10-08 09:28:522011新春纪念徽章
日期:2011-02-18 11:43:332013年新春福章
日期:2013-02-25 14:51:24优秀写手
日期:2013-12-18 09:29:092014年新春福章
日期:2014-02-18 16:42:02马上有房
日期:2014-02-18 16:42:02秀才
日期:2017-03-20 13:42:20秀才
日期:2017-07-11 13:54:02
40#
 楼主| 发表于 2015-5-15 11:36 | 只看该作者
regonly1 发表于 2015-5-15 11:29
这个excel二进制格式已经开放了吗?对这个不大了解哈。

先将Excel转换为Blob字段,然后再解析blob字段,解析里面的二进制的内容。。。
你可以看看代码。

使用道具 举报

回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

TOP技术积分榜 社区积分榜 徽章 团队 统计 知识索引树 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 未成年人举报专区 
京ICP备16024965号-8  北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表