OOP VBA in Java umsetzen

Basti4231

Bekanntes Mitglied
Hey Leute,

es gibt so ein VBA-Makro, was ein paar Dinger macht wie z.B. Seitenumbrüche, Kopfzeilen und so.
Das muss ich jetzt in Java umwandeln...

Ich lese eine .txt-Datei ein und da gibt es eine Zeile, die ".PRT99" enthält, nach dieser Zeile müsste ich einen Seitenumbruch machen. Ich verarbeite diese .txt-Datei bisher so, dass nacheinander die Zeilen in eine ArrayList<String> hinzugefügt werden und später dann geschrieben als .doc-Datei.

Mir fehlen noch die Kopfzeile mit der Seitenanzahl und die Seitenumbrüche nach dem Fund von .PRT99.
Wie ist das möglich, dies zu realisieren? Seitenumbruch geht ja schlecht mit "\n" und Kopfzeile weiß ich auch nicht, wie ich das machen soll.

Kann jemand helfen bitte?

Vielen Dank schonmal 🙂

lg Basti
 
Für die Zugriffe auf Microsoft Office Dokumente gibt es diverse gut dokumentierte APIs.
z.B. Apache POI Word API
Man kann aber auch mit Open Office und Java Worddokumente bearbeiten.
 
ich weiß ja nicht wie das vba script das macht, aber es wird bestimmt auf einem geöffneten dokument ausgeführt, oder?
mit java, bzw poi musst du dir dein dokument zur laufzeit erzeugen und mit den daten aus der txt füllen (wenn ich dir richtig verstanden habe!?).

POI-HWPF - A Quick Guide

da hast du dann auch zugriff auf den header etc.
 
Sicher, grundsätzlich kannst du hier "alles" posten. Nur, ob dir geholfen wird, ist generell davon abhängig wie viel Eigeninitiative du zeigst.
 
Ja ich versuche alles, was ich selber machen kann auch alleine. Aber Atze meinte ja nur, dass er nicht weiß, wie das Makro funktioniert und daher dachte ich, vielleicht möchte er was davon sehen:toll:
 
mit java word Datein schreiben = kein Spaß 🙂

Apache poi ist da auch nicht besonders gut... im grunde nicht fertig... bei excel ist das was anders

poste mal das VB Script.-..
 
ohne das makro zu kennen müsste es von der theorie her ja ungefähr so laufen:

Code:
while(nächsteZeile != null){
   if(!nächsteZeile.enthält(".PRT99")){
      dokument.setzeText(nächsteZeile);
   }
   else{
      dokument.erzeugeNeueSeite();
      dokument.setzeHeader("headertext");
   }
}
 
wie, gibts das nicht? 🙂 hab mit word noch nix gemacht, mit excel dokumenten lief das doch so. hab jetzt auch nicht in die doku geschaut, war geraten 🙂

edit:
hieß glaub ich workbook bei hssf
 
Ich hab mit hwpf auch erst einmal gearbeitet und ich weiß noch, dass ich ziehmlich entäuscht war, da ich mit hssf voher schon sehr gute Erfahrungen gemacht habe.
 
Ja HSSF macht voll Spaß^^, is auch recht leicht und gut zu handhaben.

Hier mal das Makro:

Java:
Sub D_Listen()
'
' D_Listen Makro
' Makro erstellt am 03.11.04 von Basti
' Suchen nach "D E L T A" evt. noch Suchkriterien einstellen
Selection.Find.ClearFormatting
    With Selection.Find
        .Text = "D E L T A"
        .Replacement.Text = ""
        .Forward = True
        .Wrap = wdFindContinue
        .Format = False
        .MatchCase = False
        .MatchWholeWord = False
        .MatchWildcards = False
        .MatchSoundsLike = False
        .MatchAllWordForms = False
    End With
Do
    ' hier die Schleife verlassen, wenn kein "D E L T A" gefunden
    If Not Selection.Find.Execute Then Exit Do
    Selection.HomeKey Unit:=wdLine  'zur ersten Zeilenposition
    Selection.MoveDown Unit:=wdLine, Count:=2, Extend:=wdExtend  'makiere die aktuelle und die nächste Zeile
    Selection.Delete Unit:=wdCharacter, Count:=1  'lösche die markierten Zeilen
