实现word的多级列表功能

在使用vsto开发word插件的时候,需要实现word的多级列表的功能,如 ,然后再word中录制宏,看vba代码,然后再转换成c#代码。
如下列vba代码:

With ListGalleries(wdOutlineNumberGallery).ListTemplates(1).ListLevels(1)
        .NumberFormat = "%1"
        .TrailingCharacter = wdTrailingTab
        .NumberStyle = wdListNumberStyleArabic
        .NumberPosition = CentimetersToPoints(0)
        .Alignment = wdListLevelAlignLeft
        .TextPosition = CentimetersToPoints(0.75)
        .TabPosition = wdUndefined
        .ResetOnHigher = 0
        .StartAt = 1
        With .Font
            .Bold = wdUndefined
            .Italic = wdUndefined
            .StrikeThrough = wdUndefined
            .Subscript = wdUndefined
            .Superscript = wdUndefined
            .Shadow = wdUndefined
            .Outline = wdUndefined
            .Emboss = wdUndefined
            .Engrave = wdUndefined
            .AllCaps = wdUndefined
            .Hidden = wdUndefined
            .Underline = wdUndefined
            .Color = wdUndefined
            .Size = wdUndefined
            .Animation = wdUndefined
            .DoubleStrikeThrough = wdUndefined
            .Name = ""
        End With
        .LinkedStyle = ""
    End With
    With ListGalleries(wdOutlineNumberGallery).ListTemplates(1).ListLevels(2)
        .NumberFormat = "%1.%2"
        .TrailingCharacter = wdTrailingTab
        .NumberStyle = wdListNumberStyleArabic
        .NumberPosition = CentimetersToPoints(0.75)
        .Alignment = wdListLevelAlignLeft
        .TextPosition = CentimetersToPoints(1.75)
        .TabPosition = wdUndefined
        .ResetOnHigher = 1
        .StartAt = 1
        With .Font
            .Bold = wdUndefined
            .Italic = wdUndefined
            .StrikeThrough = wdUndefined
            .Subscript = wdUndefined
            .Superscript = wdUndefined
            .Shadow = wdUndefined
            .Outline = wdUndefined
            .Emboss = wdUndefined
            .Engrave = wdUndefined
            .AllCaps = wdUndefined
            .Hidden = wdUndefined
            .Underline = wdUndefined
            .Color = wdUndefined
            .Size = wdUndefined
            .Animation = wdUndefined
            .DoubleStrikeThrough = wdUndefined
            .Name = ""
        End With
        .LinkedStyle = ""
    End With
    With ListGalleries(wdOutlineNumberGallery).ListTemplates(1).ListLevels(3)
        .NumberFormat = "%1.%2.%3"
        .TrailingCharacter = wdTrailingTab
        .NumberStyle = wdListNumberStyleArabic
        .NumberPosition = CentimetersToPoints(1.5)
        .Alignment = wdListLevelAlignLeft
        .TextPosition = CentimetersToPoints(2.5)
        .TabPosition = wdUndefined
        .ResetOnHigher = 2
        .StartAt = 1
        With .Font
            .Bold = wdUndefined
            .Italic = wdUndefined
            .StrikeThrough = wdUndefined
            .Subscript = wdUndefined
            .Superscript = wdUndefined
            .Shadow = wdUndefined
            .Outline = wdUndefined
            .Emboss = wdUndefined
            .Engrave = wdUndefined
            .AllCaps = wdUndefined
            .Hidden = wdUndefined
            .Underline = wdUndefined
            .Color = wdUndefined
            .Size = wdUndefined
            .Animation = wdUndefined
            .DoubleStrikeThrough = wdUndefined
            .Name = ""
        End With
        .LinkedStyle = ""
    End With
    With ListGalleries(wdOutlineNumberGallery).ListTemplates(1).ListLevels(4)
        .NumberFormat = "%1.%2.%3.%4"
        .TrailingCharacter = wdTrailingTab
        .NumberStyle = wdListNumberStyleArabic
        .NumberPosition = CentimetersToPoints(2.25)
        .Alignment = wdListLevelAlignLeft
        .TextPosition = CentimetersToPoints(3.5)
        .TabPosition = wdUndefined
        .ResetOnHigher = 3
        .StartAt = 1
        With .Font
            .Bold = wdUndefined
            .Italic = wdUndefined
            .StrikeThrough = wdUndefined
            .Subscript = wdUndefined
            .Superscript = wdUndefined
            .Shadow = wdUndefined
            .Outline = wdUndefined
            .Emboss = wdUndefined
            .Engrave = wdUndefined
            .AllCaps = wdUndefined
            .Hidden = wdUndefined
            .Underline = wdUndefined
            .Color = wdUndefined
            .Size = wdUndefined
            .Animation = wdUndefined
            .DoubleStrikeThrough = wdUndefined
            .Name = ""
        End With
        .LinkedStyle = ""
    End With
    With ListGalleries(wdOutlineNumberGallery).ListTemplates(1).ListLevels(5)
        .NumberFormat = "%1.%2.%3.%4.%5"
        .TrailingCharacter = wdTrailingTab
        .NumberStyle = wdListNumberStyleArabic
        .NumberPosition = CentimetersToPoints(3)
        .Alignment = wdListLevelAlignLeft
        .TextPosition = CentimetersToPoints(4.5)
        .TabPosition = wdUndefined
        .ResetOnHigher = 4
        .StartAt = 1
        With .Font
            .Bold = wdUndefined
            .Italic = wdUndefined
            .StrikeThrough = wdUndefined
            .Subscript = wdUndefined
            .Superscript = wdUndefined
            .Shadow = wdUndefined
            .Outline = wdUndefined
            .Emboss = wdUndefined
            .Engrave = wdUndefined
            .AllCaps = wdUndefined
            .Hidden = wdUndefined
            .Underline = wdUndefined
            .Color = wdUndefined
            .Size = wdUndefined
            .Animation = wdUndefined
            .DoubleStrikeThrough = wdUndefined
            .Name = ""
        End With
        .LinkedStyle = ""
    End With
    With ListGalleries(wdOutlineNumberGallery).ListTemplates(1).ListLevels(6)
        .NumberFormat = "%1.%2.%3.%4.%5.%6"
        .TrailingCharacter = wdTrailingTab
        .NumberStyle = wdListNumberStyleArabic
        .NumberPosition = CentimetersToPoints(3.75)
        .Alignment = wdListLevelAlignLeft
        .TextPosition = CentimetersToPoints(5.75)
        .TabPosition = wdUndefined
        .ResetOnHigher = 5
        .StartAt = 1
        With .Font
            .Bold = wdUndefined
            .Italic = wdUndefined
            .StrikeThrough = wdUndefined
            .Subscript = wdUndefined
            .Superscript = wdUndefined
            .Shadow = wdUndefined
            .Outline = wdUndefined
            .Emboss = wdUndefined
            .Engrave = wdUndefined
            .AllCaps = wdUndefined
            .Hidden = wdUndefined
            .Underline = wdUndefined
            .Color = wdUndefined
            .Size = wdUndefined
            .Animation = wdUndefined
            .DoubleStrikeThrough = wdUndefined
            .Name = ""
        End With
        .LinkedStyle = ""
    End With
    With ListGalleries(wdOutlineNumberGallery).ListTemplates(1).ListLevels(7)
        .NumberFormat = "%1.%2.%3.%4.%5.%6.%7"
        .TrailingCharacter = wdTrailingTab
        .NumberStyle = wdListNumberStyleArabic
        .NumberPosition = CentimetersToPoints(4.5)
        .Alignment = wdListLevelAlignLeft
        .TextPosition = CentimetersToPoints(6.75)
        .TabPosition = wdUndefined
        .ResetOnHigher = 6
        .StartAt = 1
        With .Font
            .Bold = wdUndefined
            .Italic = wdUndefined
            .StrikeThrough = wdUndefined
            .Subscript = wdUndefined
            .Superscript = wdUndefined
            .Shadow = wdUndefined
            .Outline = wdUndefined
            .Emboss = wdUndefined
            .Engrave = wdUndefined
            .AllCaps = wdUndefined
            .Hidden = wdUndefined
            .Underline = wdUndefined
            .Color = wdUndefined
            .Size = wdUndefined
            .Animation = wdUndefined
            .DoubleStrikeThrough = wdUndefined
            .Name = ""
        End With
        .LinkedStyle = ""
    End With
    With ListGalleries(wdOutlineNumberGallery).ListTemplates(1).ListLevels(8)
        .NumberFormat = "%1.%2.%3.%4.%5.%6.%7.%8"
        .TrailingCharacter = wdTrailingTab
        .NumberStyle = wdListNumberStyleArabic
        .NumberPosition = CentimetersToPoints(5.25)
        .Alignment = wdListLevelAlignLeft
        .TextPosition = CentimetersToPoints(7.75)
        .TabPosition = wdUndefined
        .ResetOnHigher = 7
        .StartAt = 1
        With .Font
            .Bold = wdUndefined
            .Italic = wdUndefined
            .StrikeThrough = wdUndefined
            .Subscript = wdUndefined
            .Superscript = wdUndefined
            .Shadow = wdUndefined
            .Outline = wdUndefined
            .Emboss = wdUndefined
            .Engrave = wdUndefined
            .AllCaps = wdUndefined
            .Hidden = wdUndefined
            .Underline = wdUndefined
            .Color = wdUndefined
            .Size = wdUndefined
            .Animation = wdUndefined
            .DoubleStrikeThrough = wdUndefined
            .Name = ""
        End With
        .LinkedStyle = ""
    End With
    With ListGalleries(wdOutlineNumberGallery).ListTemplates(1).ListLevels(9)
        .NumberFormat = "%1.%2.%3.%4.%5.%6.%7.%8.%9"
        .TrailingCharacter = wdTrailingTab
        .NumberStyle = wdListNumberStyleArabic
        .NumberPosition = CentimetersToPoints(6)
        .Alignment = wdListLevelAlignLeft
        .TextPosition = CentimetersToPoints(9)
        .TabPosition = wdUndefined
        .ResetOnHigher = 8
        .StartAt = 1
        With .Font
            .Bold = wdUndefined
            .Italic = wdUndefined
            .StrikeThrough = wdUndefined
            .Subscript = wdUndefined
            .Superscript = wdUndefined
            .Shadow = wdUndefined
            .Outline = wdUndefined
            .Emboss = wdUndefined
            .Engrave = wdUndefined
            .AllCaps = wdUndefined
            .Hidden = wdUndefined
            .Underline = wdUndefined
            .Color = wdUndefined
            .Size = wdUndefined
            .Animation = wdUndefined
            .DoubleStrikeThrough = wdUndefined
            .Name = ""
        End With
        .LinkedStyle = ""
    End With
    ListGalleries(wdOutlineNumberGallery).ListTemplates(1).Name = ""
    Selection.Range.ListFormat.ApplyListTemplateWithLevel ListTemplate:= _
        ListGalleries(wdOutlineNumberGallery).ListTemplates(1), _
        ContinuePreviousList:=False, ApplyTo:=wdListApplyToWholeList, _
        DefaultListBehavior:=wdWord10ListBehavior
    Selection.Range.SetListLevel Level:=2
