2008-11-18 51 views
11

Estoy escribiendo el procedimiento pl/sql que exporta datos de Oracle a Excel. Necesito formato de datos, así que no puedo usar CSV. Ya he intentado con XML, pero genera archivos demasiado grandes cuando quiero exportar, p. 70000 filas con 50 columnas (¡casi 300 MB!).Oracle to Excel - Procedimiento de exportación PL/SQL

Es por eso que decidí usar etiquetas HTML para generar archivos XLS, es más pequeño que XML y debo definir directamente el formato de solo algunas columnas especiales (las cadenas, los números y las fechas son formateados automáticamente por Excel). Es muy simple y conveniente, pero no puedo definir más de una hoja de trabajo.

¿Sabes cómo agregar/definir más de una hoja de trabajo en un archivo Excel escrito con HTML? Intenté utilizar la fórmula de VBScript como <% ActiveWorkbook.Worksheet.Add%>, pero no funciona.

Saludos,

Przemek

+0

Mayo parece obsoleto, antiguo y sí un poco geek, pero igual prefiero usar OracleReport para hacer eso. Si ya tiene la infraestructura Forms/Report IAS en funcionamiento por cierto. – BigMike

Respuesta

4

En lugar de crear Excel o archivos HTML en el servidor Oracle, se puede recuperar datos de Oracle al documento de Excel existente a través de ODBC u OLEDB. La falla es que debes tener cuidado con los permisos de usuario.

https://www.youtube.com/watch?v=Adz0zZFePf8

0

Se podría ahorrar una (pequeña) de hoja de Excel como HTML en Excel, y luego reproducir ese formato.

1

Puede obtener la utilidad OWA-SYLK de Tom Kyte, que admite un subconjunto de características de formato .xls.

+0

Lo he usado antes y no funciona con varias hojas de trabajo –

0

Hay un producto llamado SQL * XL que le permite ejecutar consultas SQL desde Excel, y los resultados aparecen en la hoja de trabajo (también se puede actualizar).

Es comercial, no es gratuito, pero cuesta solo 50 €, por lo que no es caro. Lo uso bastante

2

He tenido problemas similares y, finalmente, hice una hoja de cálculo con un código VBA que consultada y poblaron la hoja de cálculo para mí Mi tarea consistía en exportar una serie de tablas, cada una en una hoja diferente, pero cualquier bandera se podría usar para cambiar a una hoja nueva. De todos modos, avíseme si desea ver el código. Aquí hay un pedazo que podría ayudarte. Simplemente cambie la cadena TableSQL a lo que sea que seleccione. Cada registro devuelto se insertará como una fila en la hoja. Luego, dependiendo de la bandera que usted decida, puede crear y pasar a la siguiente hoja. Por favor, hágamelo saber si usted necesita más información (en este ejemplo en particular no es exactamente lo que está haciendo)

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 
0

Utilizamos métodos de OOXML. Primero escribimos nuestro propio método para hacerlo en PL/SQL pero un compañero de trabajo encontró este producto llamado Excellant. Se pasa en una especificación xml con mapeos de columna y estilos/fórmulas (casi cualquier fórmula de Excel funciona), la consulta y le da una vuelta atrás. Entonces puedes ejecutar gzip en el clob si quieres hacerlo más pequeño. El producto es muy bueno, mi gerente lo compró con una tarjeta.

El sitio web es www.peak42solutions.com. No pudimos usar ODBC porque la gente de la red no permite el acceso directamente a la base de datos. Y ahora estamos enviando por correo electrónico la facturación en Excel a los clientes.

Gracias,

Bill

1

he encontrado esta solución en la web (no inventada por mí), utilizando SQL y además:

set feed off markup html on spool on 
spool c:\table1.xls 
select * from table1; 
spool off 
set markup html off spool off 
1

Hay otro proyecto ORA_EXCEL (www.oraexcel.com) que puede producir documentos de Excel a partir de la base de datos Oracle utilizando solo PL/SQL.

1

De: MSDN. Si usted quiere que su hoja de trabajo para ser portátil y no depender de DSN del sistema puede conectarse a través de una cadena de conexión como:

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 

... a continuación, utilizar Moleboy's solution.

0

Su problema parece similar a un hilo aquí en SO (Writing in ExcelSheet using UTL_FILE package in Oracle.) Y pude encontrar una solución simple a este problema recientemente. utilicé un paquete llamado as_xlsx creado por Anton Scheffer, (Create an Excel-file with PL/SQL) e hice algunas modificaciones para que cree varias hojas dentro de un solo libro de trabajo de Excel al ponerlo en un bucle. También es compatible con algunos formatos básicos, como el color de la celda, el estilo de fuente, el tamaño de fuente, los bordes, etc. Es bastante ingenioso. (Create an Excel File (.xlsx) using PL/SQL).

Espero que esto ayude!

Cuestiones relacionadas