Loop
    Selection.WholeStory
    Selection.Find.ClearFormatting
    With Selection.Font
        .Name = ""
        .Size = 9
    End With
    With ActiveDocument.Styles(wdStyleNormal).Font
        If .NameFarEast = .NameAscii Then
            .NameAscii = ""
        End If
        .NameFarEast = ""
    End With
    'With ActiveDocument.PageSetup
      '  .LineNumbering.Active = False
      '  .Orientation = wdOrientLandscape
      '  .TopMargin = CentimetersToPoints(2.03)
      '  .BottomMargin = CentimetersToPoints(2.03)
      '  .LeftMargin = CentimetersToPoints(2)
      '  .RightMargin = CentimetersToPoints(2.5)
      '  .Gutter = CentimetersToPoints(0)
      '  .HeaderDistance = CentimetersToPoints(1.27)
      '  .FooterDistance = CentimetersToPoints(1.27)
      '  .PageWidth = CentimetersToPoints(29.7)
      '  .PageHeight = CentimetersToPoints(21)
      '  .FirstPageTray = wdPrinterDefaultBin
      '  .OtherPagesTray = wdPrinterDefaultBin
      '  .SectionStart = wdSectionNewPage
      '  .OddAndEvenPagesHeaderFooter = False
       ' .DifferentFirstPageHeaderFooter = False
       ' .VerticalAlignment = wdAlignVerticalTop
      '  .SuppressEndnotes = False
      '  .MirrorMargins = False
      '  .TwoPagesOnOne = False
      '  .BookFoldPrinting = False
      '  .BookFoldRevPrinting = False
      '  .BookFoldPrintingSheets = 1
      '  .GutterPos = wdGutterPosLeft
    'End With
    Selection.HomeKey Unit:=wdStory 'Gehe zu Pos1
    Selection.Find.ClearFormatting  'Suchmenü öffnen
    With Selection.Find             'Optionen für das Suchen
        .Text = "PRT99"             'Suche Text "PRT99"
        .Replacement.Text = ""      'kein Ersetzen
        .Forward = True             'Suchrichtung vorwärts
        .Wrap = wdFindContinue      'Suche wird am Anfang fortgesetzt wenn das Ende erreicht wurde und nicht am Anfang begonnen wurde
        .Format = False             'keine Suche nach Formaten
        .MatchCase = False          'Groß- und Kleinschreibung wird nicht berücksichtigt
        .MatchWholeWord = False     'keine ganzen Worte
        .MatchWildcards = False     'keine Platzhalter verwenden
        .MatchSoundsLike = False    'keine ähnlichen Schreibweisen suchen
        .MatchAllWordForms = False  'keine andere Wortform suchen (z. B. sitzen wird gesucht aber auch sitzend oder gesessen gefunden.
    End With
Do
    ' hier die Schleife verlassen, wenn kein "PRT99" gefunden
    If Not Selection.Find.Execute Then Exit Do
    Selection.HomeKey Unit:=wdLine  'zur ersten Zeilenposition
    Selection.MoveDown Unit:=wdLine, Count:=1, Extend:=wdExtend  'markiere die aktuelle Zeile
    Selection.Delete Unit:=wdCharacter, Count:=1  'lösche die markierten Zeilen
    Selection.InsertBreak Type:=wdPageBreak ' Seitenumbruch
    Selection.MoveDown Unit:=wdLine, Count:=1 ' eine Zeile tiefer
Loop
    Selection.HomeKey Unit:=wdStory 'Gehe zu Pos1
    Selection.Find.ClearFormatting  'Suchmenü öffnen
    With Selection.Find             'Optionen für das Suchen
        .Text = "AEND??.\*"             'Suche Text "AEND??.*"
        .Replacement.Text = ""      'kein Ersetzen
        .Forward = True             'Suchrichtung vorwärts
        .Wrap = wdFindContinue      'Suche wird am Anfang fortgesetzt wenn das Ende erreicht wurde und nicht am Anfang begonnen wurde
        .Format = False             'keine Suche nach Formaten
        .MatchCase = False          'Groß- und Kleinschreibung wird nicht berücksichtigt
        .MatchWholeWord = False     'keine ganzen Worte
        .MatchWildcards = True      'Platzhalter verwenden
        .MatchSoundsLike = False    'keine ähnlichen Schreibweisen suchen
        .MatchAllWordForms = False  'keine andere Wortform suchen (z. B. sitzen wird gesucht aber auch sitzend oder gesessen gefunden.
    End With
