Moin René,
du solltest dir OpenXML anschauen.
Dort gibt es auch das OpenXML Productivity Tool zum download. Damit kannst du dir die Datei anschauen und herausfinden wie ein Rechteck innerhalb eines Arbeitsblattes gespeichert und auch mit einem Makro verknüpft wird.
Ich habe mal kurz so ein Arbeitsblatt nachgebastelt. Das sieht dann ungefähr so aus:
Shape shape1 = new Shape(){ Macro = "[0]!Test", TextLink = "" };
Und der zugehörige Xml - Teil:
<xdr:sp macro="[0]!Test" textlink="">
<xdr:nvSpPr>
<xdr:cNvPr id="2" name="Rechteck 1" />
<xdr:cNvSpPr />
</xdr:nvSpPr>
<xdr:spPr>
<a:xfrm>
<a:off x="666750" y="209550" />
<a:ext cx="542925" cy="200025" />
</a:xfrm>
<a:prstGeom prst="rect">
<a:avLst />
</a:prstGeom>
usw.
Gruß
muhtanten
Moin Paschulke,
ich hatte in meiner Anwendung die gleichen Probleme. Das einzige was zuverlässig funktionierte war nach dem document.Activate() folgender Code:
Process[] processes = Process.GetProcessesByName("WINWORD");
if (processes.Count() > 0)
{
AllowSetForegroundWindow(processes[0].MainWindowHandle);
System.Threading.Thread.Sleep(50);
SetForegroundWindow(processes[0].MainWindowHandle);
}
Gruß
muhtanten
Der Ordner enthält lediglich die Definition der Eigenschaft. Die eigentlichen Inhalte findest du dann in den Userproperties der Items dieses Ordners.
Die Items deines Folders 'mf' haben ein Userproperty 'Bezeichnung' mit dem entsprechenden Werten siehe auch UserDefinedProperty
Gruß
muhtanten
Moin,
das vorhandene Formular erweitern wird nicht funktionieren. Du kannst aber ein eigenes Formular entwerfen und dann als Kontakteformular anbieten. Entwerfen eines Outlook-Formularbereichs
Gruß
muhtanten
Moin habalulu,
was bedeutet funktioniert nicht? Kommt eine Fehlermeldung? Funktioniert das auslesen nicht oder funktioniert das schreiben des neuen Werts nicht?
Gruß
muhtanten
Moin Christel,
hast du mal versucht ' Application.DefaultSaveFormat' auf einen Leerstring zu setzen?
Gruß
muhtanten
wie wäre es mit TouchUp ?
Gruß
muhtanten
Moin WMenzel,
du kannst in Excel ein Makro aufzeichnen und dir dann anschauen wie VBA das machen würde. Den generierten Code kann man in der Regel einfach nach C# überführen.
Gruß
muhtanten
Moin m.grauber,
OpenXml ist für denen Anwendungsfall nicht geeignet, da du damit nur Dokumente bearbeiten kannst. Die Anwendung kannst du damit nicht steuern. Sonst ist Office - Automation schon das richtige Stichwort, unter dem du alles finden solltest.
Gruß
muhtanten
Moin zusammen,
ich habe mittlerweile das Problem gelöst:
Die Postfächer werden nun nicht mehr als zusätzliches Postfach eines Kontos geöffnet, sondern als weiteres eigenständiges Konto. Dann kann man über die Accounts-Auflistung iterieren und anhand der gegebenen EMail - Adresse den Account ausfindig machen. Zu dem Account kann man dann den DeliveryStore auslesen.
Danke und Gruß
muhtanten
Das Problem ist, dass Ich noch kein MailItem (oder in meinem Fall AppointmentItem) habe. Ich weiß zwar von welchem Postfach ich mir diese holen soll, aber ich weiß nicht hinter welchem Store sich welches Postfach befindet.
Moin zusammen,
über die Kontoeinstellungen kann man in Outlook zusätzliche Postfächer öffnen (siehe Bild) . Über die 'Stores' - Auflistung des NameSpace's kann man über diese Postfächer iterieren. Dort wird allerdings nur der DisplayName angeboten. Wie kann man die EMail - Adresse dieser Postfächer ermitteln?
Gruß
muhtanten
Moin,
schau mal was du mit deiner Zählervariable 'n' machst, wann du sie erhöhst und wann du sie benutzt.
Gruß
muhtanten
Moin Schweinebauch,
du meinst vermutlich die Einstellung unter Seite einrichten - Papier - Papierzufuhr erste Seite. Dort kann der Schacht für die erste Seite bestimmt werden.
Meine Herangehensweise wäre: Ein Makro aufzeichnen, während ich die Papierzufuhr auf den Standardschacht stelle (löschen wird nicht funktionieren, dort wird Word zumindest einen Standardwert erwarten). Anschließend kann dieses Makro normalerweise relativ einfach in C# - Code umgewandelt werden. Dann kannst du mit einer kleinen Anwendung jedes Dokument öffnen und die Einstellungen dort vornehmen.
Gruß
muhtanten
Moin xxpoddyxx,
beim abrufen der Zelle musst du auf die Angabe der Zeile verzichten, da der Range ja nur aus der einen ListRow besteht.
Des weiteren gibt die Value2 - Eigenschaft kein Range-Objekt zurück. Folgendermaßen kann es funktionieren:
string rolle = listRow.Range.Cells[1].Value2.ToString();
Gruß
muhtanten
Moin zaimen
mit den BusinessDataConnectivity Service kannst du Daten von externen Datenquellen in einer Sharepointliste darstellen. BDC
Gruß
muhtanten
Moin Stefan,
wenn du auf Listen zugreifen kannst, kannst du auch auf DocumentLibrarys zugreifen. Denn eine DocLib ist auch nur eine Liste.MSDN: DocLib
Moin cordell,
auch das Sheet hat eine Unprotect() Methode.
Worksheet sheet = Application.ActiveWorkbook.ActiveSheet;
sheet.Unprotect();
Gruß
muhtanten
Moin 23994,
mit OpenXML kannst du wahnsinnig schnell Dokumente bearbeiten. Mit dem Open XML SDK 2.0 Productivity Tool kannst du Quellcode generieren lassen der dir dann zeigt wie z.B. Shapes hinzugefügt werden können. Wenn du bei Interop bleiben möchtest, kannst du das mit Application.Screenupdating = false/true etwas beschleunigen.
Gruß
muhtanten
Moin zusammen,
wenn in einem Worddokument ausgeblendeter Text enthalten ist, kann dieses Dokument über die Sharepointsuche (mit dem ausgeblendeten Text als Suchbegriff) nicht gefunden werden. Kann man dieses Verhalten beeinflussen, oder ist das ein Feature das man hinnehmen muss?
Danke und Gruß
muhtanten
Moin tecla,
das kann schon funktionieren. Dein WordAddin kann aus einem beliebigen Range das WordXML auslesen. Daraus kann dann ein WordProcessingDocument erstellt werden.
Gruß
muhtanten
Moin CSharpProg,
Word ist einem sehr behilflich, wenn man solche Fragen hat. Du kannst dir z.B. ein Makro aufzeichnen um zu schauen wie Word das in VBA machen würde. Als zweites könntest du dir mit den Open XML SDK 2.0 Productivity Tool anschauen wie so ein fertiges Dokument von 'innen' ausschaut.
Gruß
muhtanten
Moin Ulf,
du solltest dir Office-Automation anschauen. Dort kannst du dann das Event Workbook.BeforeSave oder Workbook.BeforeClose registrieren.
Gruß
muhtanten
Moin dynatech,
die Fehlermeldung ist doch gar nicht so schlecht. Versuch mal deine Aufgabe als object und nicht als TaskItem zu übergeben.
Gruß
muhtanten
Moin Campy,
mit dem passenden Konstruktor geht das.
Gruß
muhtanten
Mit Automation aus der WinForms - Anwendung geht das, mit deinem AddIn nicht.
In der WinForms-Anwendung kopierts du beim Click auf den Button nichts in die Zwischenablage, sondern erzeugts dir eine neue WordInstanz. Dann kannst du mit der Methode Add(template) oder Open(Document) dein Dokument öffnen oder erzeugen. Mit diversen Methoden z.B. Application.Selection.InsertText oder wie auch immer sie heißen kannst du beliebigen Text (formatiert oder auch nicht) oder was auch immer hinzufügen. In deiner WinForms - Anwendung kannst du dich auf das Event Document.Close() registrieren und wenn der Anwender Das Dokument oder Word schließt kannst du dir den Text in Word schnappen und wieder in deiner Anwendung anzeigen lassen. Also Automation anstatt AddIn.
Gruß
muhtanten
Moin darkface,
ein AddIn ist für deinen UseCase wahrscheinlich nicht die beste Idee. Du solltest dich mit Word Automation beschäftigen
Word automatisieren
Gruß
muhtanten
Hallo BloodyFunFrog,
bist du dir sicher das es sich um InlineShapes handelt? InlineShapes kenne ich nur als Bilder o.ä. Textboxen kenn ich nur als Shapes. Bei Shapes kommt man dann mit
Shapes[i].TextFrame.TextRange
weiter.
Gruß
muhtanten
/EDIT/ sorry, meine Antwort war Quatsch 8o
Hallo Gogeta,
ich habe mir gestern mal die Mühe gemacht dein Problem nachzustellen. Also bei mir stand in fieldText " MERGEFIELD" mit einem führenden Leerzeichen. Das Trim() habe ich so eingefügt:
if (fieldText.Trim().StartsWith("MERGEFIELD"))
Wenn dein Code abgearbeitet wird, macht ein Update() keinen Sinn, da es dann keine Felder mehr gibt.
Die Zeilen:
if (fieldName == "Name")
{
myMergeField.Select();
WordDoc.Selection.TypeText(name_txt.Text);
}
überschreiben deine Felder. Wenn due dein Dokument öffnest und (bevor dein Programm läuft) alles markierst und F9 drückst sollte ebenfalls das gleiche passieren (die Beispieldaten verschwinden und es steht dort <<Name>>.
Was für eine Exception kommt denn?
Gruß
muhtanten
P.S.: OpenXML ist vollkommen genial um Office Dokumente zu bearbeiten!
Moin,
der Debugger könnte helfen!
Es ist nicht gut, wenn man Code kopiert, ohne ihn zu verstehen.
Dein fieldText fängt nicht mit "MERGEFIELD" an, sondern mit " MERGEFIELD"! Trim() an passender Stelle! Das Fields.Update() kannst du dir auch sparen, da nach der Methode keine zu aktualisierenden Felder mehr vorhanden sind.
Gruß
muhtanten
Moin Gogeta,
Felder werden, wenn ich mich recht entsinne nicht automatisch aktualisiert. Versuch mal nach dem setzen des Textes
ActiveDocument.Fields.Update()
Gruß
muhtanten
Moin Franz,
in diesem Fall bietet sich Office OpnXML an. Damit kannst du Office Dokumente erstellen und bearbeiten, ohne das Office installiert sein muss.
Gruß
muhtanten
Hallo chriscolm,
die ID ist vom Typ StringValue und du versuchst unterschiedliche Objekte zu vergleichen. Mit ID.Value sollte es funktionieren.
Gruß
muhtanten
Das muss aber ein verdammt altes Office sein.
Seit Office 2003 sollte man Word - Dokumente als docx abspeichern können. Das was ich bisher gepostet habe gilt alles erst für Office 2007 Dokumente. Also einfach alles vergessen 🙁
Gruß
muhtanten
Der Pfad zur DOCX - Datei wird dort erwartet.
So oder ähnlich könnte man anfangen:
using (WordprocessingDocument wpDoc = WordprocessingDocument.Open(openFileDialog1.FileName, true))
{
MainDocumentPart mainPart = wpDoc.MainDocumentPart;
foreach (Table tab in mainPart.Document.Body.Descendants<Table>())
{
foreach (TableRow row in tab.Descendants<TableRow>())
{
foreach (TableCell cell in row.Descendants<TableCell>())
{
TableCellProperties cellProps = cell.TableCellProperties;
if(cellProps.VerticalMerge != null)
MessageBox.Show("Ich bin Teil eines Verbundes");
}
}
}
Gruß
muhtanten
Bei Interop steh ich auf dem Schlauch. Ich habe gerade versucht das mit Interop zu reproduzieren, es gibt allerdings ComExceptions wenn man auf eine Zeile mit verbundenen Zellen zugreifen will.
Mit OpenXML ist es allerdings auch nicht wirklich trivial. Wenn das Dokument in Word geöffnet ist (Interop) kann es nicht gleichzeitig mit OpenXML geöffnet werden.
Du kannst einfach die Assembly DocumentFormat.OpenXml hinzufügen (zu finden im Internet?) und brauchst das SDK nicht unbedingt installieren.
Gruß
muhtanten
Hallo marcial187,
ich habe mir das gerade mal im OpenXML angeschaut. Die Zellen scheinen keine Höhe zu haben, sondern nur die Zeilen. (Macht ja eigentlich auch Sinn)
Im OpenXML enthalten die einzelnen Zellen die Information ob sie Teil eines Verbundes sind
<w:tc>
<w:tcPr>
<w:tcW w:w="6410" w:type="dxa" />
<w:vMerge />
</w:tcPr>
<w:p w:rsidR="00B44181" w:rsidRDefault="00B44181" />
</w:tc>
vMerge zeigt hier an, dass es sich um einen vertikalen Verbund handelt.
Gruß
muhtanten
Moin
am einfachsten ist es, wenn du dir ein Makro aufzeichnest und dann schaust was VBA daraus macht. Meistens, und auch in diesem Fall, ist dann der Weg zum C# Code relativ einfach.
Gruß
muhtanten
Moin,
mit GetSharedDefaultFolder kannst du Kalender anderer Personen öffnen für die du berechtigt bist.
Gruß
muhtanten
Wenn du ein Range hast (z.B. ThisDocument.Content) kannst du dort mit Tables.Add(...) eine Tabelle hinzufügen. Die Add - Methode gibt dir ein Tables-Objekt zurück. Damit kannst du dann die einzelnen Zellen befüllen:
z.B.
Tables tab = ...ThisDocument.Content.Tables.Add(...);
tab.Rows[1].Cells[1].Range.Text = "Hallo";
für die linke obere Zelle
Gruß
muhtanten
versuch mal Globals.ThisAddin.addRow()
Gruß muhtanten
Hallo Jörg,
pack die einzelnen Bereiche einfach in ContentControls, diese kannst du dann nach dem editieren relativ einfach identifizieren.
Gruß
muhtanten
Hallo c#starter
im Parameter 'sender' sollte die Textbox drin sein.
Gruß
muhtanten