Excel Tabelle lesen und in neue Excel Tabelle einfügen

Genkin

Aktives Mitglied
Hallo, hätte zunächst eine allgemeine Frage.
Ist es möglich, in Java eine Excel einzulesen, bestimmte Zellen zu kopieren und in eine neue Excel Tabelle zu übertragen? Die neue Excel Tabelle soll immer den selben Aufbau haben und quasi am Besten als Vorlage in dem Programm integriert sein bzw. erstellt werden.

Würde gerne eine einfache GUI erstellen mit zwei Funktionen.

In der Ersten Funktion soll der Dateipfad der zu lesende Excel Tabelle ausgewählt und anschließend die benötigten Zellen eingelesen werden.

In der zweiten Funktion sollen dann die eingelesenen Werte quasi in die vorhandene Excel in die jeweils richtigen Zellen übertragen und gleichzeitig exportiert werden.

Wenn das geht, wie sähe da die Umsetzung aus? Wie lese ich ein bzw. wie erstelle ich die Tabelle mit den benötigten Werten?

Es geht um verschiedene Abteilungsbereiche in denen Abwesenheiten erfasst werden. Auch sollen die Abwesenheiten in Stunden gerechnet werden. Und das alles für das ganze Jahr.

Hoffe ihr habt alles verstanden, wenn nicht, einfach nachfragen.

Ich bedanke mich im Voraus.
 
Das geht in Java zwar (es gibt da eine Apache-Bibliothek, und Libre Office ist ja auch in Java geschrieben), hab das aber auch noch nie gemacht.

Was ich dagegen schön öfter gemacht habe: Ein Skript in VBA zu schreiben (MS Office-Skriptsprache). Die Aufgabe schreit eigentlich geradezu nach einem solchen Skript.
 
Danke erstmal für die rasche Antwort.

Ich kann mir darunter leider nichts vorstellen, habe null Erfahrung was VBA betrifft. Wie sähe da der Code aus? Oder meinst Du, ich soll das in Excel selber machen, für jede Zelle Befehle eingeben bzw. verknüpfen?
 
Schau mal in deiner Bearbeitungsleiste oben, ob du da etwas mit Entwicklertools findest. Wenn nicht, guckste hier:

In Excel (und Word, Powerpoint, Access, ...) kannst du recht ausgewachsene Programme schreiben und dir sogar Benutzeroberflächen dazu zusammenklicken.
Ich persönlich mag die Sprache VBA nicht besonders, aber sie ist sehr einfach und hat doch ein paar unschlagbare Vorteile.

Hier ein Beispiel (das kannst du 1:1 in den VBA-Editor kopieren und ausführen, gründer Pfeil oben)
Code:
Option Explicit

Public Sub Dateipfad()
    Dim s As String
    
    s = "C:\" 'Hier einen Standardpfad eintraagen
    
    With Application.FileDialog(msoFileDialogFilePicker)
        .AllowMultiSelect = False
        .InitialFileName = s
        .Title = "Bitte Datei auswählen..."
        If .Show = -1 Then
            MsgBox ("Pfad der ausgewählten Datei: " & .SelectedItems(1))
        Else
            Exit Sub
        End If
    End With
End Sub
 
Schau mal in deiner Bearbeitungsleiste oben, ob du da etwas mit Entwicklertools findest. Wenn nicht, guckste hier:

In Excel (und Word, Powerpoint, Access, ...) kannst du recht ausgewachsene Programme schreiben und dir sogar Benutzeroberflächen dazu zusammenklicken.
Ich persönlich mag die Sprache VBA nicht besonders, aber sie ist sehr einfach und hat doch ein paar unschlagbare Vorteile.

Hier ein Beispiel (das kannst du 1:1 in den VBA-Editor kopieren und ausführen, gründer Pfeil oben)
Code:
Option Explicit