Do
    ' hier die Schleife verlassen, wenn kein "AEND??" gefunden
    If Not Selection.Find.Execute Then Exit Do
    Selection.HomeKey Unit:=wdLine  'zur ersten Zeilenposition
    Selection.MoveDown Unit:=wdLine, Count:=1, Extend:=wdExtend  'makiere die aktuelle Zeile
    Selection.Delete Unit:=wdCharacter, Count:=1  'lösche die markierten Zeilen
Loop
  Selection.HomeKey Unit:=wdStory
Call Groesse(Selection.Font.Size)
  Selection.HomeKey Unit:=wdStory
Call Kopfzeile2
Call Umsetzung_Sonderzeichen_zu_Umlaute
Call Makro_Speichern4
MsgBox "Fertig"
End Sub

Sub Umsetzung_Sonderzeichen_zu_Umlaute()


        Selection.Find.Replacement.ClearFormatting
    With Selection.Find
        .Text = "|"
        .Replacement.Text = "ö"
        .Forward = True
        .Wrap = wdFindContinue
        .Format = False
        .MatchCase = True
        .MatchWholeWord = False
        .MatchWildcards = False
        .MatchSoundsLike = False
        .MatchAllWordForms = False
    End With
    Selection.Find.Execute Replace:=wdReplaceAll
'
    Selection.Find.ClearFormatting
    Selection.Find.Replacement.ClearFormatting
    With Selection.Find
        .Text = "\"
        .Replacement.Text = "Ö"
        .Forward = True
        .Wrap = wdFindContinue
        .Format = False
        .MatchCase = True
        .MatchWholeWord = False
        .MatchWildcards = False
        .MatchSoundsLike = False
        .MatchAllWordForms = False
    End With
    Selection.Find.Execute Replace:=wdReplaceAll
'
    Selection.Find.ClearFormatting
    Selection.Find.Replacement.ClearFormatting
    With Selection.Find
        .Text = "{"
        .Replacement.Text = "ä"
        .Forward = True
        .Wrap = wdFindContinue
        .Format = False
        .MatchCase = True
        .MatchWholeWord = False
        .MatchWildcards = False
        .MatchSoundsLike = False
        .MatchAllWordForms = False
    End With
    Selection.Find.Execute Replace:=wdReplaceAll
'
    Selection.Find.ClearFormatting
    Selection.Find.Replacement.ClearFormatting
    With Selection.Find
        .Text = "["
        .Replacement.Text = "Ä"
        .Forward = True
        .Wrap = wdFindContinue
        .Format = False
        .MatchCase = True
        .MatchWholeWord = False
        .MatchWildcards = False
        .MatchSoundsLike = False
        .MatchAllWordForms = False
    End With
    Selection.Find.Execute Replace:=wdReplaceAll
'
    Selection.Find.ClearFormatting
    Selection.Find.Replacement.ClearFormatting
    With Selection.Find
        .Text = "}"
        .Replacement.Text = "ü"
        .Forward = True
        .Wrap = wdFindContinue
        .Format = False
        .MatchCase = True
        .MatchWholeWord = False
        .MatchWildcards = False
        .MatchSoundsLike = False
        .MatchAllWordForms = False
    End With
    Selection.Find.Execute Replace:=wdReplaceAll
'
    Selection.Find.ClearFormatting
    Selection.Find.Replacement.ClearFormatting
    With Selection.Find
        .Text = "]"
        .Replacement.Text = "Ü"
        .Forward = True
        .Wrap = wdFindContinue
        .Format = False
        .MatchCase = True
        .MatchWholeWord = False
        .MatchWildcards = False
        .MatchSoundsLike = False
        .MatchAllWordForms = False
    End With
    Selection.Find.Execute Replace:=wdReplaceAll
'
    Selection.Find.ClearFormatting
    Selection.Find.Replacement.ClearFormatting
    With Selection.Find
        .Text = "~"
        .Replacement.Text = "ß"
        .Forward = True
        .Wrap = wdFindContinue
        .Format = False
        .MatchCase = True
        .MatchWholeWord = False
        .MatchWildcards = FalseMatchWholeWord
        .MatchSoundsLike = False
        .MatchAllWordForms = False
    End With
    Selection.Find.Execute Replace:=wdReplaceAll

