Danke dir toeffi für die Aufklärung und nun der Grund warum ich es nicht kannte: Ich benutze sowohl auf Arbeit als auch Privat ausschließlich Visual Studio 2005 oder 2002 (letzteres stetig weniger...). Das Microsoft irgendwann mal ein paar sogenannte "Vorteile" von VB.Net auch in C# integrieren wollte, war mir bekannt. Nur schade, dass das den Einzug gefunden hat. In VB.Net habe ich bisher viel schlechtes und wenig gutes mit optionalen Parametern erlebt. Aber sei es drum. Bin jetzt wieder etwas schlauer, danke ....
Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden.
Du solltest ein Upgrade durchführen oder einen alternativen Browser verwenden.
Du solltest ein Upgrade durchführen oder einen alternativen Browser verwenden.
C# Word Dokument bearbeiten.
- Ersteller roker002
- Erstellt am
Ja seh ich mit den optionalen Parametern genauso, ist zwar ein nettes Feature, aber man liest in jedem CleanCode Buch das optionale Parameter immer ein Zeichen für Unsicherheit sind oder ähnliches. Aber naja das muss jeder selbst wissen, ich hab sie seit der Einführung nie benutzt.
- Registriert
- Dez. 2007
- Beiträge
- 2.075
Ja ich habe schon 3x2 5x2 versucht zu erstellen... aber ich bekomme immer nur 1x2 tabelle zurück. Bei den Tabellen fängt immer mit 1 an... keine Ahnung wieso... es ist wahrscheinlich weil es keine Nullte Zelle gibt, da es irgendwie unlogisch klingt.
Ich habe immer mit Rows.Count und Columns.Count die Anzahl der Spalten und Zeilen versucht zu ermitteln.
Ich habe immer mit Rows.Count und Columns.Count die Anzahl der Spalten und Zeilen versucht zu ermitteln.
Dann versuch doch mal folgendes:
statt:
einfach mal:
.. denn normalerweise wird jede Tabelle in einem Word Dokument in dieser Auflistung aufgeführt. Da du aber unabhängig von der eigentlichen Position eine neue Tabelle erstellen willst, würde ich nun mal diesen Schritt gehen. Vielleicht hat deine äußere Tabelle nur 1 Spalte und überschreibt somit die Angabe der Spaltenanzahl der neuen Tabelle. Ein Versuch wäre es wert. Das war letztenendes ein Tipp den ich mal beim Surfen im Netz gesehen habe. Sollte das nicht funktionieren, dann weiß ich auch nicht weiter...
Also viel Erfolg
Rossibaer
statt:
Code:
Adresse.Tables.Add(Adresse.Range, 2, 2, WdDefaultTableBehavior.wdWord9TableBehavior, missing);
einfach mal:
Code:
appWord.ActiveDocument.Tables.Add(Adresse.Range, 2, 2, WdDefaultTableBehavior.wdWord9TableBehavior, missing);
.. denn normalerweise wird jede Tabelle in einem Word Dokument in dieser Auflistung aufgeführt. Da du aber unabhängig von der eigentlichen Position eine neue Tabelle erstellen willst, würde ich nun mal diesen Schritt gehen. Vielleicht hat deine äußere Tabelle nur 1 Spalte und überschreibt somit die Angabe der Spaltenanzahl der neuen Tabelle. Ein Versuch wäre es wert. Das war letztenendes ein Tipp den ich mal beim Surfen im Netz gesehen habe. Sollte das nicht funktionieren, dann weiß ich auch nicht weiter...
Also viel Erfolg
Rossibaer
- Registriert
- Dez. 2007
- Beiträge
- 2.075
@Rossi, danke für den Vorschlag, aber die Lösung klappt nicht. Alle Tabellen mit NestedLevel 1 funktionieren ohne Probleme. Sobald eine innere Tabelle erstellt werden sollte, kann man es nicht mehr nachvollziehen, wieso es versagt.
- Registriert
- Dez. 2007
- Beiträge
- 2.075
es ist extrem schwer Word Interop zu verstehen. Ich habe versucht nach eine Tabelle neuen Text hinzuzufügen, aber der hat mir immer in den Range der Tabelle reingeschrieben, oder gar ganz am anfang. Dann habe ich mich erinnert dass bei MS sehr schwierig ist nach eine Tabelle irgendwas drunter zu schreiben, wenn man keine Leerzeichen oder Absatz gemacht hat. Fügt man die Tabelle vor dem Linebreak, so kann man drunter auch was schreiben.
Es ist auch nicht das einzige was bei mir nicht funktioniert. Ich habe mir eine eigene Klasse die von Dictionary erbt zusammengebastelt... damit ich mehr Kontrolle über die Einträge habe. Ich habe ja auch ein maximalen wert für die Anzahl der Einträge eingebaut. Wenn der Wert überstiegen wird, dann wird eine Exception geworfen. Auf einem Rechner ohne JIT will der auf einmal nicht funktionieren. Sonst läuft die Liste einwandfrei auf dem Dev.-PC.
Naja MS ist gut aber es gibt auch viel sch***e, die man ja nicht verstehen kann.
Es ist auch nicht das einzige was bei mir nicht funktioniert. Ich habe mir eine eigene Klasse die von Dictionary erbt zusammengebastelt... damit ich mehr Kontrolle über die Einträge habe. Ich habe ja auch ein maximalen wert für die Anzahl der Einträge eingebaut. Wenn der Wert überstiegen wird, dann wird eine Exception geworfen. Auf einem Rechner ohne JIT will der auf einmal nicht funktionieren. Sonst läuft die Liste einwandfrei auf dem Dev.-PC.
Naja MS ist gut aber es gibt auch viel sch***e, die man ja nicht verstehen kann.
So ganz werde ich nicht aus dem schlau was du geschrieben hast. Also JIT steht doch für "Just In Time". Meinst du etwa das auf einem Rechner kein .Net Framework installiert ist? Wenn ja dann installiere das. Oder meinst du das die Primary Interop Assemblies für Office auf dem Rechner nicht installiert sind? Wenn ja dann saug sie von MS und installiere sie. Bei VS2010 sollte es aber auch ohne gehen, da hier der Wrapper für die Office Objekte mit in die Assembly kompiliert werden sollte (laut einem Artikel bei MSDN) und somit die Interop Sachen nicht zusätzlich installiert werden müssen. Oder meintest du das die Exception für die Überschreitung des Maximal Wertes nicht auf dem Rechner ausgelöst wird? Dann ist die Frage ob der Test auch der gleiche ist wie beim Entwicklungsrechner, d.h. nicht nur die Testschritte sondern auch die Datenbasis, sodaß die Exception ausgelöst hätte werden sollen. Oder meinst du das die Assembly auf dem Rechner abstürzt und der Prozess unmittelbar verschwindet ohne eine gescheite Fehlermeldung zu bringen? Da könntest du den Standard Error Stream in eine Textdatei umleiten und hoffen das mehr Info drin steht als du bisher darüber hast. Das geht in dem du die Applikation nicht direkt über den Explorer o.ä. startest, sondern eine Batchdatei schreibst, ala
C:\MyApp.exe 2>C:\LogFile.txt
Dabei bin ich mir jedoch nicht sicher ob der Standard Error Stream die Nummer 1, 2 oder 3 hat. Am besten einfach mal durchtesten und schauen was geht. Alternativ kannst du das auch im Ausführen-Dialog angeben und brauchst nicht zwingend den Umweg über die Batchdatei.
Im übrigen kompilierst du auch die Assembly mit der richtigen .Net Framework Version des Zielrechners?
Wenn du die Assembly im .Net Reflektor analysierst, werden dann auch alle Referenzen der Assembly angezeigt oder ggfs. als fehlend markiert?
C:\MyApp.exe 2>C:\LogFile.txt
Dabei bin ich mir jedoch nicht sicher ob der Standard Error Stream die Nummer 1, 2 oder 3 hat. Am besten einfach mal durchtesten und schauen was geht. Alternativ kannst du das auch im Ausführen-Dialog angeben und brauchst nicht zwingend den Umweg über die Batchdatei.
Im übrigen kompilierst du auch die Assembly mit der richtigen .Net Framework Version des Zielrechners?
Wenn du die Assembly im .Net Reflektor analysierst, werden dann auch alle Referenzen der Assembly angezeigt oder ggfs. als fehlend markiert?
Zuletzt bearbeitet:
- Registriert
- Dez. 2007
- Beiträge
- 2.075
Irgendwie habe ich Unsinn geschrieben.
Also ich habe 3 Tabellen.
Die erste ist ganz Oben, danach soll die 2 und 3 drunter folgen. Ich hatte das Problem, sobald ich Range neu setze, d.H.:
Bei der letzte Zeile sollte der mir ja eigentlich die neue Range zurückgeben, was außerhalb der Tabelle liegt. Der tut das aber nicht. Ich bin immer noch mit rng im Tabellenbereich.
Wieso kann ich Range nicht neusetzen?
Also ich habe 3 Tabellen.
Die erste ist ganz Oben, danach soll die 2 und 3 drunter folgen. Ich hatte das Problem, sobald ich Range neu setze, d.H.:
Code:
Range rng = Doc.Range(x,y);
Table t = Doc.Tables.Add(rng, i,j , missing, missing);
rng = Doc.Range(t.Range.End + 1, t.Range.End + 1);
///rng = t.Range(t.Range.End + 1, t.Range.End + 1); Alternativer Code
Bei der letzte Zeile sollte der mir ja eigentlich die neue Range zurückgeben, was außerhalb der Tabelle liegt. Der tut das aber nicht. Ich bin immer noch mit rng im Tabellenbereich.
Wieso kann ich Range nicht neusetzen?
Zuletzt bearbeitet:
Wenn ich mich recht erinnere waren zwischen dem Ende des Ranges und dem tatsächlichen Ende der Tabelle nochmal 1 oder 2 Sonderzeichen die im Dokument nicht dargestellt werden, aber dazu führen das man beim Einfügen einer neuen Tabelle automatisch eine neue Zeile in der 1. Tabelle erstellt. Erst wenn man tatsächlich außerhalb des Bereiches (inkl. dieser Sonderzeichen) war, war es möglich eine neue Tabelle zu erstellen die nicht mit der 1. Tabelle verbunden war. Ich würde einfach mal statt nur 1 Position zu addieren mal 2, 3 ... Stellen hinzu addieren.Es hat mir immer geholfen, beim Debuggen sowohl VS als auch Word nebeneinander anzuzeigen, da ich so unmittelbar sehen konnte was Word mit meinen Anweisungen machte. Ggfs. musst du dafür die appWord.Visible Eigenschaft auf True setzen. Im übrigen kannst du Ranges auch direkt verschieben, in dem du die Start und Ende Position des Ranges änderst (die Eigenschaften sollten nicht nur ReadOnly sein). Sollte das nicht gehen, kannst du ja mal nach einer SetRange() o.ä. Methode schauen.
Ähnliche Themen
- Antworten
- 3
- Aufrufe
- 501
- Antworten
- 24
- Aufrufe
- 1.713
- Antworten
- 2
- Aufrufe
- 471
- Antworten
- 5
- Aufrufe
- 718