【问题标题】:Create xls file using PL/SQL without going through xml使用 PL/SQL 创建 xls 文件而不通过 xml
【发布时间】:2012-09-25 20:20:21
【问题描述】:

我的系统是用APEX/Oracle 11g开发的,想直接创建xls文件,不用创建xml文件。系统当前创建了一个xml文件,然后可以保存为xls格式,但是非常挑剔的用户不喜欢尝试打开xml文件时的Windows 7警告(Excel警告文件格式不与其扩展名不匹配)。有什么方法可以在 APEX 中使用 Oracle PL/SQL 来完成这项工作?

【问题讨论】:

  • 我不知道来自 within Apex,所以我不打算发布答案,但您只能在 Oracle 中执行此操作。您可以将 XML 放在一个 clob 中,然后使用 UTL_FILE 将文件从数据库中写入您想要的任何扩展名。
  • 本,感谢您的回复。目前我在数据库中有 XML 作为 BLOB,我下载它并使用 Excel 打开它。这是我收到我试图避免的警告的时候。如何使用 UTL_FILE 帮助将其写入数据库?
  • 您现在如何提供文件?通过提交后的流程?您是否先将文件选择到 blob 中?

标签: xml excel plsql oracle-apex xls


【解决方案1】:

您可以使用 Java 存储过程

http://docs.oracle.com/cd/B28359_01/java.111/b31225/chfive.htm

和 Apache Poi

http://poi.apache.org/spreadsheet/index.html

创建实际的电子表格并将其存储在 lob 字段中,然后返回给用户

【讨论】:

  • 好东西,但请注意:这不适用于 Oracle XE,因为它不支持 Java 存储过程。
  • 我以为 OP 使用的是 11g 并通过 APEX 表单访问它,也许我看错了。尽管如此,如果要求是 11g DB 并且只有 APEX 用于 UI,我会这样做。 java 部分也可以在 web 服务中完成并从存储过程中调用,但是 SQLJ 和 JPUB 的东西,更不用说数据库中的 java 安全性,给部署和维护增加了很多复杂性。
  • 是的,你是 100% 正确的。我只是想指出这一点,以防使用 11g xe 的人看到这一点。我以前看过这些东西,但还是有点过头了。不过,有一天我很想玩这个。有一些 plsql 解决方案,但它们受到某种方式的限制。
  • 我明白了,好点子。最近我实际上并不鼓励办公室里的人使用 Java Storedprocedures,但有时它们是不可避免的,比如前端是旧的 Oracle Forms 之类的东西。顺便说一句,在我的这个答案中,用于在 Java 中处理电子表格的 Poi 也是一个非常好的部分。我已经使用它完成了一些项目,并且在所有情况下它对我来说都像冠军一样工作。
【解决方案2】:

Morten Braten 整理了一个很棒的 PLSQL 资源页面:http://code.google.com/p/plsql-utils/

特别是 Anton Scheffer 分享了他的包 AS_XLSX,它可以满足您的 APEX 需求: http://technology.amis.nl/2011/02/19/create-an-excel-file-with-plsql/

使用非常简单,包头中有很好的示例。

【讨论】:

    【解决方案3】:

    您可以使用 OraExcel 包生成真正的 xlsx 文件(二进制形式)。使用该软件包,您可以像在 Excel 中一样格式化单元格并应用样式。

    它有一个简单的 API,您可以在其中逐步创建 Excel 文件并描述每个单元格的外观。

    当您完成 Excel 文件时,可以选择将 xlsx 文件生成为 PL/SQL BLOB 变量,该变量可以返回到 APEX 并下载。

    没有让您的客户感到烦恼的警告。

    您可以编写一个简单的函数,如下所示,创建一个 Excel 电子表格并将其返回给 APEX:

    CREATE OR REPLACE FUNCTION get_excel RETURN BLOB IS
       my_blob BLOB;
    BEGIN
    
      ora_excel.new_document;
      ora_excel.add_sheet('My sheet');
    
      ora_excel.query_to_sheet('SELECT field1, field2, field2 FROM my_table');
    
      ora_excel.save_to_blob(my_blob);
    
      RETURN my_blob;
    
    END;
    

    还有更多示例:http://www.oraexcel.com/examples

    干杯

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-05-09
      • 1970-01-01
      • 2010-09-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-04
      相关资源
      最近更新 更多