【问题标题】:Position cursor at start/end of Word document将光标定位在 Word 文档的开头/结尾
【发布时间】:2010-12-08 04:19:46
【问题描述】:

我们正在使用 Word Interop 从 .Net 操作我们的 Word 2007 文档。主要用以下字段做事情:

For Each f In d.Fields
    f.Select()
    //do stuff with fields here            
Next

这会使文档中的最后一个字段保持选中状态。

所以,为了简洁起见,我们希望将光标定位在文档的end(甚至start都可以)。

在谷歌上搜索答案并没有太多……我能得到的最接近的似乎暗示我们需要让自己参与范围或书签。 Document 对象有一个 GoTo 方法,但它提供的 WdGoToItem 选项都没有用。

难道没有一种简单的方法可以将光标发送到文档的末尾(或开头)吗?

编辑

我的部分问题是我不喜欢选择最后一个字段。现在意识到我可以做到

f.Unlink

删除mergefield 并将字段文本保留为纯文本。无论我们是否也重新定位光标,哪个更整洁

【问题讨论】:

    标签: .net interop ms-word mergefield


    【解决方案1】:

    这是它在 C# 中的样子:

    object missing = Missing.Value;
    object what = Word.WdGoToItem.wdGoToLine;
    object which = Word.WdGoToDirection.wdGoToLast;
    doc.GoTo(ref what, ref which, ref missing, ref missing);
    

    我想在 VB.Net 中会更容易,因为它支持可选参数。

    【讨论】:

      【解决方案2】:

      @Alexander Kojevnikov:感谢您的帮助,因为您让我走上了正轨。但是我发现我必须将 .GoTo 应用于 Word Selection 对象,而不是 Document。如:

          Dim what As Object = Word.WdGoToItem.wdGoToLine
          Dim which As Object = Word.WdGoToDirection.wdGoToLast
      
          //below line had no effect
          //d.GoTo(what, which, Nothing, Nothing)
      
          w.Selection.GoTo(what, which, Nothing, Nothing)
      

      【讨论】:

      • 在我的 VisualStudio 2013 实现中,这会将光标置于最后一行的 开始,而不是文档的结尾。
      • @Fuhrmanator VS 2013 还是 Office 2013?我看到从 Office 2010 (v14) 迁移到 Office 2013 (v15) 的一些不同行为。他们都使用 VS 2010 IDE,然而
      • @MichaelPaulukonis 绝对是 VS2013。请参阅我的 answer 了解适合我的解决方案。
      • VS2013 是一个 IDE。这到底有什么影响?您使用的是什么 .NET 运行时?什么版本的 VSTO?什么版本的 Office?
      【解决方案3】:

      我不确定我使用的是与您相同的环境,但要转到文档的开始结束,这对我有用:

      Private Sub moveCursorToStartOfDocument()
          w.Selection.HomeKey(WdUnits.wdStory, Nothing)
      End Sub
      
      Private Sub moveCursorToEndOfDocument()
          w.Selection.EndKey(WdUnits.wdStory, Nothing)
      End Sub
      

      【讨论】:

        【解决方案4】:

        我在 Delphi 中使用单元 Word_TLB 和应用程序对象-Word.Application

        如下:

        aWordDoc.Application.Selection.EndKey(wdStory,wdMove);
        

        word文档的结尾一般是

        Selection.EndKey( WdUnits.wdStory, WdMovementType.wdMove)
        

        当我使用时

        Selection.GoTo(Word.WdGoToItem.wdGoToLine, Word.WdGoToDirection.wdGoToLast, Nothing, Nothing);
        Selection.InsertFile('documnet.docx');
        

        新内容被插入到最后一行之前。

        【讨论】:

          【解决方案5】:

          在 C# Word 加载项 VSTO 中更改当前文档末尾的光标位置:

          this.Application.ActiveDocument.Range(
          this.Application.ActiveDocument.Content.End-1,
          this.Application.ActiveDocument.Content.End-1).Select();
          

          How to: Programmatically Define and Select Ranges in Documents

          【讨论】:

            【解决方案6】:

            找出实际代码大纲的最简单方法是在 Word 中为该特定操作记录一个宏。然后您可以修改生成的代码以适应 VB、VB.NET、C# 等的不同语法。

            下面的代码 sn-p 演示了 VB.NET 应用程序的用法:

            Imports wordNmSpace = Microsoft.Office.Interop.Word
            ' Create an object for the application instance
            objWord = CreateObject("Word.Application")
            
            ' Create a reference of the selection object within Word
            objSelection = objWord.Selection
            
            ' Now comes the part where you move selection position to the end of document
            objSelection.endof(wordNmSpace.WdUnits.wdStory, wordNmSpace.WdMovementType.wdMove)
            

            希望这会有所帮助。

            【讨论】:

              【解决方案7】:

              试试这个:

              int lNumberOfPages = 
                _WordDoc.ComputeStatistics(Word.WdStatistic.wdStatisticPages, false);
              
              WordApp.Selection.GoTo(Word.WdGoToItem.wdGoToPage,WordApp.WdGoToDirection.wdGoToLast, lNumberOfPages);
              

              【讨论】:

                【解决方案8】:

                您可以使用预定义的书签:

                EndOfDoc oDoc.Bookmarks.Item("\endofdoc").Range
                

                其他预定义书签:

                ActiveDocument.Bookmarks("\Para").Copy "currpara"
                

                https://msdn.microsoft.com/en-us/VBA/Word-VBA/articles/predefined-bookmarks

                【讨论】:

                  【解决方案9】:

                  网络办公:

                  mydoc.Range(GlobalClass.mydoc.Content.End-1 , mydoc.Content.End - 1).Select();
                  

                  【讨论】:

                    猜你喜欢
                    • 2012-07-13
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 2020-12-27
                    • 2011-11-19
                    • 1970-01-01
                    • 1970-01-01
                    相关资源
                    最近更新 更多