Word aktuelle Zeile abrufen



  • Hallo,

    ich stehe grad total auf dem Schlauch.
    Zunächst exportiere ich meine Daten in ein Worddokument.
    Dies können aber teilweise sehr viele Daten sein, so dass evtl. ein Zeilenumbruch nötig sein wird.

    Nun möchte ich, nach jedem Datensatz der in Word eingefügt wird die aktuelle Zeile bzw. Cursor-Position herausfinden.

    Wie kann ich dies anstellen??
    Ich finde leider nichts, so dass in einfach auf einen Integer vergleichen könnte. Also wenn aktuelleZeile == 44 dann mach mir einen Zeilenumbruch.

    Kann mir bitte jemand helfen?? Danke!!



  • Was genau möchtest du machen? 😕
    - Nur reinen ASCII-Text nach Word bringen?
    - Oder auch zwischen Word und dem Programm interagieren?

    Am einfachsten erstellst du eine Textdatei (*.txt) und übergibst die mit dem Aufruf von WORD.

    string Pfad  = "c:\windword.exe";  //oder so ähnlich
          string Datei = "meineDatei.txt";
    
          try
          {
              Process proc = new Process();
              proc.StartInfo.FileName  = Pfad;
              proc.StartInfo.Arguments = Datei;
              proc.StartInfo.WorkingDirectory = Directory.GetCurrentDirectory();
              proc.Start();
          }
          catch (Exception ex)
          {
              MessageBox.Show("Fehler", ex.Message +
                              "\nPfad    " + Pfad +
                              "\nDatei   " + Datei +
                              "");
              return;
          }
    


  • Der Export funktioniert soweit bereits:

    Word.Application oWord = null;
    Word.Document oDoc = null;
    Word.Documents oDocs = oWord.Documents;
    Word.Bookmarks oBookmarks = null;
    object fileName = "D:\Vorlagen\Bestellung.doc";
    object readOnly = false;
    object isVisible = true;
    object oMissing = Type.Missing;
    oDoc = oDocs.Open(ref fileName, ref oMissing, false, ref oMissing, ref oMissing, ref oMissing, ref oMissing, ref oMissing, ref oMissing,
                      ref oMissing, ref oMissing, ref oMissing);
    oBookmarks = oDoc.Bookmarks;
    
    Word.Range wrdRng = oDoc.Bookmarks.Item(ref oEndOfDoc).Range;
    
    // rows = Anzahl Zeilen aus DataGridView
    // 5 = Anzahl Spalten
    Word.Table oTable = oDoc.Tables.Add(wrdRng, rows, 5, ref oMissing, ref oMissing);
    
    // Überschrift der Tabelle.
    oTable.Cell(1, 1).Range.Text = "Datum";
    oTable.Cell(1, 2).Range.Text = "Nummer";
    //...
    
    for (int r = 0; r < dg.Rows.Count; r++)
    {
    	oTable.Cell(j, 1).Range.Text = dg["Datum", r].Value.ToString();
    	oTable.Cell(j, 2).Range.Text = dg["Nummer", r].Value.ToString();
    	// ...
    	oTable.Cell(j, 5).Range.Text = dg["Gesamtpreis", r].Value.ToString();
    	// ...
    
    	// Nachdem eine Zeile des DataGridView in die Word Tabelle geschrieben wurde,
    	// würde ich an dieser Stelle nun gerne wissen, in welcher Zeile des Worddokuments mein 
    	// Cursor steht
    	// So dass, falls es schon sehr weit unten ist, der nächste Datensatz auf die nächste
    	// Seite geschrieben werden kann und auf der noch aktuellen Seite die Zwischensumme
    	// angezeigt werden kann.
    
    }
    

    Ich hoffe, dadruch wird verständlicher was ich machen möchte??



  • Versuche ich z.B. so die Zeilennummer zu erhalten:

    int iZeile = oWord.Selection.Information(WdInformation.wdFirstCharacterLineNumber);
    

    kommt die Fehlermeldung Die indizierte Eigenschaft "Word.Selection.Information" besitzt nicht optionale Argument, die bereitgestellt werden müssen
    Leider verstehe ich das nicht ganz bzw. weiß auch nicht wie ich das beheben kann 😕



  • Ich habe nochmals versucht mir Gedanken zu machen.

    Dieser Teil funktioniert soweit ja

    for (int r = 0; r < dg.Rows.Count; r++)
    {
        oTable.Cell(j, 1).Range.Text = dg["Datum", r].Value.ToString();
        oTable.Cell(j, 2).Range.Text = dg["Nummer", r].Value.ToString();
        // ...
        oTable.Cell(j, 5).Range.Text = dg["Gesamtpreis", r].Value.ToString();
        // ...
    

    Wie kann ich, wenn die Tabelle auf einer neuen Seite weitergeführt wird, ermitteln, dass es einen Seitenumbruch gab??
    So dass ich eben - dann halt hinterher - die Zwischensumme noch auf die erste Seite schreiben kann. Und nach Möglichkeit die Spaltenüberschriften für die nächste Seite auch übertragen kann.



  • Leider konnte ich mein Problem immer noch nicht lösen.

    Vielleicht weiß jemand, wie ich zumindest die jetztige Fehlermeldung beheben kann.

    int j = 3;
    
    for (int r = 0; r < dg.Rows.Count; r++)
    {
        oTable.Cell(j, 1).Range.Text = dg["Datum", r].Value.ToString();
        oTable.Cell(j, 2).Range.Text = dg["Nummer", r].Value.ToString();
        // ...
        oTable.Cell(j, 5).Range.Text = dg["Gesamtpreis", r].Value.ToString();
    
    j += 2;
    }
    
    ...
    
    // Aktuelle Zeile abrufen
    var aktuelleZeile = oTable.Rows[j]; // Fehlermeldung: Indizierung mit [] kann nicht auf einen Ausdruck vom Typ "Word.Rows" angewendet werden.
    
    // folgende Zeile verursacht ebenfalls eine Fehlermeldung
    aktuelleZeile = oTable.Rows(j); // Fehlermeldung: Der nicht aufrufbare Member "Word.Table.Rows" kann nicht wie eine Methode verwendet werden.
    
    var zeile = oTable.Rows.Add(aktuelleZeile);
    
    zeile.Cells[5].Range.Text = textBenutzer.ToString(); // Fehlermeldung: Indizierung mit [] kann nicht auf einen AUsdruck vom Typ "Word.Cells" angewendet werden.
    
    // Alternativ habe ich obige Zeile wie folgt geändert, dies funktioniert soweit auch.
    oTable.Rows[currentRow].Cells[5].Range.Text = textBenutzer.ToString();
    

    Danek für Eure Hilfe!



  • Hey,

    hier findest Du vordefinierte Bookmarks: https://msdn.microsoft.com/en-us/library/office/ff836079.aspx

    So bekommst Du z.B. die aktuelle Seite:

    ActiveDocument.Bookmarks("\Page")
    

    Du könntest darüber versuchen, die aktuelle Position nach dem Einfügen abzurufen.



  • iop schrieb:

    Hey,

    hier findest Du vordefinierte Bookmarks: https://msdn.microsoft.com/en-us/library/office/ff836079.aspx

    So bekommst Du z.B. die aktuelle Seite:

    ActiveDocument.Bookmarks("\Page")
    

    Du könntest darüber versuchen, die aktuelle Position nach dem Einfügen abzurufen.

    Leider weiß ich nicht genau wie ich das einsetzten muss, um die aktuelle Zeile zu erhalten??? 😕 Ich stehe echt auf dem Schlauch 😞

    Wenn ich direkt

    oDoc.Bookmarks("\Line").Select;
    

    einfüge, kommt nicht erkannte Escapesequenz.

    Dazu wollte ich noch versuchen, nach einer bestimmten Anzahl an Zeilen einen Seitenumbruch einzufügen.

    if (j / 10 == 2)
    {
         oTable.Cell(j, 6).Range.InsertBreak(Word.WdBreakType.wdPageBreak);
    }
    if (j / 10 == 4)
    {
         oTable.Cell(j, 6).Range.InsertBreak(Word.WdBreakType.wdPageBreak);
    }
    else
    { }
    

    Der erste Seitenumbruch wird gemacht - nach 20 Zeilen, dann wird aber nach jeder weiteren Zeile ein Seitenumbruch gemacht.
    Ich habe mit dem Debugger geschaut: Nach dem ersten Seitenumbruch ist die Abfrage

    if (j / 10 == 2)
    

    immer true, obwohl j aufsummiert wird und es somit rechnerisch eigentlich falsch ist. Weshalb??



  • Hast Du nach der Fehlermeldung schon einmal bei Google gesucht? https://msdn.microsoft.com/de-de/library/44ezxxy3.aspx

    Ich kann es gerade nicht ausprobieren, aber versuch doch mal

    oDoc.Bookmarks(@"\Line").Range.InsertBreak(Word.WdBreakType.wdPageBreak);
    

Anmelden zum Antworten