jexcelapi stocké dans la base
Bonjour tout le monde,
j'utilise l'API Jexcelapi pour générer des fichiers à partir de donnée oracle.
J'ai créé cette classe:
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118
| package jxl.oracle;
import java.io.File;
import java.util.Date;
import java.util.Locale;
import jxl.Workbook;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
import jxl.write.DateTime;
import jxl.write.WritableCellFormat;
import jxl.write.WritableSheet;
import jxl.write.Label;
import jxl.write.WritableWorkbook;
import java.lang.Integer;
import jxl.write.Number;
import java.lang.Double;
import jxl.write.DateFormat;
import oracle.jdbc.OracleDriver;
public class write
{
public static void main(String[] args)
{
Connection con = null;
String sstatement;
int i;
String colname;
try
{
Date date_actuelle = new Date();
System.out.println("Debut:" + date_actuelle);
/*standalone xls creation*/
DriverManager.registerDriver(new oracle.jdbc.driver.OracleDriver ());
con = DriverManager.getConnection("jdbc:oracle:oci:@xxx.xxx.xxx.xxx:xx:ORCL", "TATA", "TOTO");
WritableWorkbook copy=Workbook.createWorkbook(new File("c:/test.xls"));
*/
/* inside data base*/
/*OracleDriver ora = new OracleDriver();
con = ora.defaultConnection();
WritableWorkbook copy=Workbook.createWorkbook(new File("/oradata/test.xls"));
*/
WritableSheet sheet = copy.createSheet("First Sheet", 0);
i = 0;
Statement stmt = con.createStatement();
sstatement = "select * from tagada'";
ResultSet rs = stmt.executeQuery(sstatement);
int nbcol = rs.getMetaData().getColumnCount();
int j = 1;
while (j<=nbcol)
{
colname=rs.getMetaData().getColumnName(j);
Label labeldata = new Label(j-1, i, colname);
sheet.addCell(labeldata);
j=j+1;
}
j=1;
i=1;
WritableCellFormat myformat = new WritableCellFormat(new DateFormat("dd/MM/yyyy"));
while (rs.next() && i<65535)
{
j=1;
while (j<=nbcol)
{
String coltype = rs.getMetaData().getColumnTypeName(j);
if (rs.getMetaData().getColumnTypeName(j)=="INTEGER" )
{
int sdata = rs.getInt(j);
if (!rs.wasNull())
{
Number labeldata = new Number(j-1, i, sdata);
sheet.addCell(labeldata);
}
}
if (rs.getMetaData().getColumnTypeName(j)=="NUMBER" )
{
double sdata = rs.getDouble(j);
if (!rs.wasNull())
{
Number labeldata = new Number(j-1, i, sdata);
sheet.addCell(labeldata);
}
}
if (rs.getMetaData().getColumnTypeName(j)=="VARCHAR2" || rs.getMetaData().getColumnTypeName(j)=="CHAR")
{
String sdata = rs.getString(j);
if (!rs.wasNull())
{
Label labeldata = new Label(j-1, i, sdata);
sheet.addCell(labeldata);
}
}
if (rs.getMetaData().getColumnTypeName(j)=="DATE")
{
Date sdata = rs.getDate(j);
if (!rs.wasNull())
{
DateTime labeldata = new DateTime(j-1, i, sdata, myformat);
sheet.addCell(labeldata);
}
}
j = j+1;
}
i = i+1;
}
copy.write();
rs.close();
con.close();
copy.close();
date_actuelle = new Date();
System.out.println("Fin:" + date_actuelle);
}
catch(Exception ex)
{
ex.printStackTrace();
}
}
} |
Cette classe fonctionne sans aucun problème lorsque je fais un run par le biais de JDEV mon fichier c:\test.xls est créé correctement.
Maintenant j'essaye d'en faire une java stored procedure sous une database 9iR2 (9.2.0.6) sous HPUX:
je mets donc cette partie de code en commentaire:
Code:
1 2 3 4 5
|
/*standalone xls creation*/
DriverManager.registerDriver(new oracle.jdbc.driver.OracleDriver ());
con = DriverManager.getConnection("jdbc:oracle:oci:@xxx.xxx.xxx.xxx:xx:ORCL", "TATA", "TOTO");
WritableWorkbook copy=Workbook.createWorkbook(new File("c:/test.xls")); |
et j'enléve les commentaires pour cette partie de code:
Code:
1 2 3 4
|
OracleDriver ora = new OracleDriver();
con = ora.defaultConnection();
WritableWorkbook copy=Workbook.createWorkbook(new File("/oradata/test.xls")); |
j'ai créé un profile de déploiement pour la database, tous les objets sont chargé correctement et sont marqués comme valide.
je me suis créé une procedure PL/SQL ORA2XLS comme ceci:
Code:
1 2 3 4
|
PROCEDURE ORA2XLS (p_args in varchar2) AS
LANGUAGE JAVA
NAME 'jxl.oracle.write.main(java.lang.String[])'; |
Lorsque j'execute ma procedure sous sql/plus voici le resultat:
SQL> execute ora2xls('blabl');
Debut:Wed Jan 10 16:03:23 CET 2007
java.lang.AbstractMethodError: Error detected by bytecode verifier when class was created
at jxl.write.biff.RowRecord.writeCells(RowRecord.java:275)
at jxl.write.biff.SheetWriter.write(SheetWriter.java:440)
at jxl.write.biff.WritableSheetImpl.write(WritableSheetImpl.java:1321)
at jxl.write.biff.WritableWorkbookImpl.write(WritableWorkbookImpl.java:839)
at jxl.oracle.write.main(write.java:109)
BEGIN ora2xls('blabl'); END;
*
ERREUR à la ligne 1 :
ORA-29532: appel Java arrêté par une exception Java non interceptée : java.lang.AbstractMethodError: Error detected by bytecode verifier when class was created
ORA-06512: à "ORA2XLS", ligne 0
ORA-06512: à ligne 1
Je n'arrive pas a comprendre pourquoi il me retourne cette erreur.
Donc si quelqu'un peut m'aider ca serait tres bien :)
Pour info j'ai testé sur une 10gR2 et ca passe sans probleme.