hallo,
c# ist neuland für mich und ich hab da auch gleich so meine probleme ....
...folgendes krieg ich einfach nicht hin:
mache eine mailmerge in c# vs03, soweit funktioniert alles, habe als datenquelle eine *.txt datei, ... läuft wunderbar.
zuerst öffne ich das doc-template
dann mach ich den opendatasource
dann execute ich record für record
und speicher das ganze ab
läuft super!
nur es wurde angefordert dass sich der dateiname der einzelnen serienbriefe aus datenfeldern der datenquelle zusammensetzt. nachdem ich ja mit opensource den inhalt sowieso angreife, dachte ich ich kann auch auf die datensätze zugreifen.
es gelang mir allerdings nicht. (bin glaub ich so ziemlich alle methoden durchgegangen)
gibts da eine möglichkeit elegant auf die daten zu kommen, oder muss ich den umweg gehn und die datei explizit nochmals einlesen??
falls wer eine lösung für mein problem hat, wäre ich sehr dankbar!
lg klaus.
Über die DataSource-Eigenschaft des MailMerge Objekts kommst Du an die Datenquelle (MailMergeDataSource-Objekt). Über die DataFields-Eiegenschaft von MailMergeDataSource kommst Du an die Feldinhalte der Datenquelle. Mit FindRecord kannst Du zu einem bestimmten Datensatz in der Datenquelle springen.
hallo! danke für die antwort, aber genau so hat es leider nicht geklappt, mein code beispiel:
public class SDEngine
{
public static void Main(string[] args)
{
SDEngine obj = new SDEngine();
DataCheck checker = new DataCheck();
if(checker.checkPath(ConfigurationSettings.AppSettings["TemplateDataPath"]) &&
checker.checkPath(ConfigurationSettings.AppSettings["DataSourcePath"])) obj.generateSerial();
}
Word.Application wrdApp;
Word._Document wrdDoc;
Object oMissing = System.Reflection.Missing.Value;
Object oFalse = false;
Object oTrue = true;
public void generateSerial()
{
wrdApp = new Word.Application();
wrdApp.Visible = true;
// pfad mus ref sein, also casting
object path = (object) @ConfigurationSettings.AppSettings["TemplateDataPath"];
// oeffnen der vorlage
wrdDoc = wrdApp.Documents.Open(ref path,ref oMissing,
ref oMissing,ref oMissing,ref oMissing,ref oMissing,ref oMissing,ref oMissing,ref oMissing,
ref oMissing,ref oMissing,ref oMissing,ref oMissing,ref oMissing,ref oMissing,ref oMissing);
wrdDoc.Select();
//connect der datenquelle
wrdDoc.MailMerge.OpenDataSource(ConfigurationSettings.AppSettings["DataSourcePath"],ref oMissing,
ref oMissing,ref oMissing,ref oMissing,ref oMissing,ref oMissing,ref oMissing,ref oMissing,
ref oMissing,ref oMissing,ref oMissing,ref oMissing,ref oMissing,ref oMissing,ref oMissing);
Word._Document wrdDocMerge;
wrdDoc.MailMerge.DataSource.FirstRecord=1;
wrdDoc.MailMerge.DataSource.LastRecord=1;
String str = wrdDoc.MailMerge.DataSource.DataFields
wrdDoc.MailMerge.Execute(ref oFalse);
wrdDocMerge = wrdApp.ActiveDocument;
wrdDocMerge.Select();
wrdApp.Visible = true;
path = (object) (@ConfigurationSettings.AppSettings["MergeTargetPath"] + str);
wrdDocMerge.SaveAs(ref path,ref oMissing,
ref oMissing,ref oMissing,ref oMissing,ref oMissing,ref oMissing,ref oMissing,ref oMissing,
ref oMissing,ref oMissing,ref oMissing,ref oMissing,ref oMissing,ref oMissing,ref oMissing);
wrdDocMerge.Saved = true;
wrdDocMerge.Close(ref oFalse,ref oMissing,ref oMissing);
wrdDocMerge = null;
wrdApp.Quit(ref oFalse, ref oMissing, ref oMissing);
}
}
wenn ich dann sage
String str = wrdDoc.MailMerge.DataSource.DataFields
werden mir keine sinnvollen datasource eigenschaften angeboten,
genauso gehts mir bei fieldnames.
entweder ich seh den wald vor lauter bäumen nicht, oder man kommt wirklich nicht wirklich hin - ich steh zumindest an.
danke für deine hilfe!
Das funktioniert einwandfrei:
int fieldIndex=2;
// Zum gewünschten Datensatz springen
bool found=wrdDoc.MailMerge.DataSource.FindRecord("Wert", "Feldname");
// Wenn der Datensatz gefunden wurde ...
if (found)
{
// Wert auslesen
string mailMergeCellValue=wrdDoc.MailMerge.DataSource.DataFields.Item(ref fieldIndex).Value;
// Wert anzeigen
MessageBox.Show(mailMergeCellValue);
}
hab das genauso wie du vorgeschlagen hast angewendet.
funktioniert leider nicht, ich bekomme bei der zeile:
string mailMergeCellValue = wrdDoc.MailMerge.DataSource.DataFields.Item(ref field).Value;
folgenden fehler:
Mircosoft.Office.Interop.Word.MailMergeFiedls does not contain a definition for 'Item'
Item wird auch beim schreiben der Zeile bei der Code-Completation NICHT vorgeschlagen. da hats irgendwas.
eingebuden hab ich using Word = Mircosoft.Office.Interop.Word
sollte eigentlich passen.
fällt dir noch was ein ??
danke für deine hilfe!
hab mir beim debug die values angesehn,
beim gewünschten "item"schreibt er mir als value "cannot view indexed property", hab zwar keine ahnung was das bedeutet, vielleicht ist es aber der grund für meine probleme?!
Ich hab nur das gute alte Word 2000. Das gibts keine Interop Assemblies dafür.
Probiers mal über den Indexer:
string mailMergeCellValue = wrdDoc.MailMerge.DataSource.DataFields[field].Value;
Es geht auf jeden Fall. Ich hab leider kein Word 2003, deshalb kann ich die Syntax nur erahnen. Durch einen Blick in den Objektbrowser solltest Du aber drauf kommen, wie es unter Word 2003 funktioniert.
schon ein stück weiter. objectbrowser gibt leider nicht viel her.
mit der zeile
string mailMergeCellValue = fields[1].Value;
komm ich jetzt auf den fehler:
property, indexer, or event 'this' is not supported by the language; try directly calling method mailmergedatafields.get_item(ref object)
schön und gut, die methode existiert leider nicht ....
mit MailMergeDataField mailMergeCellValue = fields.get_Item(ref fieldIndexer)
komm ich jetzt auf das value des gewünschten feldes.
einziges problem: ich komme nur auf die values vom ersten datensatz, habe mich mit dem activerecord propertyy gespielt, komme aber noch auf keinen trichter
Du kannst z.B. mit
... .ActiveRecord = WdMailMergeActiveRecord.wdNextRecord
zum nächsten Datensatz springen.
Oder Du verwendest FindRecord und suchst den gewünschten Datensatz (z.B. über einen Schlüsselwert, den Du in die datenquelle mit aufnimmst).
du bist meine rettung.
funktioniert wunderbar!
vielen dank und grüße aus dem verschwitzten wien (hab bei mir im büro 29,7 grad....)
lg klaus.
Gern geschehen.
Zum Glück haben wir eine Klimaanlage im Büro und können so einen kühlen Kopf behalten. 😉
noch ein kleiner nachruf:
es wäre wünschenswert den sql befehlt von der serienbriefvorlage die geöffnet wird zu übernehmen. wenn ich allerdings das dokument mit documents.open oder open2002, öffne, wird die datasourceverknüpfung der vorlage nicht übernommen.
wenn man die vorlage händisch startet wird am anfang gefragt ob er sich mit der datenquelle verbinden soll, das wird anscheinend beim programatischen start unterdrückt und die verbindung wird nicht eingegangen.
gibt es da einen zaubertrick um dieses sql statment beim öffnen zu übernehmen ??
antwort gefunden:
man muss den reg.key SQLSecurityCheck auf 00000000 setzen (in current user\software\microsoft\office\11.0\word\options
dann wird die abfrage ob man sich mit der datenquelle verbinden möchte automatisch bejat und unterdrückt.
dann klappt das 😉
lg