sTumPf84 Geschrieben 10. Februar 2009 Geschrieben 10. Februar 2009 Hallo, ich möchte ein paar Daten aus einer Datenbank auslesen und in ein Word-Dokument schreiben, das funktioniert auch bestens, jetz muss ich aber die Schriftart aller geraden und ungeraden Zeilen änden, d.h. oben soll ein Barcode stehen, und darunter die lesbare Bezeichnung(z.B in Ariel). Das ganze soll dann so angeordnet werden, dass ich das Dokument direkt ausdrucke (auf ein Label). Wie gesagt, das schreiben des Textes ist nicht das Problem, ich schaff es nicht bestimmte Zeilen direkt anzusprechen und zu verändern. Hier mein Code: Microsoft.Office.Interop.Word.ApplicationClass oMsWord = new Microsoft.Office.Interop.Word.ApplicationClass(); Microsoft.Office.Interop.Word.Documents oMsDocs = oMsWord.Documents; object oMissingValue = System.Reflection.Missing.Value; object oTemplateName = @"C:\Dokumente und Einstellungen\mslenk_022\Desktop\label.doc"; object oNewTemplate = false; object oDocType = 0; object oMakeDocVisible = true; Microsoft.Office.Interop.Word._Document oNewMsWordDoc; oNewMsWordDoc = oMsDocs.Add(ref oMissingValue, ref oNewTemplate, ref oDocType, ref oMakeDocVisible); if (oNewMsWordDoc.ProtectionType != Microsoft.Office.Interop.Word.WdProtectionType.wdNoProtection) oNewMsWordDoc.Unprotect(ref oMissingValue); object oBmkCounty = "0"; string[][] Labels = createLabels(); object oBookmark, oRange; for (int i = 0; i < Labels[0].Length - 3; i+=3) { oNewMsWordDoc.Bookmarks.Add("A" + i.ToString(), ref oMissingValue); oBookmark = "A" + i.ToString(); oNewMsWordDoc.Bookmarks.get_Item(ref oBookmark).Range.Font.Name = "IDAutomationHC39M"; oNewMsWordDoc.Bookmarks.get_Item(ref oBookmark).Range.Text = " " + Labels[0] + "\t" + Labels[0][i+1] + "\t" + Labels[0][i+2] + "\r\n"; oNewMsWordDoc.Bookmarks.Add("B" + i.ToString(), ref oMissingValue); oBookmark = "B" + i.ToString(); oNewMsWordDoc.Bookmarks.get_Item(ref oBookmark).Range.Font.Name = "Arial"; oNewMsWordDoc.Bookmarks.get_Item(ref oBookmark).Range.Text = "\t" + Labels[1] + "\t\t " + Labels[1][i + 1] + "\t\t " + Labels[1] + "\r\n"; } object oFileFormat = WdSaveFormat.wdFormatDocument; oNewMsWordDoc.SaveAs(ref oTemplateName, ref oFileFormat, ref oMissingValue, ref oMissingValue, ref oMissingValue, ref oMissingValue, ref oMissingValue, ref oMissingValue, ref oMissingValue, ref oMissingValue, ref oMissingValue, ref oMissingValue, ref oMissingValue, ref oMissingValue, ref oMissingValue, ref oMissingValue); object oSaveChanges = false; oNewMsWordDoc.Close(ref oSaveChanges, ref oMissingValue, ref oMissingValue); Marshal.ReleaseComObject(oNewMsWordDoc); Marshal.ReleaseComObject(oMsDocs); oMsWord.Quit(ref oSaveChanges, ref oMissingValue, ref oMissingValue); Marshal.ReleaseComObject(oMsWord); oMsWord = null; grobe Erklärung: erst sollen die drei Barcodes in das Word-Dokument geschrieben werden, und danach die Bezeichnung darunter, und das solange bis alle Zeilen der Datenbanktabelle in das Dokument geschrieben wurden. Danke im voraus. Zitieren
sTumPf84 Geschrieben 10. Februar 2009 Autor Geschrieben 10. Februar 2009 Nur um eventuelle Missverständnisse auszuschliessen, ich brauch eigentlich nur eine Information wie ich den Rangeparameter für Bookmarks erstelle. Ich weiß wieviele ASCII-Zeichen die Zeile hat, die ich in Word einfügen will, kann ich damit den Range-Parameter berechnen und wenn ja wie? habe mir das folgendermaßen vorgestellt: oNewMsWordDoc.Bookmark.Add(Name, ref oRange); oBookmark = Name; oNewMsWordDoc.Bookmark.get_Item(ref oBookmark).Range.Text = Text; oNewMsWordDoc.Bookmark.get_Item(ref oBookmark).Range.Font.Name = "Ariel"; Zitieren
sTumPf84 Geschrieben 10. Februar 2009 Autor Geschrieben 10. Februar 2009 Hat sich erledigt, habs anders hinbekommen. Falls es jemanden interressiert, hier der Code: oNewMsWordDocument.Application.Selection.Font.Name = "IDAutomationHC39M"; oNewMsWordDocument.Application.Selection.TypeText(Barcode); oNewMsWordDocument.Application.Selection.Font.Name = "Arial"; oNewMsWordDocument.Application.Selection.TypeText(Bezeichnung); Allerdings brauch ich für die Ausführung sehr lange und die Datenbank wird noch wachsen. Wenn also jemand eine Ahnung hat wie das ganze schneller funktioniert, bzw ich erst den Text als ganzes ins Dokument schreiben und danach bearbeiten kann, wäre ich für eine Info sehr dankbar. Zitieren
HJST1979 Geschrieben 10. Februar 2009 Geschrieben 10. Februar 2009 Hallo ich hatte vor einiger Zeit ähnliches Problem habe es über eine Tabelle gelöst und in der Datenbank steht RTF- Text (Richtextbox) Dim stText as String stText = getFeldInhalt stText = stText.Replace("`", "'") stText = DataFormats.Rtf .Item(Index1).Rows.Item(Index2).Cells.Item(Index3).Range.Text = stText oder was auch geht Dim stText as String stText = getFeldInhalt stText = stText.Replace("`", "'") stText = DataFormats.Rtf Clipboard.SetText(stText, TextDataFormat.Rtf) -> Markiere eine Zeile in Word, da weiß ich leider den Code grad nicht wdApplication.Selection.Paste() Was jetzt aber schneller bzw. langsamer ist weiß ich nicht. Übrigens du hast scheinbar den selben Familiennamen wie ich *G Gruß Hans-Jörg Stumpf Zitieren
f__hoernchen Geschrieben 3. Juni 2009 Geschrieben 3. Juni 2009 Hi, ich weiß zwar nicht, ob das Thema noch aktuell ist, aber einen Geschwindigkeitsgewinn kann man mittels Backgroundworker realisieren. Einfach mal Googlen oder hier MSDN Backgroundworker Grüße Daniel Zitieren
Guybrush Threepwood Geschrieben 3. Juni 2009 Geschrieben 3. Juni 2009 Das ändert nichts an der Geschwindigkeit Zitieren
f__hoernchen Geschrieben 3. Juni 2009 Geschrieben 3. Juni 2009 ... Wenn also jemand eine Ahnung hat wie das ganze schneller funktioniert, bzw ich erst den Text als ganzes ins Dokument schreiben und danach bearbeiten kann, wäre ich für eine Info sehr dankbar. Ist doch aber genau die Idee. Im vordergrund lässt er was weiß ich laufen und im Hintergrund ruft er die DB ab und befüllt das Doc und wenn dies geschehen ist aktiviert er Word. Zitieren
TDM Geschrieben 3. Juni 2009 Geschrieben 3. Juni 2009 Ist doch aber genau die Idee. Im vordergrund lässt er was weiß ich laufen und im Hintergrund ruft er die DB ab und befüllt das Doc und wenn dies geschehen ist aktiviert er Word. Warum nicht gleich asynchron?! Word anzeigen. Paar Zeilen aus der DB lesen. In Word schreiben. Paar Zeilen aus der DB lesen. In Word schreiben. Paar Zeilen aus der DB lesen. In Word schreiben. usw. Der Pirat meinte sicher, dass die Geschwindigkeit konstant bleibt (dauert immer noch genauso lange [wenn nicht sogar länger]), nur das Programm wird nicht blockiert... Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.