IggeB Geschrieben 13. Februar 2009 Geschrieben 13. Februar 2009 Hallo Leute, ich sitze verzweifelt seit Tagen an einer Programmieraufgabe und bin inzwischen nicht mehr sicher, ob es überhaupt möglich ist diese zu realisieren. Meine Aufgabe besteht darin, eine XLT-Datei mit Makros, bestehend aus 3 Sheets einzulesen und auf dem 3 Sheet Daten einzutragen. Ich habe bereits versucht die Datei mit dem normalen File-Reader einzulesen, was jedoch nicht funktioniert hat...Desweiteren versuchte ich die Datei in csv-Format umzuschreiben, was auch klappte, jedoch Probleme bei der Zurückumwandlung in XLT brachte. Habt ihr eine Idee, wie ich da vorgehen könnte? Ich würde mich über eure Hilfe sehr freuen! MfG Igge Zitieren
speedi Geschrieben 13. Februar 2009 Geschrieben 13. Februar 2009 Ich kenn mich zwar mit Microsoft-Formaten ganz und gar nicht aus, aber es könnte sein, dass dir der FileReader verschiedene Zeichen (besonders bei binärformaten) einfach verschluckt. Versuch doch mal die Datei mit nem FileInputStream zu lesen (und später mit FileOutputStream zu schreiben). Zitieren
Schiller256 Geschrieben 13. Februar 2009 Geschrieben 13. Februar 2009 Was für Bibliotheken nutzt du um auf die XLT Datei zuzugreifen? Denn einfach mit FileReader oder ähnlichem wird es nicht gehen. Denn du musst das speziell Office Format erst Interpretieren um dann auf die Makros zuzugreifen. Zitieren
IggeB Geschrieben 13. Februar 2009 Autor Geschrieben 13. Februar 2009 danke für eure Antworten. so, ich habe mich jetzt mal an dem FileInputStream ausprobiert. Dieser liest die Datei ein, liefert mir jedoch nur unzählige zahlenwerte von 0-255. Wie kann ich jetzt die XLT-Datei dementsprechend beschreiben? Ich muss sagen, dass ich Neuling bin und mich noch nicht so gut mit den Werkzeugen auskenne. Gruß Igge Zitieren
Schiller256 Geschrieben 13. Februar 2009 Geschrieben 13. Februar 2009 Wenn du auf Office Dokumente zugreifen willst versuche es mal mit Apache POI - Java API To Access Microsoft Format Files. Ansonsten solltest du dich erstmal mit den Grundlagen der Sprache auseinander setzten und nicht gleich mit einem solch schweren Projekt beginnen. Zitieren
speedi Geschrieben 13. Februar 2009 Geschrieben 13. Februar 2009 (bearbeitet) Die Zahlenwerte kannst du auf chars casten und zu Strings zusammenfügen. Damit liest du einfach nur die Datei Byte für Byte ein (aus Performancegründen solltest du aber der read-Methode ein Byte-Array übergeben). Hier mal nen Beispielcode: try { FileInputStream in = new FileInputStream(sourceFile); byte [] bytes = new byte[1024]; int readBytes; while((readBytes = in.read(bytes)) != -1){ System.out.println(new String(bytes,0,readBytes)); } in.close(); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e){ e.printStackTrace(); } Bearbeitet 13. Februar 2009 von speedi Zitieren
IggeB Geschrieben 13. Februar 2009 Autor Geschrieben 13. Februar 2009 Danke für die Antworten. @Speedi: Ich habe deinen Code mal ausprobiert. Die Ausgabe ist dann aber immer noch fehlerhaft. Es werden zwar einzelne Wörter dargestellt, aber größtenteils sieht man Fragezeichen oder kryptische Symbole. Es ist glaub ich das gleiche Resultat wie mit dem klassischen FileReader. Habt ihr ne Ahnung, woran das liegt? Gruß Ingmar Zitieren
Bubble Geschrieben 13. Februar 2009 Geschrieben 13. Februar 2009 (bearbeitet) Habt ihr ne Ahnung, woran das liegt? Die Bytes in der Datei müssen erst dem Dateiformat entsprechend interpretiert werden, bevor eine Ausgabe sinnvoll ist. Bearbeitet 13. Februar 2009 von Bubble Zitieren
IggeB Geschrieben 13. Februar 2009 Autor Geschrieben 13. Februar 2009 @Bubble: und wie genau funktioniert das, also das Interpretieren? Zitieren
Schiller256 Geschrieben 13. Februar 2009 Geschrieben 13. Februar 2009 Jetzt vielleicht nochmal mit einfachen Worten. Das Office Format ist ein Binär Format entweder liest du dich in die Spezifikation (was bei Microsoft Office schwer werden dürfte) ein und schreibst dir selbst deinen Interpreter. Oder du nutzt einen bereits vorhanden, z.B. den den ich dir weiter oben gezeigt habe. Der die FileReader oder InputStream stellen dir die Dateien so zur Verfügung wie sie auf dem Filesystem abgelegt sind. Sie machen nicht mehr und nicht weniger. Wenn eine Datei Binär abgelegt wird dann musst du dich um das übersetzen kümmern. Es sei denn du kannst direkt etwas mit dem Binär Strom anfangen. Wenn du eine Office Datei mal mit einem Editor also nicht mir den Office Programmen öffnest dann solltest du das gleiche sehen wie in deinem Java Programm. Zitieren
IggeB Geschrieben 13. Februar 2009 Autor Geschrieben 13. Februar 2009 ja ok. dann versuch ich es mal mit einem deiner oben genannten Interpreter... Danke Zitieren
speedi Geschrieben 13. Februar 2009 Geschrieben 13. Februar 2009 Diese kryptischen Zeichen sich binärwerte denen im Zeichensatz (vermutlich wirds mit ASCII angezeigt), kein Zeichen zugeordnet ist. Dabei könnte es sich z.B. um die Position von Textfeldern handeln die binär abgelegt wurden. Also nicht als einfache Zahl im klartext geschrieben sondern als das was sie für den rechner sind: 4 Bytes. Die Aufgabe, die du da hast ist leider alles andere als einfach, aber wenn du in die Zellen, wo du etwas eintragen musst einen Platzhalter reinsetzt und dann in der Datei nach genau diesen Platzhalter suchst könnte es so funktionieren. Denn dann musst du ja nichts an der Datei an sich ändern, sondern nur an bekannter stelle etwas bekanntes einfügen. Zitieren
IggeB Geschrieben 16. Februar 2009 Autor Geschrieben 16. Februar 2009 Hi, also ich versuche jetzt die Datei mit FileInputStream und FileOutputStream zu bearbeiten. Zuerst habe ich mir die Datei komplett in eine neue Datei gespeichert und möchte nun noch zusätzliche Zeilen hinzufügen. Das Kopieren der Datei klappt einwandfrei, nur die Zeichen, die ich hinzufügen möchte sind nirgends zu sehen. WOran liegt das? Mein Code sieht so aus: public class test2 { public static void main(String[] args) { try{ File file=new File("Formblatt-Vorlage-Hydrogenics.XLT"); byte[] array=new byte[1024]; String test = "an das Ende der Datei, bitte"; int readBytes; FileInputStream fis = new FileInputStream(file); FileOutputStream fos = new FileOutputStream("new.XLT"); while((readBytes = fis.read(array)) != -1){ fos.write(array, 0, readBytes); } fos.write(test.getBytes()); fis.close(); fos.close(); System.out.println(file.length()); } catch(FileNotFoundException e1){ e1.printStackTrace(); System.out.println("Fehler"); } catch(IOException e2){ e2.printStackTrace(); } } } Danke für eure Hilfe! Zitieren
Schiller256 Geschrieben 16. Februar 2009 Geschrieben 16. Februar 2009 Liest du die Beiträge hier auch? Öffne deine xlt Datei mal mit einem Editor da sollte dein Satz am Ende der Datei stehen. Wieso es im Excel nicht angezeigt wird liegt darin weil Excel diese Zeichen ignoriert. Denn die Excel Datei hat einen bestimmten Aufbau hier werden an spezieller Stelle spezielle Daten/Zeichen erwartet. Wenn du nun irgendwo Zeichen einfügst kann es passieren das es keine valide Excel Datei mehr ist und diese nicht angezeigt wird. Bei dir schein es so zu sein als würden die Zeichen einfach ignoriert werden. Zitieren
IggeB Geschrieben 16. Februar 2009 Autor Geschrieben 16. Februar 2009 Kennt sich von euch einer mit Poi Apache aus? Habe mir mal die Sachen runtergeladen, und die .jar- Dateien in mein Projekt geladen. Jedoch findet der einige Methoden nicht, die eigentlich im Paket drin sein sollten...also ich habe mir ein paar Beispiel-Files auf der Homepage mal angeschaut und sie versucht bei mir auszuführen. Beispieslweise ist die Methode write für die Klasse Workbook nicht bekannt. Meint ihr ich habe irgendwas vergessen einzufügen oder ist beim Entpacken was schief gegangen? Danke für die Hilfe! Zitieren
Schiller256 Geschrieben 16. Februar 2009 Geschrieben 16. Februar 2009 Vielleicht verwendest du die Klasse Workbook? Denn die kennt keine write Methode die ist nur im Interface Workbook bekannt. Due sollst dringend eine Blick in die API werfen. POI API Documentation Zitieren
IggeB Geschrieben 17. Februar 2009 Autor Geschrieben 17. Februar 2009 Die API ist natürlich goldwert.^^ Vielen Dank Zitieren
IggeB Geschrieben 17. Februar 2009 Autor Geschrieben 17. Februar 2009 so das Beschreiben der Datei klappt jetzt dank POI Apache Jedoch gibt es noch ein kleines Problem...die Zahlen, die ich in die Tabelle schreibe werden in Excel nicht als solche erkannt. Wenn ich auf eine Zahl klicke, erscheint sie oben in dieser Form: '1.453, also mit so einem Hochkommata vorne. Meine erste Vermutung war, dass das daran liegt, dass die Zahlen als String gespeichert werden cell.setCellType(Cell.CELL_TYPE_STRING); danach habe ich das gleiche mal mit CELL_TYPE_NUMERIC probiert, da kam jedoch wieder das gleiche heraus. Hat einer von euch ne Idee, woran das liegen könnte? MfG Zitieren
Schiller256 Geschrieben 17. Februar 2009 Geschrieben 17. Februar 2009 Was übergibst du denn der Zelle? Bzw von welchem Typ ist der Werte denn du in die Methode setCellValue schreibst? Denn je nachdem welche Methode du verwendest wird der CellType geändert. cell.setCellType(Cell.CELL_TYPE_STRING); //CellType wird auf CELL_TYPE_FORMULA gesetzt cell.setCellValue((double)2.0); cell.setCellType(Cell.CELL_TYPE_FORMULA); //jetzt wird der CellType auf CELL_TYPE_STRING gesetzt cell.setCellValue("2.0"); http://poi.apache.org/apidocs/org/apache/poi/ss/usermodel/Cell.html#setCellValue(java.lang.String) Zitieren
IggeB Geschrieben 17. Februar 2009 Autor Geschrieben 17. Februar 2009 ja danke! mit casten klappts. Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.