将 Excel 文件传输到 APEX 中的数据库服务器目录路径

Posted

技术标签:

【中文标题】将 Excel 文件传输到 APEX 中的数据库服务器目录路径【英文标题】:Transfer Excel files to a database server directory path in APEX 【发布时间】:2018-01-10 14:03:15 【问题描述】:

我目前使用的是 APEX 5.1。我的页面中有一个文件浏览项。和一个上传按钮。

当用户选择一个文件并点击上传按钮时,该文件必须被传输到一个目录路径(创建的目录路径)。

我能够使用 blob 到 clob 转换和 UTL_FILE 包传输 .txt 文件。但是当我对.xls.xlsx 文件执行相同操作时,数据会以不可读的模式传输。

如何在 APEX 中使用 PL/SQL 或 javascript 将 excel 文件传输到数据库服务器目录路径?提前致谢!!

【问题讨论】:

【参考方案1】:

我不是在复制 Excel 文件,而是图像;一切顺利。我正在使用 WWV_FLOW_FILES 表;您可能会使用自己的表,将 XLS 存储到其 BLOB 列中,然后使用此过程(代码如下),将 BLOB 和 UTL_FILE 读取到 P_DIR 参数指定的目录中。

   PROCEDURE p_write_blob_to_file (p_file_id IN NUMBER, p_dir IN VARCHAR2)
   IS
      /* 19.04.2012. Procedure copies image from WWV_FLOW_FILES into a
                     directory P_DIR. Taken from Eddie Awad's Blog
                     http://awads.net/wp/2011/09/20/create-an-application-to-upload-files-using-oracle-apex-in-less-than-10-minutes-video/
      */
      l_blob            BLOB;
      l_blob_length     INTEGER;
      l_out_file        UTL_FILE.file_type;
      l_buffer          RAW (32767);
      l_chunk_size      BINARY_INTEGER := 32767;
      l_blob_position   INTEGER := 1;
      l_file_name       pkg_general.subt_ime_slike;
   BEGIN
      -- Retrieve the BLOB for reading
      SELECT blob_content, filename
        INTO l_blob, l_file_name
        FROM wwv_flow_files
       WHERE id = p_file_id;

      -- Retrieve the SIZE of the BLOB
      l_blob_length := DBMS_LOB.getlength (l_blob);

      -- Open a handle to the location where you are going to write the BLOB
      -- to file.
      -- NOTE: The 'wb' parameter means "write in byte mode" and is only
      --       available in the UTL_FILE package with Oracle 10g or later
      l_out_file :=
         UTL_FILE.fopen (p_dir,
                         l_file_name,
                         'wb' -- important. If ony w then extra carriage return/line brake
                             ,
                         l_chunk_size);

      -- Write the BLOB to file in chunks
      WHILE l_blob_position <= l_blob_length
      LOOP
         IF l_blob_position + l_chunk_size - 1 > l_blob_length
         THEN
            l_chunk_size := l_blob_length - l_blob_position + 1;
         END IF;

         DBMS_LOB.read (l_blob,
                        l_chunk_size,
                        l_blob_position,
                        l_buffer);
         UTL_FILE.put_raw (l_out_file, l_buffer, TRUE);
         l_blob_position := l_blob_position + l_chunk_size;
      END LOOP;

      -- Close the file handle
      UTL_FILE.fclose (l_out_file);
   END p_write_blob_to_file;

【讨论】:

以上是关于将 Excel 文件传输到 APEX 中的数据库服务器目录路径的主要内容,如果未能解决你的问题,请参考以下文章

从 excel 自动加载 Oracle Apex 数据

错误:尝试在空表中首次加载表中的 Excel 数据时,Oracle Apex 中的“表名已存在”

将excel数据导出到sqlserver

如何以编程方式将用户添加到 Oracle APEX 4.x 中的访问控制列表?

如何将数据从单个 csv/excel 文件传输到多个 oracle 表

通过在 Oracle Apex 中创建视图将 cols 转换为 oracle 中的行