AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

moderne Word-Anbindung

Ein Thema von baumina · begonnen am 17. Sep 2014 · letzter Beitrag vom 19. Sep 2014
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von baumina
baumina

Registriert seit: 5. Mai 2008
Ort: Oberschwaben
1.275 Beiträge
 
Delphi 11 Alexandria
 
#1

moderne Word-Anbindung

  Alt 17. Sep 2014, 16:29
Ich habe ein Adressverwaltungs-Programm (mySQL-Datenbank). Für eine Anbindung an Word fallen mir da unterschiedliche Vorgehensweisen ein, doch welche benutzen denn andere "moderne" Programme so? Im Moment fülle ich meine Daten in eine Access-Tabelle, die wiederum als Datenquelle für verschiedene Worddokumente (Serienbriefe) dient. Irgendwie gefällt mir das nimmer so gut. Einen Direktzugriff auf die mySQL-Datenbank möchte ich deswegen nicht, weil ich sonst auf jedem Rechner einen ODBC-Treiber installieren müsst und die Daten dann auch nicht so einfach als komplettes Adressfeld zu formatieren sind. Das Ersetzen von Platzhaltern innerhalb der Worddokumente erscheint mir auch nicht so prickelnd. Mein Chef hätte gern so ne Art Button "Kopiere Adresse in Worddokument", das angeblich andere Programme zur Verfügung stellen würden. Wie machen denn andere Programme das?
Hinter dir gehts abwärts und vor dir steil bergauf ! (Wolfgang Ambros)
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#2

AW: moderne Word-Anbindung

  Alt 17. Sep 2014, 17:53
Einen Direktzugriff auf die mySQL-Datenbank möchte ich deswegen nicht, weil ich sonst auf jedem Rechner einen ODBC-Treiber installieren müsst
Wie willst Du sonst an die DB-Daten kommen?
und die Daten dann auch nicht so einfach als komplettes Adressfeld zu formatieren sind.
??? Das kommt doch sehr auf Deine Daten an

Das Ersetzen von Platzhaltern innerhalb der Worddokumente erscheint mir auch nicht so prickelnd.
Das kommt jetzt darauf an, was Du unter Platzhalter verstehst, Ich nutze gerne Textmarken. Allerdings muß man für Daten in Kopf- und Fußzeile auch Referenzfelder nutzen.

Mein Chef hätte gern so ne Art Button "Kopiere Adresse in Worddokument", das angeblich andere Programme zur Verfügung stellen würden. Wie machen denn andere Programme das?
WO hätte er denn gerne diesen Button?

Nichts für ungut, aber diese Ansprüche sind immer kurz vor "ich hab mir das so gedacht".
"Haben Sie das auch gesagt?"
"Wieso reicht Denken nicht?"

Gruß
K-H

P.S.
Es gibt solch "andere" Programme z.B. für die Rechnungserstellung, da wird dann einfach der Text in einem TRichedit zusammen gesetzt.

PPs.
vielleicht schaust Du hier mal rein scheint interessant zu sein, hab ich aber nicht intensiv verfolgt.
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector

Geändert von p80286 (17. Sep 2014 um 18:14 Uhr)
  Mit Zitat antworten Zitat
pelzig
(Gast)

n/a Beiträge
 
#3

AW: moderne Word-Anbindung

  Alt 17. Sep 2014, 18:22
Ist schon sehr lange her, aber in den guten alten Zeiten konnte man Word eine CSV-Datei als Datenquelle für Serienbriefe unterjubeln.

Die tatsächliche Datenbank hatte z.B. ein Feld "Geschlecht" und machte daraus zusätzlich in der exportierten CSV ein "Anrede" um in der Word-Dokumentvorlage ein "WennDannSonst" zu umschiffen.

War natürlich ein elendes Gefrickel in Delphi und ging damals schon über Access/Exel deutlich einfacher

Der Kunde wollte aber unbedingt dBase III und hat dafür auch bezahlen müssen
Im Datenbankprogramm war der Button [Word-Serienbrief an markierte Empfänger].