'
End Sub
Sub Kopfzeile2()
'
' Kopfzeile2 Makro
' Makro aufgezeichnet am 20.04.2005 von Basti
'
    Selection.HomeKey Unit:=wdStory
    If ActiveWindow.View.SplitSpecial <> wdPaneNone Then
        ActiveWindow.Panes(2).Close
    End If
    If ActiveWindow.ActivePane.View.Type = wdNormalView Or ActiveWindow. _
        ActivePane.View.Type = wdOutlineView Then
        ActiveWindow.ActivePane.View.Type = wdPrintView
    End If
    ActiveWindow.ActivePane.View.SeekView = wdSeekCurrentPageHeader
    Selection.ParagraphFormat.Alignment = wdAlignParagraphCenter
    Selection.TypeText Text:="Seite: "
    Selection.Fields.Add Range:=Selection.Range, Type:=wdFieldPage
    Selection.TypeText Text:=vbTab & "Datum: "
    Selection.Fields.Add Range:=Selection.Range, Type:=wdFieldDate
    ActiveWindow.ActivePane.View.SeekView = wdSeekMainDocument
    ActiveWindow.ActivePane.View.Zoom.PageFit = wdPageFitTextFit
End Sub
Sub Groesse(s1)
'
' Groesse Makro
' Makro aufgezeichnet am 17.01.2007 von Basti
'
  Selection.WholeStory
  Selection.Font.Size = s1 – 2

Sub Makro_Speichern4()
Dim DocName As String
 Dim Pos As Integer
 Dim Pfad As String
  Dim Neu As Document
    Set Alt = ActiveDocument
    Documents.Add
    Set Neu = ActiveDocument
    Alt.Activate
    With Selection.Find
        .Text = "END UCOB-"
        .Replacement.Text = "ß"
        .Forward = True
        .Wrap = wdFindContinue
    End With
    Selection.Find.Execute
    Selection.HomeKey Unit:=wdLine
    Selection.EndKey Unit:=wdLine, Extend:=wdExtend
    Selection.Font.Size = Selection.Font.Size + 1
    Selection.Font.Size = Selection.Font.Size + 1
    Selection.Font.Size = Selection.Font.Size + 1
    Selection.Font.Size = Selection.Font.Size + 1
    Selection.Font.Color = wdColorRed
    Selection.Find.ClearFormatting
    Selection.MoveDown Unit:=wdLine, Count:=1, Extend:=wdExtend
    Selection.Copy
    Neu.Activate
    Selection.Paste
    Alt.Activate
         With Selection.Find
        .Text = "NUMBER OF"
        .Replacement.Text = "ß"
        .Forward = True
        .Wrap = wdFindContinue
    End With
    Selection.Find.Execute
    Selection.MoveDown Unit:=wdLine, Count:=3
    Selection.HomeKey Unit:=wdLine
    Selection.MoveDown Unit:=wdLine, Count:=3, Extend:=wdExtend
    Selection.Font.Size = Selection.Font.Size + 1
    Selection.Font.Size = Selection.Font.Size + 1
    Selection.Font.Size = Selection.Font.Size + 1
    Selection.Font.Color = wdColorRed
    Selection.MoveDown Unit:=wdLine, Count:=1, Extend:=wdExtend
    Selection.Copy
    Neu.Activate
    Selection.Paste
    Alt.Activate
    Selection.Find.Execute
    With Selection.Find
        .Text = "END LINK"
        .Replacement.Text = "ß"
        .Forward = True
        .Wrap = wdFindContinue
    End With
    Selection.Find.Execute
    Selection.HomeKey Unit:=wdLine
    Selection.EndKey Unit:=wdLine, Extend:=wdExtend
    Selection.Font.Size = Selection.Font.Size + 1
    Selection.Font.Size = Selection.Font.Size + 1
    Selection.Font.Size = Selection.Font.Size + 1
    Selection.Font.Size = Selection.Font.Size + 1
    Selection.Font.Color = wdColorRed
    Selection.Find.ClearFormatting
    Selection.MoveDown Unit:=wdLine, Count:=1, Extend:=wdExtend
    Selection.Copy
    Neu.Activate
    Selection.Paste
    Alt.Activate
    DocName = ActiveDocument.FullName            'DocName mit dem aktiven Dateinamen belegen
   Pos = InStrRev(DocName, ".")                 'Gehe zum Letzten . von Hinten.'
   DocName = Left(DocName, Pos - 1)               'Nehme ab dem . die folgenden 5 Zeichen in den Namen auf'
   DocName = DocName & ".doc"                   '.doc-Erweiterung anhängen

   ActiveDocument.SaveAs FileName:=DocName, FileFormat:=wdFormatDocument
   Neu.Activate