Public Sub Dateipfad()
    Dim s As String
   
    s = "C:\" 'Hier einen Standardpfad eintraagen
   
    With Application.FileDialog(msoFileDialogFilePicker)
        .AllowMultiSelect = False
        .InitialFileName = s
        .Title = "Bitte Datei auswählen..."
        If .Show = -1 Then
            MsgBox ("Pfad der ausgewählten Datei: " & .SelectedItems(1))
        Else
            Exit Sub
        End If
    End With
End Sub


Dankeschön. Ich denke, es wird dann doch kein Java. Werde mich wohl in VBA reinhängen müssen, egal, schadet nicht.

Kannst Du mir sagen, wie ich Inhalte aus einer anderen Excel in die End-Tabelle (neue Excel-Datei?) übertragen kann?

Und wenn dieser Script fertig gestellt ist, läuft der Code beim öffnen der Excel automatisch, oder muss man per Hand nochmal „compilieren“ bzw. auf den grünen Pfeil?

Das alles soll möglichst automatisiert und im Hintergrund ablaufen.
 
Dankeschön. Ich denke, es wird dann doch kein Java. Werde mich wohl in VBA reinhängen müssen, egal, schadet nicht.
Nun, Java muß nicht unbedingt verkehrt sein. Es kommt halt auf sehr viele Dinge an: Von welcher Wissensbasis gehst du aus (schüttelst du größere Java-Programme aus dem Ärmel oder wäre Java auch eher neu), brauchst du einen Dämon, Dateiexporte, ...

Ich habe mir VBA vollständig selber beigebracht (bzw. mir mein Wissen dazu ergoogelt), habe allerdings davor schon eine Handvoll Programmiersprachen benutzt.

Und wenn dieser Script fertig gestellt ist, läuft der Code beim öffnen der Excel automatisch, oder muss man per Hand nochmal „compilieren“ bzw. auf den grünen Pfeil?

Naja, du mußt das Programm schon irgendwie "auslösen", das macht der grüne Pfeil. Kompilieren als solches mußt du nichts, VBA ist eine Interpretersprache.

Um ein Makro zu starten gibt es verschiedene Möglichkeiten: Beim Öffnen, speichern, schließen, ... einer Exceldatei, durch Aufruf aus einem anderen Makro, Du kannst auch Buttons zum Draufklicken in der Excel-Datei platzieren.

Kannst Du mir sagen, wie ich Inhalte aus einer anderen Excel in die End-Tabelle (neue Excel-Datei?) übertragen kann?
Ich strick mal rasch was zusammen, dauert aber einen Moment...
 
Also wenn es im Hintergrund laufen soll, dann wäre eine VBA Lösung aus meiner Sicht weniger gut.

Und Excel Dateien lesen / schreiben ist in Java kein Thema. Der Hinweis auf die Apache POI Library ist ja schon gekommen.
Wie eine Excel Datei prinzipiell gelesen und geschrieben wird findet sich z.B. unter https://www.mkyong.com/java/apache-poi-reading-and-writing-excel-file-in-java/

Aber viele Wege führen zum Ziel und Du musst Dir überlegen, welcher Weg für Dich der Richtige ist.
 
Hier ist noch ein kleines Beispielmakro:

Code:
Option Explicit

Public Sub exceldemo()
    Dim i As Integer
    Dim wb As Workbook

    With ThisWorkbook.Worksheets(1)
        'Tabelle zeichnen
        With .Range("A1:B4")
            With .Borders(xlInside)
                .LineStyle = xlContinuous
            End With
        End With
        With .Range("A1:C1")
            With .Borders(xlEdgeBottom)
                .LineStyle = xlContinuous
            End With
        End With
        
        'Spaltenköpfe
        With .Range("A1")
            .Value = "Spalte 1"
            .Font.Bold = True
        End With
        With .Range("B1")
            .Value = "Spalte 1"
            .Font.Italic = True
        End With
        With .Range("C1")
            .Value = "Spalte 1"
            .Font.Bold = True
            .Font.Italic = True
        End With
        
        'Zeilen schreiben
        i = 2
        Do While i <= 4
            .Range("A" & i).Value = "Zeile " & i - 1
            .Range("B" & i).Value = "Zeile " & i - 1
            .Range("C" & i).Value = "Zeile " & i - 1
            i = i + 1
        Loop
        
        'Neue Exceldatei öffnen
        Set wb = Workbooks.Add
        
        'Den Zellbereich mit der Tabelle kopieren
        .Range("A1:C4").Copy
        wb.Worksheets(1).Range("F10:H13").Insert
    End With