MfG aus dem letzten Jahrtausend
  Mit Zitat antworten Zitat
Lemmy

Registriert seit: 8. Jun 2002
Ort: Berglen
2.387 Beiträge
 
Delphi 10.4 Sydney
 
#4

AW: moderne Word-Anbindung

  Alt 17. Sep 2014, 18:44
Hi,

Text suchen und ersetzen ist wirklich nicht prickelnd, aber Du kannst über OLE-Automation und Bookmarks (Textmarken) an definierte Stellen springen und dort Text einfügen (geht im übrigen auch genauso einfach mit OpenOffice/LibreOffice).

Einen "Kopiere Adresse" ist einfach zu implementieren - einfach das Zeugs in die Zwischenablage einfügen, dann kann der Chef das manuell in Word einfügen. Ist aber sicher nicht das was er gerne möchte

Dann kannst Du noch versuchen, das neue Word-Format direkt zu schreiben. Ist sicherlich nicht ganz angenehm. Und zum Schluss: Verwende eine gute RichEdit Komponente, damit kannst Du dann eine Textverarbeitung direkt in dein Programm "integrieren"...

Grüße
  Mit Zitat antworten Zitat
pelzig
(Gast)

n/a Beiträge
 
#5

AW: moderne Word-Anbindung

  Alt 17. Sep 2014, 19:14
Und zum Schluss: Verwende eine gute RichEdit Komponente, damit kannst Du dann eine Textverarbeitung direkt in dein Programm "integrieren"...

Grüße
Sehr richtig! Die "gute RichEdit Komponente" sollte vor Allem mit Tabellen klarkommen!

Manche (meiner damals entscheidungsbefugten) Abteilungsleiter konnten nur Excel-Tabellen, für Word-Serienbriefe hatten sie SekretärInnen.

Abteilungsleiter sind beliebig austauschbar, SekretärInnen eher nicht!!!

Edith bestreitet ausdrücklich, daß sie jemals direkt für die Druckerei von Formularen für Steuerberater gearbeitet hat!

MfG

Geändert von pelzig (17. Sep 2014 um 19:31 Uhr)
  Mit Zitat antworten Zitat
Dejan Vu
(Gast)

n/a Beiträge
 
#6

AW: moderne Word-Anbindung

  Alt 17. Sep 2014, 20:15
Also ich weiß jetzt nicht, wo das Problem besteht, die Steuerdatei für die Serienbrieffunktion zu erstellen und diese Funktion über OLE aufzurufen. In der Bankensoftware, die gerade hier entwickelt wird/wurde, wird das auch so gemacht. Die Datei wird dann abgespeichert und ausgedruckt (Kreditvertrag).

Ob ich das per OLE Replace mache, oder per Serienbrieffunktion mit Temp-Datei ist doch Jacke wie Hose. Ich kann ja auch meine Serienbrieffelder so wählen, das die Logik im Programm bleibt, d.h. überhaupt keine Makros in Word ausgeführt werden müssen.
  Mit Zitat antworten Zitat
punktl

Registriert seit: 6. Sep 2006
Ort: Dippoldiswalde
8 Beiträge
 
Delphi 10.4 Sydney
 
#7

AW: moderne Word-Anbindung

  Alt 17. Sep 2014, 18:47
