如何使用Microsoft Office Word Interop与复制的+粘贴表进行交互?粘贴的表格不会添加到document.Tables.count

时间:2015-01-22 01:59:12

标签: c# .net ms-word office-interop

我正在使用以下代码复制并粘贴表格:

Word.Table tableTemplate = document.Tables[tableNumber];
tableTemplate.Select();
word.Selection.Copy();    //word is my Word.Application
word.Selection.MoveDown(Word.WdUnits.wdLine, 2);
word.Selection.PasteAndFormat(Word.WdRecoveryType.wdTableOriginalFormatting);
table = document.Tables[tableNumber + 1];

不幸的是,当粘贴表时,document.Tables.Count变量不会递增,而最后一行会抛出索引超出边界的错误。我确定这是我失踪的小事。

2 个答案:

答案 0 :(得分:1)

如果遇到类似问题的人正在寻找解决方案,我会在桌子下方放置一个书签,将选择光标移动到那里,然后在书签之前选择范围并粘贴。

Word.Bookmark bkmrk = document.Bookmarks["MyBkmrk"];
Word.Range rng = document.Range(bkmrk.Range.Start - 1, bkmrk.Range.Start - 1);
rng.Select();
word.Selection.Paste();

这似乎比尝试使用MoveDown要好得多。我甚至尝试在选择中使用MoveDown,使用范围中的段落数来确定距离,并且完全没有效果。

编辑:

所以,我真正的问题是我需要复制一个表并在循环中粘贴一些表,然后编辑表的内容。我不停地跑进桌子里,一般都搞砸了。对于需要做类似事情的人来说,这里有一些帮助:

Word.Table table = document.Tables[tableNumber];
table.Select();
wordApplication.Selection.Copy();
for(int i = 0; i < tablesINeed; i++)
{
    Word.Range rng = document.Range(document.Tables[tableNumber + i].Range.End + 1, document.Tables[tableNumber + i].Range.End + 1);
    rng.Select();
    wordApplication.Selection.Paste();
    // Modify table accordingly
}

看起来很简单,但需要经过大量的反复试验。希望它会帮助别人。

答案 1 :(得分:0)

我有一个基于cboler的答案。如果桌子后面已经有东西要复制,我会遇到问题。

private static List<Table> CloneTables(Application Application, Document doc, int tableNumber, int tablesINeed)
    {
        List<Table> sameTables = new List<Table>();
        Table lastTable = doc.Tables[tableNumber];
        sameTables.Add(lastTable);

        lastTable.Select();
        Application.Selection.Copy();
        for (int i = 0; i < tablesINeed; i++)
        {
            lastTable.Range.Next().InsertParagraphAfter();
            Range rng = doc.Range(doc.Tables[tableNumber + i].Range.End + 1, doc.Tables[tableNumber + i].Range.End + 1);
            rng.Select();
            Application.Selection.Paste();
            lastTable = doc.Tables[tableNumber + i + 1];
            sameTables.Add(lastTable);
        }

        return sameTables;
    }