VSTO插件的代码,获取选中最近三级的标题

 /// <summary>
 /// 获取从当前选择位置向上的三级标题层级结构。
 /// </summary>
 /// <returns>格式为 "标题1-标题2-标题3" 的字符串</returns>
 private string GetCurrentHeadingHierarchy()
 {
     Word.Application wordApp = apps;
     Word.Range currentRange = wordApp.Selection.Range;

     // 用于存储找到的各级标题文本
     string[] titles = new string[3];

     // 1. 从当前位置向上查找最近的 "标题3"
     Word.Paragraph heading3Para = FindNearestHeadingUpwards(currentRange, Word.WdOutlineLevel.wdOutlineLevel3);
     if (heading3Para != null)
     {
         titles[2] = CleanParagraphText(heading3Para.Range.Text);
         // 更新下一次搜索的起始位置为刚找到的标题3的位置
         currentRange = heading3Para.Range;
     }

     // 2. 从上一步的位置(或原始位置)向上查找最近的 "标题2"
     Word.Paragraph heading2Para = FindNearestHeadingUpwards(currentRange, Word.WdOutlineLevel.wdOutlineLevel2);
     if (heading2Para != null)
     {
         titles[1] = CleanParagraphText(heading2Para.Range.Text);
         // 更新下一次搜索的起始位置
         currentRange = heading2Para.Range;
     }

     // 3. 从上一步的位置(或原始位置)向上查找最近的 "标题1"
     Word.Paragraph heading1Para = FindNearestHeadingUpwards(currentRange, Word.WdOutlineLevel.wdOutlineLevel1);
     if (heading1Para != null)
     {
         titles[0] = CleanParagraphText(heading1Para.Range.Text);
     }

     // 4. 过滤掉未找到的空标题,然后用 "-" 拼接
     return string.Join("-", titles.Where(t => !string.IsNullOrEmpty(t)));
 }

 /// <summary>
 /// 从指定的Range开始向上搜索具有特定大纲级别的最近的段落。
 /// </summary>
 /// <param name="startRange">搜索的起始位置</param>
 /// <param name="levelToFind">要查找的大纲级别 (e.g., WdOutlineLevel.wdOutlineLevel1)</param>
 /// <returns>找到的段落对象,如果未找到则返回 null</returns>
 private Word.Paragraph FindNearestHeadingUpwards(Word.Range startRange, Word.WdOutlineLevel levelToFind)
 {
     Word.Paragraph currentPara = startRange.Paragraphs[1];
     while (currentPara != null)
     {
         if (currentPara.OutlineLevel == levelToFind)
         {
             return currentPara;
         }
         currentPara = currentPara.Previous();
     }
     return null;
 }

 /// <summary>
 /// 清理从Word段落Range中获取的文本,主要移除末尾的段落标记。
 /// </summary>
 /// <param name="text">从 Range.Text 获取的原始文本</param>
 /// <returns>清理后的文本</returns>
 private string CleanParagraphText(string text)
 {
     if (string.IsNullOrEmpty(text))
     {
         return "";
     }
     return text.Replace("\t","").Replace("\n", "").Replace("\r", "");
 }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值