Laden...

Word MailMerge Problem

Erstellt von dertroll vor 17 Jahren Letzter Beitrag vor 17 Jahren 6.221 Views
D
dertroll Themenstarter:in
13 Beiträge seit 2006
vor 17 Jahren
Word MailMerge Problem

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.

3.728 Beiträge seit 2005
vor 17 Jahren
Serienbriefdaten

Ü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.

D
dertroll Themenstarter:in
13 Beiträge seit 2006
vor 17 Jahren
MailMerge

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!

3.728 Beiträge seit 2005
vor 17 Jahren
Funktioniert einwandfrei

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);
}

D
dertroll Themenstarter:in
13 Beiträge seit 2006
vor 17 Jahren
serienbrief

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!

D
dertroll Themenstarter:in
13 Beiträge seit 2006
vor 17 Jahren
serienbrief

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?!

3.728 Beiträge seit 2005
vor 17 Jahren
Word 2000

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.

D
dertroll Themenstarter:in
13 Beiträge seit 2006
vor 17 Jahren
serienbrief

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 ....

D
dertroll Themenstarter:in
13 Beiträge seit 2006
vor 17 Jahren
geschafft

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

3.728 Beiträge seit 2005
vor 17 Jahren
Navigation

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).

D
dertroll Themenstarter:in
13 Beiträge seit 2006
vor 17 Jahren
super - danke

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.

3.728 Beiträge seit 2005
vor 17 Jahren
Gern geschehen

Gern geschehen.

Zum Glück haben wir eine Klimaanlage im Büro und können so einen kühlen Kopf behalten. 😉

D
dertroll Themenstarter:in
13 Beiträge seit 2006
vor 17 Jahren
nachruf

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 ??

D
dertroll Themenstarter:in
13 Beiträge seit 2006
vor 17 Jahren

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