如何在受保护的Word文档

时间:2018-06-09 16:48:20

标签: c# ms-word vsto

列出项目

我正在使用Visual Studio 2017中的VSTO和c#为表单填写应用程序实现Word模板,并希望利用Word重复节内容控件。但是,在我之前保护文档以填写表单之后,我无法以编程方式应用此类控件。在保护文档之前,在此上下文中取消保护文档似乎不会将文档返回到相同的不受保护的状态。这是一个精简的演示程序,以突出问题:

在Visual Studio中创建一个新的Word 2013和2016 VSTO模板项目,让项目使用未更改的默认空白文档模板,将以下代码添加到ThisDocument分部类

private void ThisDocument_Startup(object sender, System.EventArgs e)
    {
        //Demonstrates an unexpected impact of protecting then subsequently unprotecting a document 
        AddTableDirect();
        DocProtect();
        DocUnprotect();
        AddTableRepeatingSection();
    }
    private void ThisDocument_Shutdown(object sender, System.EventArgs e)
    {
    }
    private void DocProtect()
    {
        //Protects the active document restricting the operator to form filling
        object noReset = true;
        object password = System.String.Empty;
        object useIRM = false;
        object enforceStyleLock = false;
        this.Protect(Word.WdProtectionType.wdAllowOnlyFormFields,
            ref noReset, ref password, ref useIRM, ref enforceStyleLock);
    }
    private void DocUnprotect()
    {
        // Unprotects the active document allowing programmatic manipulation
        object password = System.String.Empty;
        this.Unprotect(ref password);
    }
    private void AddTableDirect()
    {
        //Creates a one row table directly adding a single plain text content control
        Word.Range range = this.Sections[1].Range.Paragraphs[1].Range;
        Word.Table table = this.Tables.Add
            (range, 1, 1, Word.WdDefaultTableBehavior.wdWord9TableBehavior, Word.WdAutoFitBehavior.wdAutoFitWindow);
        Word.ContentControl cc = this.ContentControls.Add
            (Word.WdContentControlType.wdContentControlText, table.Cell(1, 1).Range);
    }
    private void AddTableRepeatingSection()
    {
        //Programatically duplicates the table as a repeating section
        Word.Table table = this.Sections[1].Range.Tables[1];
        Word.Range rSRange = table.Range;
        Word.ContentControl rSCC = this.ContentControls.Add
            (Word.WdContentControlType.wdContentControlRepeatingSection, rSRange);
        rSCC.RepeatingSectionItems[1].InsertItemAfter();
    }

如果您按原样构建并运行此代码,则生成带有文本的System.Runtime.InteropServices.COMException:“此方法或属性不可用,因为当前选择部分涵盖了纯文本内容控件”在添加了在AddTableRepeatingSection()方法(InsertItemAfter之前的行)中重复部分控制。

但是,如果您在DocProtect()中注释掉DocUnprotect()ThisDocument_StartUp语句,则此代码会成功运行。

在以编程方式应用重复节内容控件时,我需要更改哪些内容才能保护和取消保护文档而不会生成此异常?

1 个答案:

答案 0 :(得分:1)

我可以复制你所看到的内容 - 我不知道它为什么会这样做,似乎几乎是某种竞争条件,因为在文档打开后(点击“继续”)它会手动工作...... < / p>

我找到了解决方法。似乎选择表格会导致Word在其所属的第一个单元格中拾取内容控件:

private void AddTableRepeatingSection()
{
    //Programatically duplicates the table as a repeating section
    Word.Table table = this.Sections[1].Range.Tables[1];
    Word.Range rSRange = table.Range;
    rSRange.Select();
    Word.Range r = this.Application.Selection.Range;
    Word.ContentControl rSCC = this.ContentControls.Add
        (Word.WdContentControlType.wdContentControlRepeatingSection, r);
    rSCC.RepeatingSectionItems[1].InsertItemAfter();
}