End Sub

当刚开始看这些代码的时候,我当时认为代码前面的一大堆设置是没用的,而是直接将最后的代码转换成c#代码:
 Word.ListTemplate template = Globals.ThisAddIn.Application.ListGalleries[Word.WdListGalleryType.wdOutlineNumberGallery].ListTemplates[5];
            Word.ListLevel level = template.ListLevels[2];
            level.NumberFormat = "%1.%2";
            level.NumberStyle = Word.WdListNumberStyle.wdListNumberStyleArabic;
            level.NumberPosition = Globals.ThisAddIn.Application.CentimetersToPoints(0.0f);
            level.Alignment = Word.WdListLevelAlignment.wdListLevelAlignLeft;
            level.TextPosition = Globals.ThisAddIn.Application.CentimetersToPoints(1.2f);
            level.TabPosition = (float)Word.WdConstants.wdUndefined;
            level.ResetOnHigher = 1;
            level.StartAt = 1;

            level.Font.Bold = 1;
            level.Font.Italic = (int)Word.WdConstants.wdUndefined;
            level.Font.StrikeThrough = (int)Word.WdConstants.wdUndefined;
            level.Font.Subscript = (int)Word.WdConstants.wdUndefined;
            level.Font.Superscript = (int)Word.WdConstants.wdUndefined;
            level.Font.Shadow = (int)Word.WdConstants.wdUndefined;
            level.Font.Outline = (int)Word.WdConstants.wdUndefined;
            level.Font.Emboss = (int)Word.WdConstants.wdUndefined;
            level.Font.Engrave = (int)Word.WdConstants.wdUndefined;
            level.Font.AllCaps = (int)Word.WdConstants.wdUndefined;
            level.Font.Hidden = (int)Word.WdConstants.wdUndefined;
            level.Font.Underline = Word.WdUnderline.wdUnderlineNone;
            level.Font.Color = Word.WdColor.wdColorAutomatic;
            level.Font.Size = float.Parse("10.5");
            level.Font.Name = "黑体";
            level.Font.Animation = Word.WdAnimation.wdAnimationNone;
            level.Font.DoubleStrikeThrough = (int)Word.WdConstants.wdUndefined;

            level.LinkedStyle = "";

            template.Name = "";
            object bContinuePrevList = false;
            object applyTo = Word.WdListApplyTo.wdListApplyToWholeList;
            object defBehavior = Word.WdDefaultListBehavior.wdWord9ListBehavior;
            object miss = System.Reflection.Missing.Value;
            

            objSel.ParagraphFormat.LineUnitBefore = float.Parse("2");
            objSel.ParagraphFormat.LineUnitAfter = float.Parse("2");
            objSel.Font.Name = "黑体";
            objSel.Font.Size = 10.5f;
            
            objSel.TypeText("123");

            objRng.ListFormat.ApplyListTemplateWithLevel(template, bContinuePrevList, applyTo, defBehavior);
