使用PL / SQL创建Excel文件(.xlsx)

时间:2016-12-23 09:51:01

标签: excel oracle plsql

关于我之前的问题Return the SQL Statement of an Explicit Cursor, 我能够使用(.xls)DBMS_SQL生成Excel UTL_FILE文件并传递SYS_REFCURSOR(代码在上一个问题中)。 但是,我遇到的一个挑战是生成的文件超过25 MB。 我将通过电子邮件将其传输给业务用户,它肯定会填满他们的邮箱大小。 当我使用xlsx手动提取到SQL Developer时,它只会生成大约4 MB的数据。

要解决此问题,是否可以通过PL/SQL执行以下操作?

  1. 使用更高版本的Excel(.xlsx)生成文件以压缩大小
  2. 在传输之前压缩.xls文件
  3. 我还审核了SO中的类似帖子,例如Writing in ExcelSheet using UTL_FILE package in Oracle, 但正如答案所述,它需要使用Java。所以它不适用于我。 另一篇帖子Create an Excel Spreadsheet from a Oracle Database也在使用xls。所以它也不适用。

    有什么想法吗?

    Oracle版本:

    Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production
    PL/SQL Release 11.2.0.4.0 - Production
    "CORE   11.2.0.4.0  Production"
    TNS for Solaris: Version 11.2.0.4.0 - Production
    NLSRTL Version 11.2.0.4.0 - Production
    

3 个答案:

答案 0 :(得分:5)

我看过Anton Scheffer Create an Excel-file with PL/SQL的一个名为Map的软件包,它解决了我的问题。 我还修改了一下以放入工作表名称,并允许Map作为参数而不是我之前的帖子(Return the SQL Statement of an Explicit Cursor)中所需的as_xlsx

我在程序重载的包规范中添加了这个:

SYS_REFCURSOR

我在程序包重载程序包中添加了这个(注意:行注释是我修改过的行):

VARCHAR2

这是我创建文件的并发请求中的示例块:

procedure query2sheet
( p_cur             IN OUT      SYS_REFCURSOR
, p_column_headers  boolean     := true
, p_directory       varchar2    := null
, p_filename        varchar2    := null
, p_sheet           pls_integer := null
, p_sheetname       varchar2    := null
);

希望这有助于某人! :)

答案 1 :(得分:0)

对Oracle数据库中的xlsxlsx文件有没有支持。

您可以做的是创建CSV(逗号分隔)文件,然后使用使用java stored procedure的自定义java.util.zip或使用{{{1}}的PL / SQL过程将其压缩为zip文件3}}

答案 2 :(得分:0)

如果您需要生成XLSX文件并将其发送给业务用户,这听起来就像是DB之外的某些服务的工作。您应该准备一个返回带有报告内容的ref cursor的过程,然后设置一些使用数据生成PDF或XLSX并发送它的服务。

如果您无法在数据库外部执行此操作,则仍可以在Oracle中使用Java。您可以创建将创建XLSX的Java过程。 Here是Java创建Excel文件的示例。但是创建复杂的Java过程并不是最好的解决方案,可能需要你在DB服务器上安装一些jar,所以我会创建一个返回ref cursor的过程,其中包含数据和创建文件的小程序,并将其发送到DB之外。