In meinen Anwendungen gibt es einen Menüpunkt "Seriendruck Word" bzw. "Datenexport Word". Da erstelle ich einfach eine .csv-Datei, welche entsprechend für die Nutzer dokumentiert ist und als Seriendruckquelle genutzt wird. Für die - überall vorkommenden - DAU's sind dann noch entsprechende Makros in Word hinterlegt.
Für relativ feststehende Dokumente, die aber anschließend in Word noch bearbeitet werden sollen, verwende ich oft die ekRtf-Komponente (http://www.code.net.ru/). Gibts bei torry.net frei, ich habe jedoch die paar Euro für den Quelltext bezahlt. Funktioniert anstandslos beides hier mit Word 2002, 2007, 2010 und 2013.
Natürlich bleibt dir immer noch die OLE-Automation. Da empfehle ich das Studium von Deborah Pate's Seiten (http://www.djpate.freeserve.co.uk/Automation.htm).

Viele Grüße

Punktl
Peter
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#8

AW: moderne Word-Anbindung

  Alt 17. Sep 2014, 19:04
Um eine Adresse in Word einzufügen nimmt man eine DLL, die die Adresse von wo auch immer holt (MySQL, Adressverwaltung, ...) und an das Makro zurückliefert. Das Makro fügt diese Adresse dann z.B. an der aktuellen Adresse ein.
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Benutzerbild von baumina
baumina

Registriert seit: 5. Mai 2008
Ort: Oberschwaben
1.275 Beiträge
 
Delphi 11 Alexandria
 
#9

AW: moderne Word-Anbindung

  Alt 18. Sep 2014, 08:02
Wie ich oben schon kurz geschrieben habe, ist meine momentane Vorgehensweise folgendermaßen:

In meinem Adressprogramm kann ich auswählen, welche Adressen entladen werden sollen. Diese werden in eine (vom Anwender auswählbare) Accesstabelle geschrieben, die wiederum als Datenquelle in verschiedenen Worddokumenten hinterlegt ist.

Doch wie ein Anwender halt so ist, er öffnet ein Worddokument mit hinterlegter Serienbrieffunktion, sucht sich dort aus den Serienbrief-Daten eine Adresse her und meckert mich dann an, warum das denn noch die alte Adresse sei, er hätte ja schließlich gerade eben im Adressprogramm die neue Adresse eingegeben. Oder das Worddokument ist mit der "falschen" Datenquelle verbunden; leider sieht man im Word nicht so einfach von welcher Datenquelle denn nun die Daten kommen.

Da es irgendwie nichts "moderneres" gibt, bin ich jetzt am überlegen, ob ich nicht immer parallel zu meiner Datenbank eine Accesstabelle mit allen Adressen führe und aktuell halte. Für einen Rundbrief à la Weihnachtspost lasse ich die Funktion zum Entladen ausgewählter Adressen so wie sie ist.
Hinter dir gehts abwärts und vor dir steil bergauf ! (Wolfgang Ambros)

Geändert von baumina (18. Sep 2014 um 08:53 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Smiley
Smiley

Registriert seit: 9. Dez 2004
Ort: Gedern
210 Beiträge
 
Delphi 12 Athens
 
#10

AW: moderne Word-Anbindung

  Alt 18. Sep 2014, 09:32
Ich habe schon mal eine Applikation geschrieben die Word Automation benutzt und Daten aus einer DB in Word einsetzt.
Die Word Dokumente enthalten Platzhalter mit #Platzhaltername# gekennzeichnet.
Somit kann man beliebige Platzhalter definieren und benötigt keine Serienbrieffunktion von Word.

Ich habe die "Microsoft Office 2000 Beispiele..." unter "Packages installieren" aktiviert und arbeite mit dem Word200 OLE Objekt, das funktioniert auch mit Word2013.

Hier einige Code-Auszüge:
Code:
//******************************************************************************
//***************** Word öffnen ************************************************
//******************************************************************************
Procedure ConnectToWord(sichtbar: Boolean);
Var
  wFalse, TempFile: OleVariant;
  Ziel, Dateiname: String;

Begin
  wFalse := False;
  { Check if file exists }
  If Not FileExists(Filename) Then
    Begin
      ShowMessage('Das Dokument ist nicht vorhanden');
      Exit;
    End;

  With Form1 Do
    Begin

      Try
        If (Not aktiv('Word.Application')) Then
          Begin
            WordOpen := False;
          End;
        WordApplication1.Connect;
      Except
        Showmessage('Word konnte nicht gestartet werden');
        exit;
      End;
      If WordOpen Then
        WordDocument1.Close(wFalse);

      If Aendern Then
        Begin
          // Kopie von Worddatei anlegen und damit arbeiten bei Replace
          Dateiname := FrmVerwaltungBriefe.BGrid.Cells[2, StrToInt(BriefIndex)];
          Ziel := AppPath + '$TempDoc.doc';
          Tools.CopyFile(Dateiname, Ziel);
          TempFile := Ziel;
          WordApplication1.Documents.OpenOld(TempFile, wFalse, wFalse, wFalse,
            EmptyParam, EmptyParam, wFalse, EmptyParam, EmptyParam, EmptyParam);
        End
      Else
        // Wenn 'Brief laden' aufgerufen wurde, dann mit Orginaldatei arbeiten
        WordApplication1.Documents.OpenOld(FileName, wFalse, wFalse, wFalse,
          EmptyParam, EmptyParam, wFalse, EmptyParam, EmptyParam, EmptyParam);

      WordDocument1.ConnectTo(WordApplication1.ActiveDocument);
      WordApplication1.Visible := sichtbar;
      WordOpen := True;
      //WordApplication1.Activate;
    End;

End;

//******************************************************************************
//***************** Word Beenden ***********************************************
//******************************************************************************
Procedure WordBeenden;
Begin
  With Form1 Do
    Begin
      If WordOpen Then
        Begin
          Try
            WordApplication1.Quit;
            WordApplication1.Disconnect;
          Except
          End;
        End;
    End;
End;

//******************************************************************************
//***************** Word Replace Funktion **************************************
//******************************************************************************
{
  Diese Funktion startet eine Word versteckte Instanz, öffnet eine Datei und
  ersetzt (alle) Vorkommen von "SearchString" durch "ReplaceString".
  Die Funktion ist ähnlich zur StringReplace() Funktion.
}

Procedure Word_StringReplace(SearchString, ReplaceString: String; ReplaceAll: Boolean);
Const
  wdFindContinue = 1;
  wdReplaceOne = 1;
  wdReplaceAll = 2;
Var
  _Search, _Replace, _Wrap, _ReplaceAll, F, T: OLEVariant;

Begin
//  Application.ProcessMessages;
 { Initialisiere Parameter}
  If ReplaceAll Then
    _ReplaceAll := wdReplaceAll
  Else
    _ReplaceAll := wdReplaceOne;

  _Search := SearchString;
  _Replace := ReplaceString;
  _Wrap := wdFindContinue;
  F := False;
  T := True;
  { Perform the search}
  //FindText,Case,WholeWord,WildChars,SoundsLike,AllWordForms,Forward,Wrap,ReplaceWith,ReplaceTyp
  Form1.WordApplication1.Selection.Find.ExecuteOld(
    _Search, F, T, F, F, F, T, _Wrap, F, _Replace, _ReplaceAll);
//  Application.ProcessMessages;
End;

//******************************************************************************
//**********************        Formulare       *******************************
//******************************************************************************

//******************************************************************************
//********************** Replace Brief ausgeben ********************************
//******************************************************************************
Procedure BriefReplace;
Var
  i: Integer;

Begin
//  Application.ProcessMessages;

  Word_StringReplace('#Adr_Anrede#', Form1.QKundenAnrede.Text, True);
  Word_StringReplace('#Adr_Vorname#', Form1.QKundenVorname.Text, True);
  Word_StringReplace('#Adr_Name#', Form1.QKundenName.Text, True);
  Word_StringReplace('#Adr_Strasse#', Form1.QKundenStrasse.Text, True);
  Word_StringReplace('#Adr_PLZ#', Form1.QKundenPLZ.Text, True);
  Word_StringReplace('#Adr_Ort#', Form1.QKundenOrt.Text, True);
  Word_StringReplace('#GebDatum#', Form1.QKundenGebDatum.Text, True);

  For i := 1 To FrmFelder.Grid.RowCount - 1 Do
    Begin
      Word_StringReplace('#' + WordFeld[i].Name + '#', WordFeld[i].Text, True);
    End;

  Application.ProcessMessages;
End;
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:32 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz