【问题标题】:Restart List Numbering with C# Word Interop使用 C# Word 互操作重新启动列表编号
【发布时间】:2012-12-20 16:55:58
【问题描述】:

我有一个 Word 2010 模板,其中包含一些书签和样式,在从一些 XML 获取信息后,我必须使用它们来生成 Word 文档,并且我正在使用带有 Interop(8.3 版)的 c#。模板是给我的,我根本不能更改,因为它遵循公司的文档规则。

有时,当我使用模板的自定义编号列表样式时,编号搞砸了,莫名其妙地从 2 而不是 1 开始。其他时候,它遵循上一个列表的编号,而我并不总是这样发生。

如果我可以修改模板中的现有样式,或者使用我的程序中的ContinuePreviousList: false 应用自定义样式,那么修复这些情况会很容易,但是生成的 Word 文档必须具有它们强制的样式我来用。

如果我打开 Word 文档,请右键单击列表并选择 “从 1 点重新启动” 选项(我没有英文 Word,希望这是正确的翻译 em>),它解决了我可能遇到的大部分问题,但我不知道如何从 Interop 中使用它。我已经录制了宏,然后翻译成c#知道Word是怎么做一些功能的,但是当我开始录制宏时鼠标被锁定。有什么想法吗?

【问题讨论】:

    标签: c# ms-word interop


    【解决方案1】:

    鼠标已锁定,但您可以使用键盘上的right click mouse button 来获取上下文菜单,然后在录制宏时选择在 1 处重新启动。

    我最终使用 C# 互操作完成了这个:

    using System.Runtime.InteropServices;
    using MSWord = Microsoft.Office.Interop.Word;
    
    namespace ResetNumberingInWordDoc
    {
        class Program
        {
            static void Main()
            {
                var application = new MSWord.Application();
                var document = application.Documents.Open(@"C:\mydocument.docx");
    
                const int listNumber = 1; //The first list on the page is list 1, the second is list 2 etc etc
    
                document.Range().ListFormat.ApplyListTemplateWithLevel(
                    ListTemplate: document.ListTemplates[listNumber], 
                    ContinuePreviousList: false, 
                    ApplyTo: MSWord.WdListApplyTo.wdListApplyToWholeList,
                    DefaultListBehavior: MSWord.WdDefaultListBehavior.wdWord10ListBehavior);
    
                document.Save();
                document.Close();
    
                application.Quit();
    
                Marshal.ReleaseComObject(application);
            }
        }
    }
    

    【讨论】:

    • 我的 ListFormat 中似乎没有ApplyListTemplateWithLevel 方法,可能是因为我的互操作版本太旧了,但是您的代码是我在使用“右键单击鼠标”录制宏时看到的按钮”,谢谢!
    • 另一种似乎对我有用的方法,一旦你找到了编号列表格式的段落,将“List_Norm”样式应用于列表的数字(而不是列表内容)。这是我的第一篇文章,所以我不知道如何继续,即使我已经接受了你的问题,我是否应该用另一个解决方案来回答我自己的问题?
    【解决方案2】:

    我发现了执行 "Restart at 1" 函数查看录制的宏的确切方法。找到带有编号列表样式的段落后,您必须选择要“从 1 重新开始”的编号并应用“List_Norm”样式:

    listParagraph.SelectNumber(); //Select numbers from the NumberList paragraph
    application.Selection.set_Style(document.Styles["List_Norm"]); //Apply "List_Norm" style
    

    这样,列表的内容将保持原来的样式,但列表将从 1 开始。

    可以应用相同的代码重新启动标题样式,但应用“Tit_List”样式而不是“List_Norm”。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-12-21
      • 1970-01-01
      • 1970-01-01
      • 2013-02-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多