ich habe eine etwas "blöde" Anforderung bzgl Excel. Ich muss Daten aus der Java- Anwendung in excel ausgeben - das ist einfach und geht sehr gut.
Nachdem Excel am Client- Computer angezeigt wird, kann der User dort im Excel was ändern.
Nachdem er mit den Änderungen fertig ist. soll er einfach nur auf Speichern klicken und dann sollte schon der Pfad hinterlegt sein, wo das Dokument gespeichert wird und der Pfad sollte auch am Server vorgegeben bzw. bekannt sein.
Ziel ist es, dass der User das Excel File nicht lokal irgendwo hinspeichern muss, dann irgendwo in eine generelle public- Dokumentenablage ziehen muss sondern eben so einfach wie möglich - Excel öffnen, Excel bearbeiten und dann Excel speichern -> am Server ist der Pfad eben vorgegeben worden, wo das Excel gespeichert wird und kann angezeigt werden mittels Link.
wenn man den Link wieder klickt, geht das Excel wieder auf.
Mir ist jetzt nicht ganz klar, wie ich dem am Client geöffneten Excel einen Pfad hinterlegen kann, damit das Excel dort dan gespeichert wird.
Wenn dein JAva Programm eine Datei erstellt (Dann weiß du ja, wo diese erstellt wurde), sollte man via NIO auf Änderungen prüfen und bei jeder Änderung die Datei auf den Server übertragen.
Danke für die Antwort.
Das Problem ist ja, dass sich nach einem klick auf einen Link das Ecel am Client öffnet -> ich hab eine Web- Applikation die auf einem JBoss läuft und deshalb ist meinem verständnis nach das Excel für den Server nicht erreichbar, oder sehe ich das falsch. Ich was bis jetzt der Meinung, dass ich dem Excel nur alles mtgeben kann was es braucht (Speicherpfad use), da es sich dann am Client befindet und für den Server verloren ist.
Vielen Dank nochmal für die Antwort.
Eine Frage hätte ich noch - Excel erzeugen in Java ist mir klar.
Mein Use Case ist aber so, dass ich ein Excel- Template habe (mit Excel- Funktionen), und dass mit BusinessDaten befüllen will. Danach soll das Excel natürlich am Client geöffnet werden und die Excel Funktionen sollen auch vorhanden sein und funktionieren.
Funktion zum Erstellen eines Excels ist klar (Ausschnitt aus Spring MVC Example):
Java:
@OverrideprotectedvoidbuildExcelDocument(Map<String,Object> model,HSSFWorkbook workbook,HttpServletRequest request,HttpServletResponse response)throwsException{// get data model which is passed by the Spring containerList<Book> listBooks =(List<Book>) model.get("listBooks");// create a new Excel sheetHSSFSheet sheet = workbook.createSheet("Java Books");
sheet.setDefaultColumnWidth(30);// create style for header cellsCellStyle style = workbook.createCellStyle();Font font = workbook.createFont();
font.setFontName("Arial");
style.setFillForegroundColor(HSSFColor.BLUE.index);
style.setFillPattern(CellStyle.SOLID_FOREGROUND);
font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
font.setColor(HSSFColor.WHITE.index);
style.setFont(font);// create header rowHSSFRow header = sheet.createRow(0);
header.createCell(0).setCellValue("Book Title");
header.getCell(0).setCellStyle(style);
header.createCell(1).setCellValue("Author");
header.getCell(1).setCellStyle(style);
header.createCell(2).setCellValue("ISBN");
header.getCell(2).setCellStyle(style);
header.createCell(3).setCellValue("Published Date");
header.getCell(3).setCellStyle(style);
header.createCell(4).setCellValue("Price");
header.getCell(4).setCellStyle(style);// create data rowsint rowCount =1;for(Book aBook : listBooks){HSSFRow aRow = sheet.createRow(rowCount++);
aRow.createCell(0).setCellValue(aBook.getTitle());
aRow.createCell(1).setCellValue(aBook.getAuthor());
aRow.createCell(2).setCellValue(aBook.getIsbn());
aRow.createCell(3).setCellValue(aBook.getPublishedDate());
aRow.createCell(4).setCellValue(aBook.getPrice());}}
Kann ich in der Methode auch mein Excel- Template laden und befüllen? geht das überhaupt?
Also es ist besser, wenn du Templates bereits hast. Hier lassen sich Makros besser unterbingen ;D
Bei uns wird das so gemacht, dass eine XML + Template auf dem Client abgeladen wird und dann auf dem Client beides gemischt wird (VM Scripte). Aus dem WEB habe ich sowas noch nicht gemacht.
Theoretisch wäre es gut, wenn man nach dem Starten des Templates dieses anhand der vorhandenen Informationen die Businessdaten in einem seperaten Request downzuloaden. Und dann auf dem Client gemischt werden.
Bei der letzten Antwort hab ich jetzt nicht viel verstanden
So wäre der Ablauf bei mir:
Mein Template (mit den Makros usw.) liegt am Server -> wenn ein User einen Link klickt, dann möchte ich einfach das Template mit Daten befüllen (je nach eingeloggten user) und dann dem Client schicken.
Hast du sowas schon mal gemacht bzw. weißt du ob das so funktioniert?
Danke!
Serverseitig müsste man das mit apache Poi oder sowas machen.
Und das fertig an den Client übertragen. Wobei Du bei dieser Lösung stark von Apache Poi abhängig bist. Die vollen API Zugriff erhälst du natürlich mit .NET (VB, C# etc.). Ich würde daher die Möglichkeiten evaluieren, die du hast, um das "rendering" also die Businessdaten und dein Template auf dem Clientrechner zusammen zufügen.
Das bedeutet du benötigst 2 Dateien.
1. XML mit Businessdaten. Diese werden vor dem Download zusammengestellt und für den Server erreichbar abgelegt.
2. XLS mit Templateinformationen + Marcos.
2.1 Das Template bekommt auf dem Server eine eindeutige Information mit, damit die Businessdaten heruntergeladen werden können.
Du kannst nicht beide Dateien auf einmal übertragen. Das bedeutet, dass du das Template losschickst beim Klick auf den Link. Das Template muss eine "onLoad" Funktion haben, also ein Makro, dass ausgeführt wird, wenn man das Dokument öffnet. Dieses Makro downloadet mit einem seperaten Request die XML Businessdaten anhand der eindeutigen ID. Außerdem kannst du die XML Datei parsen und in die Felder im Dokument einfügen.
Gleichzeitig hast du weitere Makros im Template, die das Speichern umleiten in deine Funktion. Hier für das XLS serialisiert und an eine Schnttstelle auf den Server übertragen.
Wir haben dafür auch ein Freigegebenes Laufwerk. Hier werden die Dateien zentral abgelegt und in das System importiert. Bei uns ist das bissel einfacher, weil wir Thinclients direkt auf der Workstations der Sachbearbeiter nutzen und keine Webanwendungen.
Danke für die Antwort, ist schon sehr hilfreich, Auch wenn es beim mir jetzt an die Makro- Programmierung geht und ich eher weninger ahnung von VB PRogrammierung habe.
Ich frag mich jetzt noch, ob ich in das Template am Server nicht einfach die Daten hineinschreiben kann vor dem Download (nach einem Klick).
Die Makros sollen unangetastet bleiben, haben aber mit den in das Excel geschriebenen Daten nichts zu tun.
Ich find da leider gar nix im web.