End Sub
 
Hey, wie mach ich des jetzt einen Zeilenumbruch und so?

Kann jemand mir mal ein bisschen Code zeigen, zum Thema Dokument erstellen und dort Text reinschreiben. Macht man doch mit FileWriter und dann den Pfad einfach ein .doc hinten dran oder?

Bisher mache ich es nämlich so, ich schreibe meine ArrayList in einer Schleife mit dem FileWriter in den Pfad, und hinten dran steht .doc. So komme ich an mein Word-Dokument, indem dann auch der Text drinsteht. Wie kann ich aber dann so Zeilenumbrüche in meiner Schreibenschleife machen??

lg basti
 
Ich verwende hier mit diesem Code die StandardBibliotheken, jetzt ohne Apache POI.

Und trotzdem kann ich Word-Docs erzeugen!

Probier doch mal das hier:

Java:
package testingAll;

import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;

public class DocProof {
    private static String pfad = "Test\Neu.doc";

    public static void createDoc(String pfad) {
        try {
            BufferedWriter writer = new BufferedWriter(new FileWriter(pfad));
            writer.write("Document is written.");
            writer.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {
        createDoc(pfad);
        System.out.println("fertig");
    }
}



Und gibts nicht irgendwo ein paar Code-Examples zu HWPF?
Das wäre sehr nützlich, dann könnte ich mir vielleicht, das was ich brauche, raussuchen.

lg Basti
 
Zuletzt bearbeitet:
was du da machst ist eine txt datei erzeugen und ihr die dateiendung doc geben...
öffne mal deine Datei mit dem Editor (der von Windows, der nix kann^^) und dann eine richtige doc datei, dann siehst du den unterschied
 
Hmm, wenn es so nicht geht mit POI, wäre es denn möglich über mein JavaProgramm das Makro in Word aufzurufen? Dann würd ich einfach den Teil, den das Makro erledigt, aufrufen und den Rest selber weitermachen.
 
Sorry, ich komm grad nich so weiter. Ich muss mir JACOB runterladen oder?
Und da heißt es dann ich müsste eine DLL dem Path hinzufügen, wie geht das? Also wie das mit dem CLASSPATH geht weiß ich, aber nicht mit Path.

Merci 🙂
 
Also ich weiß jetzt, wo die .dll hinmuss. Ich habe nur leider keine Rechte die dort hineinzukopieren (System32)

Was mach ich denn jetzt?

Und könnte jemand mal Beispielcode zeigen, damit ich das dann zu Hause noch probieren kann mit JACOB.

Also ich möchte einfach ein WordDokument öffnen und auf diesem dann mein Makro laufen lassen und danach weiter meinen JavaCode abarbeiten. Wie ungefähr würde der Code dazu aussehen? Wäre echt klasse, wenn einer mir helfen könnte, bin nämlich total verzweifelt zur Zeit 🙁

gruß basti
 
Zuletzt bearbeitet:
Nur weil System32 im PATH gesetzt ist muss man da nicht unbedingt die dll hinkopieren ;-)

PATH ist genause eine Umgebungsvariable wie CLASSPATH und kann in den Systemeigenschaften bearbeitet werden. unter XP war's Systemsteuerung --> System --> Erweitert --> Umgebungsvariablen

Wenn man das Programm per Batch startet könnt man auch darin die dll in PATH aufnehmen.
 
Ich habe halt auch keine Rechte die Umgebungsvariablen zu bearbeiten. Also kann ich da auch nix machen 🙁

Und wie würde der Code überhaupt aussehen? Das bräuchte ich, denn wenn es klappt, könnt ich bestimmt auch hier dafür sorgen, dass ich die nötigen Rechte bekommme. Vorher würde ich aber gerne auf Nummer sicher gehen und zu Hause heute dann einfach das ausprobieren. Also ein einfaches VBA-Makro aus Java aufrufen.

Vielen Dank..
 
wenn du dir die oberste Antwort in meinem Link durchliest, dann siehst du, dass du kein JACOB oder irgendeine DLL benötigst
 
1. hast du dir eigentlich die api oder die homepage schon angesehen?
2. Sei nicht so lästig! Du kannst noch 1000 mal fragen, ob jemand Beispielcode für dich, wenn noch niemand hier damit gearbeitet hat wird sich keiner für dich in die thematik einlesen!
 

Neue Themen


Zurück
Oben