然后测试,发现会出现问题
如上图所示,在一级标题2之后插入二级标题,显示的是1.1,而不是2.1。
在这个问题上卡了大半天,后来找了大量资料后,发现vba代码一大堆的这只参数是有用的,所以先把所有的vba代码转换成c#代码
Object oOutlineNumbered = true;
            Object oName = "MyLT";

            Object owdListNumberStyleArabic = 0;
            Object wdOutlineNumberGallery = 3;

            Microsoft.Office.Interop.Word.Application app = Globals.ThisAddIn.Application;

            Word.ListTemplate lt = Globals.ThisAddIn.Application.ListGalleries[Word.WdListGalleryType.wdOutlineNumberGallery].ListTemplates[5];

            for (int i = 1; i < 10; i++)
            {
                lt.ListLevels[i].LinkedStyle = "";
                lt.ListLevels[i].NumberStyle = (Word.WdListNumberStyle)owdListNumberStyleArabic;
                lt.ListLevels[i].TextPosition = Globals.ThisAddIn.Application.CentimetersToPoints((float)1);
               // lt.ListLevels[i].TrailingCharacter = 0;
                lt.ListLevels[i].NumberPosition = Globals.ThisAddIn.Application.CentimetersToPoints((float)0);
                //lt.ListLevels[i].Alignment = 0;
                lt.ListLevels[i].StartAt = 1;
                lt.ListLevels[i].ResetOnHigher = i - 1;
            }

            lt.ListLevels[1].NumberFormat = "%1"; 
            lt.ListLevels[2].NumberFormat = "%1.%2";
            lt.ListLevels[3].NumberFormat = "%1.%2.%3";
            lt.ListLevels[4].NumberFormat = "%1.%2.%3.%4";
            lt.ListLevels[5].NumberFormat = "%1.%2.%3.%4.%5";
            lt.ListLevels[6].NumberFormat = "%1.%2.%3.%4.%5.%6";
            lt.ListLevels[7].NumberFormat = "%1.%2.%3.%4.%5.%6.%7";
            lt.ListLevels[8].NumberFormat = "%1.%2.%3.%4.%5.%6.%7.%8";
            lt.ListLevels[9].NumberFormat = "%1.%2.%3.%4.%5.%6.%7.%8.%9";

            object bContinuePrevList = false;
            object applyTo = Word.WdListApplyTo.wdListApplyToWholeList;
            object defBehavior = Word.WdDefaultListBehavior.wdWord9ListBehavior;
            
            Globals.ThisAddIn.Application.Selection.Range.ListFormat.ApplyListTemplateWithLevel(lt, bContinuePrevList, applyTo, defBehavior);

然后在设置level
objRng.SetListLevel(2);

这样每次在使用多级列表的时候只要设置ListLevel就行了。

         

你可能感兴趣的:(实现word的多级列表功能)