End Sub

Wenn du dich fragst, wie du da selber drauf kommst: Es gibt zwei ganz wesentliche Quellen dafür.
1. Der Makroeditor von MS Office.
Laß diesen einfach mal laufen, und ändere z.B. die Hintergrundfarbe einer Zelle. Dazu gleich noch eine Warnung: Ich habe in meinem Makro oben immer alles direkt addressiert, der Ausdruck ThisWorkbook.Worksheets(1).Range("A1") sollte eigentlich selbsterklärend sein.

Der Makrorecorder arbeitet aber mit dem Selection-Objekt, d.h. ich schreibe ThisWorkbook.Worksheets(1).Range("A1").value = 42, der Makrorecorder würde schreiben Selection.value = 42

Ich würde dir raten, ebenfalls die direkte Addressierung zu benutzen. Es ist einerseits umständlicher, immer erst etwas im Makro zu selektieren, andererseits kann es beim Debuggen auch umständlich werden herauszufinden, was sich jetzt hinter Selection verbirgt.

2. Nutze Google
Du findest zu VBA massenhaft Foreneinträge, auch auf Deutsch.
 
Ich danke dir vielmals für deine Mühe, dass bringt mich schonmal näher. Ich werde mich noch einlesen, habe allerdings an meiner Praktikumsstelle noch keinen Internetzugang am Rechner.

Das wird übrigens alles im Rahmen meines Pflichtpraktikums für die Uni gemacht. Habe deshalb auch kein Eclipse bzw. eine andere Entwicklerumgebung für Java drauf.

Ich weiß noch nicht, ob Java oder nur VBA. Am Jahresende sollen aus mehreren Tabelle Werte entnommen und in einem Jahresabschluss zusammengefasst werden.

Kannst Du mir bitte noch eine Sache beantworten? Undzwar seien die beiden Excel-Dateien im selben Pfad (separate Dateien) hinterlegt.
Wie kann ich nun aus Excel_Nr1 aus Zelle A1 (hat den Inhalt 1) den Inhalt nach z.B. D3 in Excel_Nr2 kopieren?
 
Habe deshalb auch kein Eclipse bzw. eine andere Entwicklerumgebung für Java drauf.
Das ist halt einer der Vorteile von VBA: Du brauchst nur Excel, das gibt es in den meisten Firmen.
Aber kneitzel muß ich da auch zustimmen: Wenn du einen Dämon brauchst (Programm, das die ganze Zeit im Hintergrund vor sich hindümpelt und auf irgendein Ereignis wartet) ist VBA eine weniger gute Idee und Java dann doch wieder besser. Deswegen überleg dir genau, wie du das aufziehen willst.

Wie kann ich nun aus Excel_Nr1 aus Zelle A1 (hat den Inhalt 1) den Inhalt nach z.B. D3 in Excel_Nr2 kopieren?
Schau dir mal den letzten Code, den ich gepostet habe, ganz in Ruhe an. Vor allem die letzten Zeilen.
 
Schau dir mal den letzten Code, den ich gepostet habe, ganz in Ruhe an. Vor allem die letzten Zeilen.

Da öffnest Du eine neue Tabelle und kopierst die Zellen in die Neue. Aber wird die Tabelle da nicht neu erzeugt? Wenn ich eine bereits vorhandene öffnen will, dann muss ich doch auch irgendwo den Pfad hinterlegen und dann sagen, dass genau die Datei geöffnet werden soll. Oder denk ich grad in die falsche Richtung was deinen Code angeht?
 
Nö..die neue Tabelle wird vorher erzeugt mit Workbooks.add. In der Objektvariable wb ist ein Workbook drin, ob du das jetzt neu erzeugt hast oder irgendwo geöffnet hast, ist egal.
 

Zurück
Oben