Oracle 到 Excel - PL/SQL 导出过程
Posted
技术标签:
【中文标题】Oracle 到 Excel - PL/SQL 导出过程【英文标题】:Oracle to Excel - PL/SQL export procedure 【发布时间】:2008-11-18 12:52:35 【问题描述】:我正在编写将数据从 Oracle 导出到 Excel 的 pl/sql 过程。我需要数据格式,所以我不能使用 CSV。我已经尝试过使用 XML,但是当我想导出时它会生成太大的文件,例如70000 行,50 列(几乎 300 MB !!!)。
这就是为什么我决定使用 html 标签来生成 XLS 文件的原因——它比 XML 小,我必须直接定义一些特殊列的格式(字符串、数字和日期由 Excel 自动格式化)。 它非常简单方便,但我不能定义多个工作表。
您知道如何在使用 HTML 编写的 excel 文件中添加/定义多个工作表吗?我尝试使用 VBScript 公式,例如 ,但它不起作用。
【问题讨论】:
May 似乎过时了,过时了,而且有点古怪,但我仍然更喜欢使用 OracleReport 来做到这一点。如果您已经启动并运行了 Forms/Report IAS 基础架构。 【参考方案1】:您可以通过 ODBC 或 OLEDB 将 Oracle 数据提取到现有的 Excel 文档,而不是在 Oracle 服务器上创建 Excel 或 HTML 文件。缺点是,你应该小心用户权限。
https://www.youtube.com/watch?v=Adz0zZFePf8
【讨论】:
【参考方案2】:我也遇到过类似的问题,最终用一些 VBA 代码制作了一个电子表格,为我查询并填充了电子表格。 我的任务是导出一系列表格,每个表格都在不同的工作表上,但任何标志都可以用来切换到新工作表。 无论如何,如果您想查看代码,请告诉我。这是一个可以帮助你的块。 只需将 TableSQL 字符串更改为您选择的任何内容。 返回的每条记录将作为一行插入工作表中。 然后,根据您决定的任何标志,您可以创建并移动到下一张表。 如果您需要更多信息,请告诉我(因为这个特定示例并非您在做什么)
Private Sub getMyRows(inSchema As String, InTable As String)
Dim RS As Object
Dim TableSQL As String
Dim DataType As String
Dim DataLength As String
Dim DataPrecision As String
Dim DataScale As String
Dim ColCount As Integer
Dim WS As Worksheet
' create a sheet with the current table as name
Worksheets.Add().Name = InTable
Set RS = CreateObject("ADODB.recordset")
TableSQL = "Select * from " & inSchema & "." & InTable
' grab the data
RS.Open TableSQL, conn, adOpenStatic
For ColCount = 0 To RS.Fields.Count - 1
' set column headings to match table
ActiveSheet.Cells(1, ColCount + 1).Value = RS.Fields(ColCount).Name
Next
' copy table data to sheet
With Worksheets(InTable).Range("A2")
.CopyFromRecordset RS
End With
RS.Close
End Sub
【讨论】:
【参考方案3】:您可以获得 Tom Kyte 的 OWA-SYLK 实用程序,它支持 .xls 格式功能的子集。
【讨论】:
我以前用过,它不能处理多个工作表【参考方案4】:ExcelDocumentType 是一个很好的解决方案。它允许您使用 PL/SQL 生成功能齐全的多页 Excel 文档。你可以在这里找到它:
http://radio.weblogs.com/0137094/2006/10/26.html
http://radio.weblogs.com/0137094/2009/01/02.html
(Jason Bennett 的开发者专区)
【讨论】:
【参考方案5】:还有另一个项目 ORA_EXCEL (www.oraexcel.com) 可以仅使用 PL/SQL 从 Oracle 数据库生成 Excel 文档。
【讨论】:
【参考方案6】:我在网上找到了这个解决方案(不是我发明的),使用 SQL plus:
set feed off markup html on spool on
spool c:\table1.xls
select * from table1;
spool off
set markup html off spool off
【讨论】:
【参考方案7】:发件人:MSDN。如果您希望您的工作表是可移植的并且不依赖于系统 DSN,您可以使用如下连接字符串进行连接:
Dim cnn As ADODB.Connection
Set cnn = New ADODB.Connection
cnn.ConnectionString = "Provider=OraOLEDB.Oracle.1;Password=<PASSWORD>;Persist Security Info=True;User ID=<USER ID>;Data Source=<DATABASE NAME>"
cnn.Open
...然后使用Moleboy's solution。
【讨论】:
【参考方案8】:您可以在 Excel 中将(小)Excel 工作表另存为 html,然后重现该格式。
【讨论】:
【参考方案9】:有一个名为 SQL*XL 的产品,它允许您在 Excel 中运行 sql 查询,结果显示在工作表中(它也可以更新)。
它是商业的,不是免费的,但只要 50 欧元左右,所以不贵。我经常用它
【讨论】:
【参考方案10】:我们使用 OOXML 方法。我们最初是在 PL/SQL 中编写自己的方法,但一位同事发现了这个名为 Excellant 的产品。它是你传入一个带有列映射和样式/公式的 xml 规范(几乎任何 excel 公式都有效),查询它会给你一个回滚。因此,如果你想让它更小,你可以在 clob 上运行 gzip。这个产品很便宜,我的经理用 pcard 买的。
网站是 www.peak42solutions.com。我们不能使用 ODBC,因为网络人员不允许直接访问数据库。我们现在正在通过电子邮件将 Excel 发票发送给客户。
谢谢,
比尔
【讨论】:
【参考方案11】:您的问题似乎类似于 SO (Writing in ExcelSheet using UTL_FILE package in Oracle.) 中的一个线程,我最近能够找到解决此问题的简单方法。
我使用了由 Anton Scheffer (Create an Excel-file with PL/SQL) 创建的名为 as_xlsx
的包,并进行了一些修改,因此它通过循环在单个 Excel 工作簿中创建了多个工作表。
它还支持一些基本格式,如单元格颜色、字体样式、字体大小、边框等。它非常漂亮。
(Create an Excel File (.xlsx) using PL/SQL)。
希望这会有所帮助!
【讨论】:
以上是关于Oracle 到 Excel - PL/SQL 导出过程的主要内容,如果未能解决你的问题,请参考以下文章