viernes, 5 de octubre de 2007

Forms 6 y Forms 10g: Generar archivo excel (XLS)

En Jakarta hay un proyecto que consiste en un API para manipular y generar documentos de Office sin necesidad de tener Office instalado, luego los documentos resultantes se pueden abrir con cualquier suite ofimática, como por ejemplo OpenOffice.

http://poi.apache.org/trans/es/index.html

En el momento de escribir esto la última versión era la 3.0.1 y las clases necesarias se encuentran en el archivo poi-3.0.1-FINAL-20070705.jar

Para poder usar estas clases en un programa de forms tenemos que hacer los siguientes pasos:

Forms 10g:

  • En esta ventana seleccionamos las clases:
    • org.apache.poi.hssf.usermodel.HSSFWorkbook
    • org.apache.poi.hssf.usermodel.HSSFRow
    • org.apache.poi.hssf.usermodel.HSSFSheet
    • org.apache.poi.hssf.usermodel.HSSFCell
    • java.io.FileOutputStream (posiblemente tengamos que añadir al CLASSPATH el archivo rt.jar
  • Una vez importadas las clases nos crea paquetes PL/SQL para poder interactuar con ellas, por lo que ahora simplemente hay que escribir el código PL/SQL normal.
  • Para poder ejecutar el programa hay que añadir el archivo poi-3.0.1-FINAL-20070705.jar al CLASSPATH en el servidor. Para ello miramos en el archivo formsweb.cfg que se encuentra en $ORACLE_HOME/forms/server la variable envFile, y al archivo que apunta es donde tenemos que modificar la variable CLASSPATH.
Forms 6i:

  • Hay que usar una máquina virtual de Java versión 1.4.2 o superior, lo he probado con la 1.4.2_06 y con 1.6.0_02.
  • Añadir a la variable de entorno PATH las carpetas: (Sustituir c:\program files\java\jdk1.6.0_02 por la carpeta en que tengamos instalado el jdk, si no lo configuramos correctamente nos dará el error: "PDE-UJI001 Fallo al crear JVM." al intentar importar las clases)
    • C:\Program Files\Java\jdk1.6.0_02\bin
    • C:\Program Files\Java\jdk1.6.0_02\jre\bin
    • C:\Program Files\Java\jdk1.6.0_02\jre\bin\client
  • Al igual que en Forms 10g hay que añadir a la variable CLASSPATH el archivo poi-3.0.1-FINAL-20070705.jar
  • Añadir también al CLASSPATH el archivo importer.jar que se encuentra en $ORACLE_HOME\tools\common60\java
  • Al igual que en Forms 10g, en el programa que se quiera usar hay que importar las mismas clases Java que se indican en el apartado para Forms 10g (esas son necesarias para los ejemplos, pero seguramente que en un caso real tengamos que importar más), para ello vamos al menú "Programa" y luego a "Importar Clases Java...".


Ejemplos:

Ejemplo New Workbook de Jakarta POI

HSSFWorkbook wb = new HSSFWorkbook();
FileOutputStream fileOut = new FileOutputStream("workbook.xls");
wb.write(fileOut);
fileOut.close();

Equivalente en Forms

DECLARE
v_wb      ORA_JAVA.JOBJECT;
v_fileout ORA_JAVA.JOBJECT;
BEGIN
v_wb := hssfworkbook.new();
v_fileout := fileoutputstream.new('workbook.xls');
hssfworkbook.write(v_wb, v_fileout);
fileoutputstream.close(v_fileout);
END;

Ejemplo New Shet de Jakarta POI


HSSFWorkbook wb = new HSSFWorkbook();
HSSFSheet sheet1 = wb.createSheet("new sheet");
HSSFSheet sheet2 = wb.createSheet("second sheet");
FileOutputStream fileOut = new FileOutputStream("workbook.xls");
wb.write(fileOut);
fileOut.close();

Equivalente en Forms:

DECLARE
v_wb       ORA_JAVA.JOBJECT;
v_fileout  ORA_JAVA.JOBJECT;
v_sheet1   ORA_JAVA.JOBJECT;
v_sheet2   ORA_JAVA.JOBJECT;
BEGIN
v_wb := hssfworkbook.new();
v_sheet1 := hssfworkbook.createsheet(v_wb, 'new sheet');
v_sheet2 := hssfworkbook.createsheet(v_wb, 'second sheet');
v_fileout := fileoutputstream.new('workbook.xls');
hssfworkbook.write(v_wb, v_fileout);
fileoutputstream.close(v_fileout);
END;

Ejemplo Creating Cells de Jakarta POI


HSSFWorkbook wb = new HSSFWorkbook();
HSSFSheet sheet = wb.createSheet("new sheet");

// Create a row and put some cells in it. Rows are 0 based.
HSSFRow row = sheet.createRow((short)0);
// Create a cell and put a value in it.
HSSFCell cell = row.createCell((short)0);
cell.setCellValue(1);

// Or do it on one line.
row.createCell((short)1).setCellValue(1.2);
row.createCell((short)2).setCellValue("This is a string");
row.createCell((short)3).setCellValue(true);

// Write the output to a file
FileOutputStream fileOut = new FileOutputStream("workbook.xls");
wb.write(fileOut);
fileOut.close();

Equivalente en Forms:

DECLARE
v_wb         ORA_JAVA.JOBJECT;
v_fileout    ORA_JAVA.JOBJECT;
v_sheet      ORA_JAVA.JOBJECT;
v_row        ORA_JAVA.JOBJECT;
v_cell       ORA_JAVA.JOBJECT;
BEGIN
v_wb := hssfworkbook.new();
v_sheet := hssfworkbook.createsheet(v_wb, 'new sheet');
v_row := hssfsheet.createrow(v_sheet, 0);
v_cell := hssfrow.createcell(v_row, 0);
hssfcell.setcellvalue(v_cell, 1);
v_cell := hssfrow.createcell(v_row, 1);
hssfcell.setcellvalue(v_cell, 1.2);
v_cell := hssfrow.createcell(v_row, 2);
hssfcell.setcellvalue(v_cell, 'This is a string');
v_cell := hssfrow.createcell(v_row, 3);
hssfcell.setcellvalue(v_cell, TRUE);
v_fileout := fileoutputstream.new('workbook.xls');
hssfworkbook.write(v_wb, v_fileout);
fileoutputstream.close(v_fileout);
END;

Ejemplo para enviar el contenido de un bloque a una excel:

DECLARE
v_wb               ORA_JAVA.JOBJECT;
v_fileout          ORA_JAVA.JOBJECT;
v_sheet            ORA_JAVA.JOBJECT;
v_row              ORA_JAVA.JOBJECT;
v_cell             ORA_JAVA.JOBJECT;
v_fin              BOOLEAN := FALSE;
v_bloque           VARCHAR2(30) := :system.cursor_block;
v_record_anterior  NUMBER := :system.cursor_record;
v_item_anterior    VARCHAR2(61) := :system.cursor_item;
v_item             VARCHAR2(30);
v_num_celda        NUMBER;
v_num_fila         NUMBER;
BEGIN
v_wb := hssfworkbook.new();
v_sheet := hssfworkbook.createsheet(v_wb, 'new sheet');
v_num_fila := 0;

FIRST_RECORD;

WHILE NOT v_fin LOOP
v_row := hssfsheet.createrow(v_sheet, v_num_fila);
v_num_fila := v_num_fila + 1;
v_item := Get_Block_Property(v_bloque, FIRST_ITEM);
v_num_celda := 0;

WHILE v_item IS NOT NULL LOOP
v_cell := hssfrow.createcell(v_row, v_num_celda);
hssfcell.setcellvalue(v_cell, NAME_IN(v_bloque || '.' || v_item));
v_item := Get_Item_Property(v_bloque || '.' || v_item, NEXTITEM);
v_num_celda := v_num_celda + 1;
END LOOP;

IF :system.last_record = 'TRUE' THEN
v_fin := TRUE;
ELSE
NEXT_RECORD;
END IF;
END LOOP;

v_fileout := fileoutputstream.new('workbook.xls');
hssfworkbook.write(v_wb, v_fileout);
fileoutputstream.close(v_fileout);

GO_RECORD(v_record_anterior);
GO_ITEM(v_item_anterior);
END;

NOTA 15/12/2009: Las versiones recientes de las librerías de Jakarta POI están compiladas para usar una máquina virtual de java superior a la que tiene Forms 10g. Al importar en Forms10g sale este mensaje: "Se ha producido una excepción: java.lang.UnsupportedClassVersionError: org/apache/poi/hssf/usermodel/HSSFWorkbook (Unsupported major.minor version 49.0)". Con la versión 3.0.1 de las librerías funciona perfectamente. Esta versión se puede descargar de aqui: http://sites.google.com/site/elfeme/files/poi-3.0.2-FINAL-20080204.zip?attredirects=0&d=1

38 comentarios:

Fernando Cossio dijo...

Buenos días,
Cuando importo la clase me da el siguiente mensaje:

Importing Class C:\JavaClases\poi-3.0.1-FINAL-20070705.jar...
Exception occurred: java.lang.ClassNotFoundException: C:\JavaClases\poi-3/0/1-FINAL-20070705/jar

Me pueden ayudar?
Gracias

Elías F.M. dijo...

Revisa que tengas en la variable CLASSPATH apuntando al archivo poi-3.0.1-FINAL-20070705.jar

Tomás dijo...

y con ficheros planos?

Elías F.M. dijo...

A qué te refieres con ficheros planos?

Unknown dijo...

hola, la variable de entorno PATH ¿es la de windows o la del default.env?

gracias por esta ayuda, no sabia como hacer para sacar un excel

Elías F.M. dijo...

Si estás en modo cliente - servidor se refiere a la de Windows. En modo web se refiere a la variable definida en default.env o en el archivo de configuración que tengas parametrizado en formsweb.cfg

Unknown dijo...

ok gracias, a ver si lo consigo, cada vez que le meto el path no me deja abrir ficheros el forms

Elías F.M. dijo...

Ten en cuenta que tienes que también dejar la ruta a la carpeta bin de oracle forms, por ejemplo (si el cliente de forms está instalado en c:\orant y Java en C:\Program Files\Java\jdk1.6.0_07): PATH=c:\orant\bin;PATH=C:\Program Files\Java\jdk1.6.0_07\bin;C:\Program Files\Java\jdk1.6.0_07\bin\client

leocuenca dijo...

Estoy ulizando Forms 6 a la Primera me salio todo pero tengo un servidor de Solo de Aplicaciones(*.FMX) y trate de generar el Archivo xls en las PCs clientes y me un error desconocido como si Java no estubiera inicializado como puedo solucionar ese problema

Ayudenme por favor

Pablo dijo...

Hola
Recibe un saludo de parte mia, con muchas ansias he buscado una aplicacion que logre generar archivos de 10g a excel, encontre este sito pero lamentablemente no puedo hacerlo funcionar. principalmente al importar me da el error
Exception occurred: java.lang.UnsupportedClassVersionError: org/apache/poi/hssf/usermodel/HSSFFooter (Unsupported major.minor version 49.0)

Podrias por favor ayudarme...
Muchas gracias

Elías F.M. dijo...

Con versiones recientes de las librerías al importar en Forms10g sale este mensaje: "Se ha producido una excepción: java.lang.UnsupportedClassVersionError: org/apache/poi/hssf/usermodel/HSSFWorkbook (Unsupported major.minor version 49.0)". Con la versión 3.0.1 de las librerías funciona perfectamente. Esta versión se puede descargar de aqui: http://sites.google.com/site/elfeme/files/poi-3.0.2-FINAL-20080204.zip?attredirects=0&d=1

Pablo dijo...

Excelente, funciona perfectamente, muchas gracias por proveer la version 3.0.1, con la cual no hay ningun problema en importar. He realizado pruebas y son exitosas.
Pero al realizar me surgio la inquietud de si existe alguna funcion que pueda grabar el archivo .xls en un directorio determinado? Ya que la funcion fileoutputstream.new lo guarda en el directorio que estoy trabajando...
De antemano muchas gracias...

Elías F.M. dijo...

Los archivos xls se generan en el servidor de aplicaciones. Lo que hago yo es generarlos en una carpeta temporal, para ello simplemente hay que especificar la ruta con v_fileout := fileoutputstream.new('/tmp/workbook.xls');

Una vez generado el archivo hay que transferirlo al pc en donde se está ejecutando el navegador, para ello utilizaremos las funcionalidades que nos proporciona la librería WEBUTIL.

Lo primero que se debería hacer es abrir la pantalla de selección de archivo con WEBUTIL_FILE.FILE_SELECTION_DIALOG y cuando el usuario proporcione un nombre de archivo y directorio en donde quiere dejar el archivo se hará la transferencia usando WEBUTIL_FILE_TRANSFER.DB_TO_CLIENT_WITH_PROGRESS

Proximamente haré alguna entrada trantando un poco más a fondo la WEBUTIL.

Unknown dijo...

Buenos Dias,

Alguien ha logrado insertar una imagen en el archivo de EXCEL generado por el POI, ya que he tratado y no he tenido exito.

Luis Arroyo dijo...

La última versión estable de POI es la 3.6, aunque en desarrollo está ya la 3.7b3.

Se pueden añadir versiones superiores a la 3.0.2 a Forms10g, pero es necesario subir la versión de la JDK del Developer Suite a la 1.6 para que lo permita.

Unknown dijo...

Hola a todos,
esta version con poi me ha servido de mucho para exportar a xls, pero se me presenta un problema, estoy generando un reporte que tiene aprox 26000 registros, pero cuando va por el 14700 me envia un msg de error, no oracle exception 105101, y no hace nada mas. Alguien por favor que me ayude, tengo ya varios dias y no he podido determinar el problema. gracias de antemano..

Elías F.M. dijo...

hola,

Eso se debe a que la máquina virtual de Java se queda sin memoria. En Forms 6 en cliente / servidor hasta donde yo se no hay manera de aumentarla. En Forms 10g tiene que haber algún parámetro, pero no te puedo decir exactamente.

Otra alternativa sin usar Java sería generar el xls directamente en la base de datos usando el paquete xml_spreadsheet que puedes bajar de: http://matzberger.de/oracle/spreadsheet-tut-en.html

Saludos,

diserjaime dijo...

Gracias por el aporte yo probé la carga de excel y me funcionó bien ,pero quisiera saber como crear un archivo de microsoft word usando poi en oracle forms 10g

diserjaime dijo...

Este es mi aporte:
asi cargo un archivo desde Excel hay que tomar en cuenta que se debe agregar al CLASSPATH el archivo rt.jar:
DECLARE
jav_wb ORA_JAVA.JOBJECT;
jav_filein ORA_JAVA.JOBJECT;
jav_sheet ORA_JAVA.JOBJECT;
jav_row ORA_JAVA.JOBJECT;
jav_cell ORA_JAVA.JOBJECT;


vc_sheet VARCHAR2(50);
vc_cell VARCHAR2(50);
FILENAME VARCHAR2(100):='C:\ARCHIVO_EXCEL2.xls';
BEGIN
jav_filein := FileInputStream.new(FILENAME);

jav_wb := hssfworkbook.new_1(jav_filein);
jav_sheet := hssfworkbook.getSheetat(jav_wb,0); --PESTAÑA 0 = A LA PRIMERA
jav_row := hssfsheet.getrow(jav_sheet,0); --
jav_cell := hssfrow.getcell(jav_row,0);

vc_cell := HSSFCELL.getStringCellValue(jav_cell);
message(vc_cell);
FileInputStream.close(jav_filein);

EXCEPTION
WHEN OTHERS THEN
MESSAGE('ERROR DESCONOCIDO -> '||SQLERRM);

END;

esulecio dijo...

una pregunta, yo ya implementé todas las clases y desarrollé una forma la cual en mi maquina funciona muy bien, pero al instalarla y llamarla desde un cliente da problemas. Mi pregunta es qué requisitos debería de tener la máquina cliente para que funcione correctamente la forma. Supongo que el JDK 1.6 pero necesitará algo mas?

gracias

Elías F.M. dijo...

Hola Enrique:

Con tener el JRE 1.6 y en el PATH del equipo las carpetas C:\Program Files\Java\jre6\bin;C:\Program Files\Java\jre6\bin\client

Y en el CLASSPATH la ruta C:\Program Files\Java\jre6\lib\rt.jar y la ruta a los jar de poi.

Por ejemplo yo arranco el runtime con el siguiente bat (Tengo forms instalado en C:\Oracle\dev6i y el JRE 1.6 lo tengo instalado en C:\Oracle\dev6i\jre)

set FORMS60_PATH=c:\temp;C:\Libra\L\plxs;C:\Libra\L\plls;C:\Libra\L\fmxs;C:\Libra\L\mmxs;C:\Libra\v52\plxs;C:\Libra\v52\plls;C:\Libra\v52\fmxs;C:\Libra\v52\mmxs
set UI_icon=C:\Libra\v52\ICONOS
set REPORTS60_PATH=c:\temp;C:\Datos\Libra\L\curso;C:\Libra\L\plls;C:\Libra\L\reps;C:\Libra\v52\plls;C:\Libra\v52\reps
set PATH=C:\Oracle\dev6i\jre\bin;C:\Oracle\dev6i\jre\bin\client;c:\oracle\dev6i\bin;C:\Libra\v52\vgls
set CLASSPATH=C:\Oracle\dev6i\jre\lib\rt.jar;C:\Datos\Libra\v52\jars\poi.jar;C:\Datos\Libra\v52\jars\poi-scratchpad.jar;C:\Datos\Libra\v52\jars\poi-contrib.jar
set NLS_LANG=SPANISH_SPAIN.WE8ISO8859P15
set NLS_DATE_FORMAT=DD/MM/YYYY
set NLS_NUMERIC_CHARACTERS=,.
set NLS_SORT=BINARY
set DIRECTORIO_SALIDA=C:\TEMP
set REPORTS60_TMP=c:\TEMP
start ifrun60 module=menu_mdi userid=USUARIO/PASSWORD@CADENA_CONEXION

esulecio dijo...

excelente Elias, muchas gracias, en este momento ya he realizado las pruebas y han sido satisfactorias, agradezco mucho tu tiempo y colaboración y que bueno que existan blogs como estos, cualquier cosa en el futuro te vuelvo a molestar. Dios te bendiga !!

INFORMATICA IES AS LAGOAS dijo...

Gracias Elias por lo bien explicado que etá el tema. Una consulta:
¿Como puedo insertar una fecha en una celda, y que ésta aparezca con formato de fecha?
Gracias.

Tomás dijo...

Buenas, hace ya años que no lo toco, pero el campo de texto, si le pones tipo fecha saldra en tipo fecha. En alguno de los campos permitia darle formato (Eso de dd/mm/yyyy)

Elías F.M. dijo...

Hola:

Yo lo tengo hecho usando la clase Calendar, de esta forma:

DECLARE
v_calendar ora_java.jobject;
v_timezone ora_java.jobject;
v_locale ora_java.jobject;
v_fecha DATE;
...
BEGIN
...
v_fecha := SYSDATE;
v_timezone := TimeZone.getTimeZone('Europe/Madrid');
v_locale := locale.new('es');
v_calendar := calendar.getinstance(v_timezone, v_locale);
calendar.set_(v_calendar, TO_NUMBER(TO_CHAR(v_fecha, 'YYYY')), TO_NUMBER(TO_CHAR(v_fecha, 'MM')) - 1, TO_NUMBER(TO_CHAR(v_fecha, 'DD')), TO_NUMBER(TO_CHAR(v_fecha, 'HH24')), TO_NUMBER(TO_CHAR(v_fecha, 'MI')), TO_NUMBER(TO_CHAR(v_fecha, 'SS')));
hssfcell.setcellvalue_2(v_cell, v_calendar);
...
END;

Espero que te sirva de ayuda.

Elías F.M. dijo...

Ejemplo de celdas combinadas:

Hay que importar la clase: org.apache.poi.hssf.util.Region

DECLARE
v_wb ORA_JAVA.JOBJECT;
v_fileout ORA_JAVA.JOBJECT;
v_sheet ORA_JAVA.JOBJECT;
v_row ORA_JAVA.JOBJECT;
v_cell ORA_JAVA.JOBJECT;
v_region ORA_JAVA.JOBJECT;
v_id_region NUMBER;
BEGIN
break;
v_wb := hssfworkbook.new();
v_sheet := hssfworkbook.createsheet(v_wb, 'new sheet');
v_row := hssfsheet.createrow(v_sheet, 0);
v_region := region.new(0, 0, 2, 10);
v_id_region := hssfsheet.addMergedRegion(v_sheet, v_region);
v_cell := hssfrow.createcell(v_row, 0);
hssfcell.setcellvalue(v_cell, 'DENTRO');
v_cell := hssfrow.createcell(v_row, 11);
hssfcell.setcellvalue(v_cell, 'DERECHA1');
v_row := hssfsheet.createrow(v_sheet, 1);
v_cell := hssfrow.createcell(v_row, 11);
hssfcell.setcellvalue(v_cell, 'DERECHA2');
v_row := hssfsheet.createrow(v_sheet, 2);
v_cell := hssfrow.createcell(v_row, 11);
hssfcell.setcellvalue(v_cell, 'DERECHA3');
v_row := hssfsheet.createrow(v_sheet, 3);
v_cell := hssfrow.createcell(v_row, 0);
hssfcell.setcellvalue(v_cell, 'ABAJO');
v_fileout := fileoutputstream.new('c:\temp\workbook.xls');
hssfworkbook.write(v_wb, v_fileout);
fileoutputstream.close(v_fileout);
END;

-A_A- dijo...

Muchisimas gracias por este ultimo aporte, no sabes lo bien me he venido porque llevaba saturada con estounos dias y todo lo que encontraba por la red era incompleto.

Gracias.
(Girlsgs)

-A_A- dijo...

Elias aqui vengo con otra duda, sobre celda combinadas, la version que estoy utilizando es la Version 3.2-FINAL (2008-10-19) porque es la que utiliza el cliente (y no tengo opcion a implementar una mas reciente) y necesito darle formato a las regiones que me he creado.

He visto que en nuevas versiones existe la clase org.apache.poi.hssf.util.HSSFRegionUtil , que me ayudaria, para por ejemplo, añadir los bordes... sabes si para la version que te digo existe algo para poder hacer lo mismo.

Gracias de antemano. Sin duda es un gran descubrimiento que haya gente que desinteresadamente aporte al resto sus conocimientos.

Muchas gracias de antemano.
Saludos.

Elías F.M. dijo...

En esa versiónla clase HSSFRegionUtil está en: org.apache.poi.hssf.usermodel.contrib.HSSFRegionUtil

Para que te funcione bien tienes que meter en el CLASSPATH los siguientes jar (todos ellos se pueden descargar de: http://commons.apache.org): commons-beanutils-1.8.3.jar, commons-lang-2.6.jar y commons-logging-1.1.1.jar

Ejemplo:

DECLARE
v_error VARCHAR2(4000);
v_wb ora_java.jobject;
v_fileout ora_java.jobject;
v_sheet ora_java.jobject;
v_row ora_java.jobject;
v_cell ora_java.jobject;
v_region ora_java.jobject;
v_id_region NUMBER;
v_exception ora_java.jobject;
raisedexception ora_java.jobject;
BEGIN
v_wb := hssfworkbook.new();
v_sheet := hssfworkbook.createsheet(v_wb, 'new sheet');
v_row := hssfsheet.createrow(v_sheet, 0);
v_region := region.new(0, 0, 2, 10);
v_id_region := hssfsheet.addmergedregion(v_sheet, v_region);
hssfregionutil.setborderbottom(hssfcellstyle.border_medium_dashed, v_region, v_sheet, v_wb);
hssfregionutil.setbordertop(hssfcellstyle.border_medium_dashed, v_region, v_sheet, v_wb);
hssfregionutil.setborderleft(hssfcellstyle.border_medium_dashed, v_region, v_sheet, v_wb);
hssfregionutil.setborderright(hssfcellstyle.border_medium_dashed, v_region, v_sheet, v_wb);
v_cell := hssfrow.createcell(v_row, 0);
hssfcell.setcellvalue(v_cell, 'DENTRO');
v_cell := hssfrow.createcell(v_row, 11);
hssfcell.setcellvalue(v_cell, 'DERECHA1');
v_row := hssfsheet.createrow(v_sheet, 1);
v_cell := hssfrow.createcell(v_row, 11);
hssfcell.setcellvalue(v_cell, 'DERECHA2');
v_row := hssfsheet.createrow(v_sheet, 2);
v_cell := hssfrow.createcell(v_row, 11);
hssfcell.setcellvalue(v_cell, 'DERECHA3');
v_row := hssfsheet.createrow(v_sheet, 3);
v_cell := hssfrow.createcell(v_row, 0);
hssfcell.setcellvalue(v_cell, 'ABAJO');
v_fileout := fileoutputstream.new('c:\temp\workbook2.xls');
hssfworkbook.write(v_wb, v_fileout);
fileoutputstream.close(v_fileout);
EXCEPTION
WHEN ora_java.java_error THEN -- Controlar ORA-105100
MESSAGE('No se ha podido ejecutar Java: ' || ora_java.last_error);
WHEN ora_java.exception_thrown THEN -- Controlar ORA-105101
raisedexception := exception_.new(ora_java.last_exception);
BEGIN
MESSAGE('Exception: ' || exception_.tostring(raisedexception));
MESSAGE('Exception: ' || exception_.tostring(raisedexception));
EXCEPTION
WHEN ora_java.java_error THEN
MESSAGE('No se ha podido ejecutar Java: ' || ora_java.last_error);
END;
END;

will824 dijo...

Hola Elías,

Realmente útil este Post, si no hubiera sido porque encontré esta información entonces aún estaría intentando comunicar JAVA y Forms.

Muy concisa la lectura. Gracias!!!!

Héctor dijo...

Tras modificar valores de una hoja excel, las fórmulas dependientes de esos valores no se recalculan. ¿Sabe alguien como solucionar esto?
Gracias

Elías F.M. dijo...

Hola:

Con las fórmulas nunca se me ha dado el problema que comentas. Te pego un ejemplo de un xls con fórmulas para que lo puedas probar:

DECLARE
v_wb ORA_JAVA.JOBJECT;
v_fileout ORA_JAVA.JOBJECT;
v_sheet ORA_JAVA.JOBJECT;
v_row ORA_JAVA.JOBJECT;
v_cell ORA_JAVA.JOBJECT;
BEGIN
v_wb := hssfworkbook.new();
v_sheet := hssfworkbook.createsheet(v_wb, 'new sheet');
v_row := hssfsheet.createrow(v_sheet, 0);
v_cell := hssfrow.createcell(v_row, 0);
hssfcell.setcellvalue(v_cell, 100);
v_cell := hssfrow.createcell(v_row, 1);
hssfcell.setcellvalue(v_cell, 200);
v_cell := hssfrow.createcell(v_row, 2);
hssfcell.setcellformula(v_cell, 'SUM(A1:B1)');
v_fileout := fileoutputstream.new('c:\temp\workbook.xls');
hssfworkbook.write(v_wb, v_fileout);
fileoutputstream.close(v_fileout);
END;

Saludos,

alexariza dijo...

Hola sailefm . Antes que todo muchas gracias por este blog esta muy bueno.

Hice todos los pasos mencionados y me funcionó perfectamente, pero localmente, es decir, ejecutando la forma desde Forms Developer.

Pero cuando la pongo en el servidor e intento generar el archivo desde un cliente, se genera allá en el servidor.

Ud. mencionó que la idea sería utilizar "webutil_file_transfer.DB_To_Client_With_Progress". Cómo puedo usar esa función de la webutil para la generación del archivo? que siginifican los parámetros que tiene? Será que hay otra manera en que pueda generar en el cliente el archivo excel?

Gracias.

Elías F.M. dijo...

Hola:

Por rendimiento cualquier tipo de archivo debe de ser generado primero temporalmente en el servidor de aplicaciones y luego transferirlo al equipo que utiliza el usuario. Pero en el caso que explico de como realizar las hojas de cálculo es totalmente necesario hacerlo de esa forma, no hay alternativa de generarlo directamente en el equipo del usuario.

Lo complicado está en la configuración del servidor de la webutil, voy a tratar de resumirlo:

* En el archivo formsweb.cfg hay que configurar las siguientes propiedades:
baseHTMLJInitiator=webutiljpi.htm
baseHTMLjpi=webutiljpi.htm
baseHTMLie=webutiljpi.htm
baseHTML=webutiljpi.htm
WebUtilArchive=frmwebutil.jar,jacob.jar
WebUtilLogging=off
WebUtilLoggingDetail=normal
WebUtilErrorMode=Alert
WebUtilDispatchMonitorInterval=5
WebUtilTrustInternal=true
WebUtilMaxTransferSize=16384

* Firmar las librerías frmwebutil.jar y jacob.jar con sign_webutil.sh (en linux ) o sign_webutil.bat (en windows): sig_webutil.sh frmwebutil.jar

* Autorizar las transferencias desde la carpeta temporal en el archivo webutil.cfg
transfer.appsrv.enabled=TRUE
transfer.appsrv.workAreaRoot=c:\Temp


Para transferir un archivo es simple, tienes que incorporar la librería webutil.pll y al programa añadir el grupo de objetos del archivo webutil.olb, esto mete un bloque WEBUTIL al principio de todos los bloques, hay que moverlo al último lugar.

Una vez tienes la librería webutil.pll y los objetos añadidos de webutil.olb, puedes generar la hoja de cálculo, por ejemplo, en la carpeta c:\temp (si el servidor es Windows) o /home/temporal (si es Linux) y luego ya ejecutar:

rdo := WEBUTIL_FILE_TRANSFER.AS_To_Client_With_Progress('c:\directorio_en_pc_del_usuario\archivo.xls', 'directorio_en_servidor_de_aplicaciones/archivo.xls', 'Título barra de progreso', 'Subtítulo barra de progreso);

Web recomendada sobre la webutil: http://www.oracle.com/technetwork/developer-tools/forms/webutil-090641.html

Saludos,

Xelo dijo...

Hola,
yo necesito mediante una aplicacion desarrollada en forms 10g, poder hacer carga de archivos xls y cargarlos a la base de datos, primero ubicar el archivo con un popup para ubicar el archivo y dejar la ruta en un text, estoy migrando un sistema de forms 6i a 10g,
help please
gracias

khuno dijo...

Hola, tengo una consulta, estoy aplicando la librería poi-3.0.1-FINAL-20070705.jar, no tengo problemas al generar el archivo excel, pero si un detalle en el archivo resultante, no puedo sumar las columnas que son numéricas así cambie el formato de las mismas, hay alguna opción para enviar en formato numérico (o crear la celda con formato numérico) al momento de crear el archivo?

GRACIAS !!!

khuno dijo...

Hola, tengo una consulta, estoy aplicando la librería poi-3.0.1-FINAL-20070705.jar, no tengo problemas al generar el archivo excel, pero si un detalle en el archivo resultante, no puedo sumar las columnas que son numéricas así cambie el formato de las mismas, hay alguna opción para enviar en formato numérico (o crear la celda con formato numérico) al momento de crear el archivo?

GRACIAS !!!

Unknown dijo...

Tengo una aplicacion bajo el JDK 1.4.2 y utilizo el Jakarta 1.5, todo esto en un entorno Windows XP. Todo trabaja bien en esta plataforma, pero los clientes cambiaron de sistema operativo Windows 7 y ya no puedo generar archivos excel, que version del POI debo utilizar para poder generar los excel? aun tengo que seguir usando la clas HSS o tengo que cambiar a XSS?