VSTO2007:如何确定范围页码和段落号?我正在为MSWord构建一个加载项,它必须从文档中收集所有评论气球并将它们汇总到一个列表中。我的结果将是一个ReviewItem类列表,其中包含评论本身、段落编号和评论文本所在的页码。我的部分代码如下所示:privatestaticListFindComments(){Listresult=newList();foreach(CommentcinWorkingDoc.Comments){ReviewItemitem=newReviewItem(){Remark=c.Reference.Text,Paragraph=c.Scope.???,//如何确定段落编号?Page=c.Scope.???//如何判断页码?};结果。添加(项目);}返回结果;Comment类的Scope属性指向Comment所在文档中的实际文本,其类型为Microsoft.Office.Interop.Word.Range。我不知道如何确定范围在哪个页面和段落上。通过段落编号,我实际上是指段落的“编号列表”编号,例如“2.3”或“1.3.2”。有什么建议么?谢谢!试试这个页码:Page=c.Scope.Information(wdActiveEndPageNumber);这应该为您提供页码的最终值。如果您想要开头的页面值,请先尝试:Word.Rangerng=c.Scope.Collapse(wdCollapseStart);Page=rng.Information(wdActiveEndPageNumber);对于段落编号,请参见以下内容:c.Scope.Paragraphs;//返回一个段落集合我的猜测是获取上面返回的集合中的第一个段落对象,获取从该段落末尾到文档开头的新范围,并获得此整数值:[range].Paragraphs。数数;//返回int这应该给出注释范围开头的确切段落编号。在给了我答案的MikeRegan的帮助下(再次感谢Mike),我设法找到了一个解决方案,我想在这里分享一下。也许这也阐明了我的目标。在性能方面,这可能不是最快或最有效的解决方案。随时提出改进建议。我的代码的结果是将在别处处理的ReviewItem类列表。不要用多说了,这是代码://////从Word文档中收集评论并将其导出为ReviewItems的工作类///internalclassReviewItemCollector{//////Workingdocument///privateWord.文档WorkingDoc=newWord.DocumentClass();//////从Word文档中提取评论结果//////要评估的文件的完全限定路径///publicReviewResultGetReviewResults(stringfileName){Word.ApplicationwordApp=null;列出reviewItems=newList();对象缺失=System.Reflection.Missing.Value;try{//启动WordwordApp=newWord.ApplicationClass();//一些对象变量,因为WordAPI需要这个对象fileNameForWord=fileName;对象只读=真;WorkingDoc=wordApp.Documents.Open(reffileNameForWord,refmissing,refreadOnly,refmissing,refmissing,refmissing,refmissing,refmissing,refmissing,refmissing,refmissing,refmissing,refmissing,refmissing,缺少参考,参考丢失的);//收集所有作为章节标题的段落,按它们的起始位置排序varheaders=(fromWord.ParagraphpinWorkingDoc.ParagraphswhereIsHeading(p)selectnewHeading(){Text=GetHeading(p),Start=p.Range.Start}).ToList().OrderBy(h=>h.Start);reviewItems.AddRange(FindComments(headers));//我将对文档中的修订做类似的事情}catch(Exceptionx){MessageBox.Show(x.ToString(),"Errorwhilecollectingreviewitems",MessageBoxButtons.OK,MessageBoxIcon.Error);}finally{if(wordApp!=null){objectdoNotSave=Word.WdSaveOptions.wdDoNotSaveChanges;wordApp.Quit(refdoNotSave,refmissing,refmissing);}}ReviewResult结果=newReviewResult();结果.Items=reviewItems.OrderBy(i=>i.Position);返回结果;}//////查找文档中的所有评论并将它们转换为评论项//////从评论中生成的ReviewItems列表privateListFindComments(IOrderedEnumerableheaders){列表结果=newList();//从文档中的评论生成ReviewItemsvarreviewItems=fromWord.CommentcinWorkingDoc.CommentsselectnewReviewItem(){Position=c.Scope.Start,Page=GetPageNumberOfRange(c.Scope),Paragraph=GetHeaderForRange(headers,c.Scope),Description=c.Range.Text,ItemType=DetermineCommentType(c)};返回reviewItems.ToList();}//////根据内容暴力翻译评论类型.../////////privatestaticstringDetermineCommentType(Word.Commentc){//这段代码非常适合我的解决方案,可能会变得更加灵活/可配置//现在,这是可行的:-)stringtext=c.Range.Text.ToLower();如果(text.EndsWith("?")){返回"Vraag";}if(text.Contains("spelling")||text.Contains("spelfout")){return"Spelling";}if(text.Contains("typfout")||text.Contains("typefout")){return"Typefout";}if(text.ToLower().Contains("omissie")){return"Omissie";}return"Opmerking";}//////确定给定范围开始位置之前的最后一个标题。这将是该范围所属的章节。//////标题列表///当前范围///privatestaticstringGetHeaderForRange(IEnumerableheadings,Word.Rangerange){varfound=(fromhinheadingswhereh.Start///识别段落是否为标题,基于关于它的样式。///注意:我们正在审查的文档总是采用某种格式,我们可以假设标题///具有名为“标题...”或“Kop...”的样式//////要评估的段落。///privatestaticboolIsHeading(Word.Paragraphparagraph){Word.Stylestyle=paragraph.get_Style()asWord.Style;return(style!=null&&style.NameLocal.StartsWith("Heading")||style.NameLocal.StartsWith("Kop"));}//////将段落翻译成我们想要看到的形式:最好是章节/段落编号,或者否则///标题本身就可以了。//////要翻译的段落///privatestaticstringGetHeading(Word.Paragraphparagraph){stringheading="";//尝试获取列表编号,否则只获取整个标题文本heading=paragraph.Range.ListFormat.ListString;如果(string.IsNullOrEmpty(heading)){heading=paragraph.Range.Text;heading=Regex.Replace(heading,"\s+$","");}返回标题;}//////确定范围的页码。//////要定位的范围。///privatestaticintGetPageNumberOfRange(Word.Rangerange){return(int)range.get_Information(Word.WdInformation.wdActiveEndPageNumber);我认为有一种更简单的方法可以从Range对象本身获取它。Range.get_Information为您提供页码、行号等,但您必须知道范围跨越多少页或行。这是一个问题,范围不必在一页上。所以你可以得到范围的开始和结束,然后计算页码,或行号等。应该这样做:publicstaticvoidGetStartAndEndPageNumbers(Word.Rangerange,outintstartPageNo,outintendPageNo){Word.RangerngEnd;GetStartAndEndRange(范围,rngStart,rngEnd);startPageNo=GetPageNumber(rngStartPage);结束=rngEnd!=null?GetPageNumber(rngEnd):起始页号;}staticvoidGetStartAndEndRange(Word.Rangerange,outWord.RangerngStart,outWord.RangerngEnd){objectposStart=range.Start,posEnd=range.End;rngStart=range.Document.Range(refposStart,refposStart);试试{rngEnd=range.Document.Range(refposEnd,refposEnd);}catch{rngEnd=null;}}staticintGetPageNumber(Word.Range范围){return(int)range.get_Information(Word.WdInformation.wdActiveEndPageNumber);}也可以对行号进行同样的操作:以上是C#学习教程:VSTO2007:Howtodeterminethepageandparagraphnumberoftherange?如果分享的内容对你有用,需要进一步了解C#学习教程,希望你多多关注——publicstaticvoidGetStartAndEndLineNumbers(Word.Rangerange,outintstartLineNo,outintendLineNo){Word.Range开始;Word.RangerngEnd;GetStartAndEndRange(范围,rngStart,rngEnd);startLineNo=GetLineNumber(rngStart);endLineNo=rngEnd!=null?GetLineNumber(rngEnd):startLineNo;}staticintGetLineNumber(Word.Rangerange){return(int)range.get_Information(Word.WdInformation.wdFirstCharacterLineNumber);}本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
