2

我目前正在使用 Visual Studio 2010 中的 .NET 应用程序。我想使用 C# 创建一个 MS Word 2010 文件。我已经创建了一个新文档并插入了一些段落。现在我想在文档中插入一些形状。因此,我在 Microsoft.Office.Interop.Word 命名空间中使用 Word.Document.Shapes.AddLine() 方法。我想在某些段落之后添加形状。当这些段落位于文档的第一页时,一切正常。但如果段落在另一页上,则形状也将插入第一页。我使用以下 C# 代码:

//Add paragraph
Word.Paragraph oPara2;
object oRng = NewDocument.Bookmarks.get_Item(ref oEndOfDoc).Range;
oPara2= NewDocument.Content.Paragraphs.Add(ref oRng);
oPara2.Range.Text = "Text";      
oPara2.Range.InsertParagraphAfter();

//Vertical position of the shape
float position = (float) (oPara2.Range.get_Information (Word.WdInformation.wdVerticalPositionRelativeToPage) - 16.5 );
//Add Line
Word.Shape line2 = NewDocument.Shapes.AddLine(30, position, 800, position);

/* 
*
*Some more paragraphs
*
**/
//Next Paragraph with shape
Word.Paragraph oPara13;
oRng = NewDocument.Bookmarks.get_Item(ref oEndOfDoc).Range;
oPara13 = NewDocument.Content.Paragraphs.Add(ref oRng);
oPara13.Range.Text = "Text";      
oPara13.Range.InsertParagraphAfter();

//Vertical position of the shape
position = (float) (oPara13.Range.get_Information (Word.WdInformation.wdVerticalPositionRelativeToPage) - 16.5 );
//Add Line
Word.Shape line3 = NewDocument.Shapes.AddLine(30, position, 800, position);

oPara13 段位于文件的第二页。计算的位置值是正确的,但形状将插入到该位置的第一页。现在我想问一下如何使形状插入到相应段落所在的正确页面上。我已经尝试设置 AddLine 方法的锚参数,但结果不好。

4

2 回答 2

1

首先,如果您只需要生成 .docx 文件,请考虑使用 OpenXML 项目。它的工作速度会更快,并且不会遇到与使用 Word 相关的问题(如多线程、文件未正确关闭或许可)。使用 OpenXML 生成文档并非易事,但如果您使用生产力工具,它会变得容易得多 - 它允许您打开任何文档并生成可以重新创建它的 c# 代码。

关于您的问题,word 会在您询问的位置准确插入它 - 该函数接收绝对垂直坐标,您提供的坐标指向第一页。因此,不要使用 wdVerticalPositionRelativeToPage,而是使用 wdVerticalPositionRelativeToTextBoundary,在普通文本的常规情况下,它将为您提供绝对坐标。或者你可以得到最后一段的位置

absoluteY= ActiveDocument.Paragraphs(ActiveDocument.Paragraphs.Count).Range.Information(wdVerticalPositionRelativeToTextBoundary)  

ActiveDocument.Shapes.AddLine(50, absoluteY, 150, absoluteY).Select

另一个注意事项 - 如果您不确定如何执行某项操作,请打开 Word 并记录您执行此操作的宏。生成的代码很有启发性。您会注意到 Word 经常使用 select 和 Selection。

于 2013-07-22T12:39:19.937 回答
-1

这个答案对我不起作用。但我做了一些研究并找到了这个解决方案:

该方法Shapes.AddLine使用已知的 4 个参数坐标。但是有第五个参数。这是锚!

在这种情况下,锚是文本段落的新范围。它总是占用当前页面的第一段。从那里您可以添加新坐标:

ActiveDocument.Shapes.AddLine(x1, y1, x2, y2, <your paragraph>.Range).Select;
于 2016-02-08T09:17:26.190 回答