PDA

View Full Version : Excel Datei mit RPG und POI/HSSF in A4



haertl
29-05-06, 10:30
Hallo Forum,

ich erstelle mit POI/HSSF und RPG eine Excel Datei die ich mit Daten fülle.
Beim erstellen der Excel Datei stellt er mir standardmäßig das Seitenformat Letter ein.
Ich möchte aber Format A4 haben. In der Doku habe ich eine Klasse für den
Drucker Setup gefunden und folgendes codiert:


D* // DRUCKER SETUP
D PrtSetup S O CLASS(*JAVA
D :'org.apache.poi.hssf.usermodel-
D .HSSFPrintSetup')



D* // PRINTER KONSTRUKTOR
D setupPrinter PR O EXTPROC(*JAVA
D :'org.apache.poi.hssf.usermodel-
D .HSSFPrintSetup'
D :*CONSTRUCTOR)
D CLASS(*JAVA
D :'org.apache.poi.hssf.usermodel-
D .HSSFPrintSetup')




D* // PAPIERGRÖSSE EINSTELLEN
D setPaperSize PR O EXTPROC(*JAVA
D :'org.apache.poi.hssf.usermodel-
D .HSSFPrintSetup'
D :'setPaperSize')
D CLASS(*JAVA
D :'org.apache.poi.hssf.usermodel-
D .HSSFPrintSetup')



Wie muss ich jetzt die Papiergröße abändern ?
Hat jemand ein Beispiel ?

Danke für alle Antworten

KM
29-05-06, 10:50
Versuch doch mal folgendes:

PrtSetup = setupPrinter();
setPaperSize(PrtSetup) = 9;

Gruß,
KM

haertl
29-05-06, 10:59
Hallo,
ich bekomme beim Compilieren eine
Fehlermeldung:

setPaperSize(PrtSetup) = 9;



*RNF7416 30 753 069500 Die Arten der Operanden auf der rechten und linken Seite
des Ausdrucks in der Operation EVAL stimmen nicht überein.

KM
29-05-06, 11:26
Füge mal folgendes ein:


D A4 5I 0 inz(9)
.
.
.
setPaperSize(PrtSetup) = A4;


Die Methode setPaperSize erwartet den Typ SHORT.

Gruß,
KM

haertl
29-05-06, 11:55
Hallo KM,

leider ohne Erfolg, die Fehlermeldung
bleibt wie gehabt.

Fuerchau
29-05-06, 12:15
setPaperSize ist falsch deklariert.
Bei Prozeduraufrufen kann keine Zuweisung erfolgen.
Das gewünschte Argument muss als Parameter übergeben werden.

Prüfe mal die Prozedurdeklaration und korrigiere diese, so dass folgender Aufruf möglich ist:

setPaperSize(PrtSetup:9);

haertl
29-05-06, 12:51
Hallo Fuerchau, ich habe jetzt die Prozedurdefinition abgeändert in:

D* // PAPIERGRÖSSE EINSTELLEN
D setPaperSize PR O EXTPROC(*JAVA
D :'org.apache.poi.hssf.usermodel-
D .HSSFPrintSetup'
D :'setPaperSize')
D CLASS(*JAVA
D :'org.apache.poi.hssf.usermodel-
D .HSSFPrintSetup')
D parm 5I 0 value

Ich kann das PGM fehlerfrei compilieren, aber beim Aufruf des PGMs kommt die Fehlermeldung:

Java-Ausnahme "java.lang.NoClassDefFoundError:
org/apache/poi/hssf/usermodel/HSSFPrintSetup" empfangen, als die Methode
"<init>" mit Kennung "()V" in Klasse
"org.apache.poi.hssf.usermodel.HSSFPrintSetup" aufgerufen
wurde.Fehlerbeseitigung: Mit Hilfe des Benutzers, der für die Programmpflege
verantwortlich ist, die Fehlerursache bestimmen.Technische Beschreibung . .

Fuerchau
29-05-06, 12:55
Ich kenne mich in den Funktionen da nicht aus.
Aber die Deklaration (sprich der Aufruf) muss ja in etwa ähnlich anderen Zuweisungs-Operationen definiert werden.

Prüfe da genau die Argumente und Ausprägungen.

RobertPic
30-05-06, 13:36
Da ich nur die Deklarationen sehen, kann ich mir kein richtiges Urteil bilden. Aber wie setzt du die Javazeilen:



// Papiergrösse A4 (short 9)
HSSFPrintSetup ps = sheet.getPrintSetup();
ps.setPaperSize(HSSFPrintSetup.A4_PAPERSIZE);
um? Das Objekt HSSFPrintSetup muss aus dem Sheet initialisiert werden. Machst du das?

Allerdings muss ich hier auch ein Warnungen aussprechen:

1. RPG und Java....(siehe auch Homepage von Dieter Bender)

2. die POI-Lib
Die Exceltabelle wird komplett im Hauptspeicher erstellt. Der Hauptspeicherbedarf ist ca. Faktor 15-20 (!) vom xls.

Da bei uns auch mal größere Listen drüberlaufen, verwende ich die POI-Lib nicht! (besser JExcelAPI)

Anbei ein Commandline Tool, aber wie gesagt: nix für große XLS-Dateien.

Robert P.



import com.ibm.as400.access.*;
import java.sql.*;
import java.io.FileOutputStream;
import org.apache.poi.hssf.usermodel.*;


public class PoiDemo {

public void run (String dbFile, String outFile, String user, String password)
throws SQLException {

dbFile = dbFile.replaceAll("/", "."); // SQL schreibweise

// JDBC-Treiber laden
DriverManager.registerDriver(new com.ibm.as400.access.AS400JDBCDriver());

Connection conn =
DriverManager.getConnection("jdbc:as400://127.0.0.1;extended metadata=true",
user, password);

Statement stmt = conn.createStatement ();
ResultSet rs = stmt.executeQuery ("select * from " + dbFile);

ResultSetMetaData meta = rs.getMetaData();
int anzFields = meta.getColumnCount();
int zeile = 0;

// neues Dokument
HSSFWorkbook wb = new HSSFWorkbook();
// neues sheet
HSSFSheet sheet = wb.createSheet("Demo");
// Papiergrösse A4 (short 9)
HSSFPrintSetup ps = sheet.getPrintSetup();
ps.setPaperSize(HSSFPrintSetup.A4_PAPERSIZE);

// Zeile erzeugen, um 1 erhöhen
HSSFRow row = sheet.createRow(zeile++);
HSSFCell cell;

// Überschriften erzeugen
for (int i = 0; i < anzFields; i++) {
cell = row.createCell((short) i);
String label = meta.getColumnLabel(i+1);

// alte, mehrzeilige Columnheadings komprimieren (für Autofilter & Co)
switch (label.length()) {
case 60:
label = label.substring(0, 19).trim() + " " +
label.substring(20, 39).trim() + " " +
label.substring(40).trim();
break;
case 40:
label = label.substring(0, 19).trim() + " " +
label.substring(20, 39).trim();
break;
default:
label = label.trim();
}

cell.setCellValue(label);
// Spaltenbreite aus Metadaten holen (256=eine Zeichenbreite + etwas Abstand)
sheet.setColumnWidth((short) i, (short) (meta.getColumnDisplaySize(i+1) * (256 + 16) + 512));
}

// Daten umschaufeln
while (rs.next ()) {
row = sheet.createRow(zeile++);
for (int i = 0; i < anzFields; i++) {
cell = row.createCell((short) i);
// zwischen numerisch unterscheiden, der Rest als String
if (meta.getColumnClassName(i+1).equals("java.math.BigDecimal")) {
cell.setCellValue(rs.getDouble(i+1));
cell.setCellType(cell.CELL_TYPE_NUMERIC);
} else {
cell.setCellValue(rs.getString(i+1));
cell.setCellType(cell.CELL_TYPE_STRING);
}

}
}

rs.close();
stmt.close();
conn.close();

// File schreiben
try {
FileOutputStream xlsFile = new FileOutputStream(outFile);
wb.write(xlsFile);
xlsFile.close();
} catch (Exception e) {
System.out.println("Fehler beim Erstellen von File " + outFile + ": " + e);
}
}

public static void main (String args []) throws SQLException {

if (args.length == 4) {
try {
new PoiDemo().run(args[0],args[1],args[2],args[3]);
} catch (SQLException e) {
System.out.println("Datenbankfehler: " + e);
}
} else {
System.out.println("AS/400 DbFile2XLS");
System.out.println("Parameter: AS400Lib/File IFS-OutFile User Password");
}
}
}

Anmkerungen:
1. Das Tool verwendet nicht die nativen DB2-Treiber
2. Für den Normalgebrauch ist von metadata=true abzuraten. In diesem Fall ist das Absicht, damit man an die wirklichen Feldbezeichnungen kommt.
3. wie gesagt, braucht viel Speicher bei großen XLS-Tabellen
4. hier ein Beispielaufruf:


QSH

java -classpath /pfad:/pfad/poi-2.5.1.jar PoiDemo Lib/ARTIKEL /freigaben/Artikel.xls user pass