/// <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", "");
}
VSTO插件的代码,获取选中最近三级的标题
于 2025-06-26 15:05:48 首次发布