0

我从书签位置(工作)中选择一个范围。

Word.ContentControl wcc;
Word.Selection WSelection = wApp.Selection;
object obj;
obj = (object)wApp.ActiveDocument.Bookmarks.get_Item(bookmark).Range;

然后我在范围之前移动并添加一个段落并移动到新段落。这是因为我想在书签之前添加 ContentControl(出于订购原因)(工作):

Word.Range WRange = WSelection.Range;
object count = 1;
object back = -1;
(obj as Word.Range).Move(Unit: Word.WdUnits.wdCharacter, Count: ref back);
(obj as Word.Range).Paragraphs.Add();
(obj as Word.Range).Move(Unit: Word.WdUnits.wdParagraph, Count: ref count);

现在我添加一个 ContentControl (工作):

wcc = WRange.ContentControls.Add(Microsoft.Office.Interop.Word.WdContentControlType.wdContentControlRichText, ref obj);
wcc.LockContentControl = true;
wcc.SetPlaceholderText(null, null, " ");
wcc.Tag = fileName;

现在我想在该 ContentControl 中插入另一个 Word 文件(不工作!):

wcc.Range.InsertFile(Path.Combine(path, fileName));

外部 Word 文件包含一个有 4 行的表格(只是一个示例文件)。内容现在插入在 ContentControl 之后,而不是在里面?结果如下所示: 结果(请参阅突出显示的空 ContentControl 和 ContentControl 之外的表格)

如果我尝试设置 ContentControl 的文本,它工作正常(内容“测试”现在在 ContentControl 内):

wcc.Range.Text = "test";

作为上次测试的结果,我认为我选择了正确的范围,但是为什么表格在 ContentControl 之外?

编辑:

我记录了一个宏,其中包含我想通过代码执行的步骤并发现,我无法在 ContentControl 和其他一些字符所在的行中插入一个表(在我的情况下是一个空格)。所以添加了另一个段落来获得这个解决方案:

Word.Range WRange = WSelection.Range;
object next = 1;
object back = -1;
(obj as Word.Range).Move(Unit: Word.WdUnits.wdCharacter, Count: ref back);
(obj as Word.Range).Paragraphs.Add();
(obj as Word.Range).Move(Unit: Word.WdUnits.wdParagraph, Count: ref next);
(obj as Word.Range).Paragraphs.Add();
(obj as Word.Range).Move(Unit: Word.WdUnits.wdCharacter, Count: ref back);
wcc = WRange.ContentControls.Add(Microsoft.Office.Interop.Word.WdContentControlType.wdContentControlRichText, ref obj);
wcc.LockContentControl = true;
wcc.SetPlaceholderText(null, null, " ");
wcc.Tag = fileName;
wcc.Range.InsertFile(Path.Combine(path, fileName));

结果是,在第一个和第二个添加的 ContentControl 之间有一个额外的段落(包括 ContentControl 内表格开头和结尾的段落),总共 3 个段落......有人提供更好的解决方案吗?

4

1 回答 1

1

我根据您的代码创建了一个小测试方法来进行一些黑盒测试。

为此,我创建了两个小文件:

  • testdoc1.docx,从新创建,使用 =rand() 插入随机文本,添加一个名为“testbookmark”的书签
  • testdoc2.docx,从新创建,插入表,四行和两个列,就像你的一样。

运行您在此处显示的确切代码后,它可以正常工作。为了查看它是否与您使用的范围有关,我做了一些重写:

[TestMethod]
public void TestInsertFile()
{
    Application word = new Microsoft.Office.Interop.Word.Application();

    word.Visible = true;

    Document doc = word.Documents.Open(@"c:\temp\testdoc1.docx");

    Range rng = word.ActiveDocument.Bookmarks.get_Item("testbookmark").Range;

    object count = 1;
    object back = -1;

    rng.Move(Unit: Word.WdUnits.wdCharacter, Count: ref back);
    rng.Paragraphs.Add();
    rng.Move(Unit: Word.WdUnits.wdParagraph, Count: ref count);

    object obj = rng as object;

    Word.ContentControl wcc = word.ActiveDocument.ContentControls.Add(WdContentControlType.wdContentControlRichText, ref obj);
    wcc.LockContentControl = true;
    wcc.SetPlaceholderText(null, null, " ");
    wcc.Tag = @"c:\temp\testdoc2.docx";

    wcc.Range.InsertFile(wcc.Tag);
}

所以你的问题似乎与代码无关。查看源文档或目标文档中是否存在可能影响行为的其他内容。尝试在我的 TestMethod 中运行代码,看看隔离的代码是否在你身边做同样的事情。

这是上面代码的结果: 结果输出

于 2016-03-14T10:42:11.517 回答