C# VSTO:RichText ContentControl 中的 InsertFile 在 ContentControl 之外
C# VSTO: InsertFile in RichText ContentControl is outside of ContentControl
我 select 超出书签位置的范围(有效)。
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;
现在我想将另一个 Word 文件插入到该 ContentControl 中(不起作用!):
wcc.Range.InsertFile(Path.Combine(path, fileName));
外部 Word 文件包含一个有 4 行的 Table(只是一个示例文件)。内容现在插入到 ContentControl 之后,而不是里面?
这是结果的样子:
如果我尝试设置 ContentControl 的文本,它工作正常(内容 "test" 现在在 ContentControl 中):
wcc.Range.Text = "test";
作为上次测试的结果,我认为我已经 select 编辑了正确的范围,但为什么 table 在 ContentControl 之外?
编辑:
我用我想通过代码执行的步骤记录了一个宏,然后发现我无法在 ContentControl 和其他一些字符所在的行中插入 Table(在我的例子中是 space).因此,添加了另一个段落以获得此解决方案:
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里面table开头和结尾的段落),共3段。 . 有没有人提供更好的解决方案?
我根据您的代码创建了一个小测试方法来进行一些黑盒测试。
为此我创建了两个小文件:
- testdoc1.docx,从新创建,使用 =rand() 插入随机文本,添加名为 "testbookmark"
的书签
- testdoc2.docx,从新创建,插入 table,四行两列,就像你的一样。
运行使用您在此处显示的确切代码后,它可以正常工作。为了查看它是否与您使用的范围有关,我做了一些重写:
[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 中的代码,看看隔离的代码是否在您这边做同样的事情。
这是上面代码的结果:
我 select 超出书签位置的范围(有效)。
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;
现在我想将另一个 Word 文件插入到该 ContentControl 中(不起作用!):
wcc.Range.InsertFile(Path.Combine(path, fileName));
外部 Word 文件包含一个有 4 行的 Table(只是一个示例文件)。内容现在插入到 ContentControl 之后,而不是里面?
这是结果的样子:
如果我尝试设置 ContentControl 的文本,它工作正常(内容 "test" 现在在 ContentControl 中):
wcc.Range.Text = "test";
作为上次测试的结果,我认为我已经 select 编辑了正确的范围,但为什么 table 在 ContentControl 之外?
编辑:
我用我想通过代码执行的步骤记录了一个宏,然后发现我无法在 ContentControl 和其他一些字符所在的行中插入 Table(在我的例子中是 space).因此,添加了另一个段落以获得此解决方案:
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里面table开头和结尾的段落),共3段。 . 有没有人提供更好的解决方案?
我根据您的代码创建了一个小测试方法来进行一些黑盒测试。
为此我创建了两个小文件:
- testdoc1.docx,从新创建,使用 =rand() 插入随机文本,添加名为 "testbookmark" 的书签
- testdoc2.docx,从新创建,插入 table,四行两列,就像你的一样。
运行使用您在此处显示的确切代码后,它可以正常工作。为了查看它是否与您使用的范围有关,我做了一些重写:
[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 中的代码,看看隔离的代码是否在您这边做同样的事情。
这是上面代码的结果: