2016-09-07 85 views
0

C#限制编辑部分字段

允许用户编辑黄色段落。 但我得到这个文件: wrong document

我用字限制编辑功能,我的代码是:

//写入段落 
foreach (TaskChaptersModel chapter in listChapter) 
{ 
    paragraph = doc.Content.Paragraphs.Add(); 
    paragraph.Range.Text = chapter.chapterNo + " " + chapter.chapterName; 

    //标题1 
    if (!chapter.chapterNo.Contains(".")) 
    { 
     paragraph.Range.Font.Name = "宋体";//宋体 
     paragraph.Range.Font.Bold = 2;//加粗 
     paragraph.Range.Font.Size = 16;//三号 
     paragraph.Range.ParagraphFormat.Alignment = Word.WdParagraphAlignment.wdAlignParagraphCenter;//水平居中 
    } 
    else if (chapter.chapterNo.Select(c => c == '.').Count() == 1) 
    { 
     paragraph.Range.Font.Name = "宋体";//宋体 
     paragraph.Range.Font.Bold = 2;//加粗 
     paragraph.Range.Font.Size = 16;//三号 
     paragraph.Range.ParagraphFormat.Alignment = Word.WdParagraphAlignment.wdAlignParagraphLeft;//左对齐 
     paragraph.Format.LineSpacingRule = Word.WdLineSpacing.wdLineSpace1pt5; 
    } 
    else 
    { 
     paragraph.Range.Font.Name = "宋体";//宋体 
     paragraph.Range.Font.Size = 12;//三号 
     paragraph.Range.ParagraphFormat.Alignment = Word.WdParagraphAlignment.wdAlignParagraphLeft;//左对齐 
     paragraph.Format.LineSpacingRule = Word.WdLineSpacing.wdLineSpace1pt5; 
    } 
    paragraph.Range.InsertParagraphAfter(); 

    //------------------------------------------------------------------- 
    //This paragraph alow edit 
    paragraph = doc.Content.Paragraphs.Add(); 
    paragraph.Range.Text = "请您编辑,张三"; 
    paragraph.Range.Editors.Add(Word.WdEditorType.wdEditorEveryone); 
    paragraph.Range.InsertParagraphAfter();      
    //------------------------------------------------------------------- 
} 

doc.Protect(Word.WdProtectionType.wdAllowOnlyReading, false, "000", false, true); 

我的想法是在指定的段落添加编辑器。

+0

为什么你不能使用[允许更改受保护文档的部分?](https://support.office.com/en-gb/article/Allow -changes-to-parts-of-a-protected-document-187ed01c-8795-43e1-9fd0-c9fca419dadf) – PetLahev

回答

0

明白了: 1,创建文档 2,循环的所有段落在正确的paragra添加编辑ph 我发现在创建文档时我无法添加编辑器。

//写入段落

foreach (TaskChaptersModel chapter in listChapter) 
{ 
    if (chapter.chapterNo == null || chapter.chapterNo == "-1") 
    { 
     continue; 
    } 

    paragraph = doc.Content.Paragraphs.Add(); 
    paragraph.Range.Text = chapter.chapterNo + " " + chapter.chapterName; 

    //标题1 
    if (!chapter.chapterNo.Contains(".")) 
    { 
     paragraph.Range.Font.Name = "宋体";//宋体 
     paragraph.Range.Font.Bold = 2;//加粗 
     paragraph.Range.Font.Size = 16;//三号 
     paragraph.Range.ParagraphFormat.Alignment = Word.WdParagraphAlignment.wdAlignParagraphCenter;//水平居中 
    } 
    else if (chapter.chapterNo.Select(c => c == '.').Count() == 1) 
    { 
     paragraph.Range.Font.Name = "宋体";//宋体 
     paragraph.Range.Font.Bold = 2;//加粗 
     paragraph.Range.Font.Size = 16;//三号 
     paragraph.Range.ParagraphFormat.Alignment = Word.WdParagraphAlignment.wdAlignParagraphLeft;//左对齐 
     paragraph.Format.LineSpacingRule = Word.WdLineSpacing.wdLineSpace1pt5; 
    } 
    else 
    { 
     paragraph.Range.Font.Name = "宋体";//宋体 
     paragraph.Range.Font.Size = 12;//三号 
     paragraph.Range.ParagraphFormat.Alignment = Word.WdParagraphAlignment.wdAlignParagraphLeft;//左对齐 
     paragraph.Format.LineSpacingRule = Word.WdLineSpacing.wdLineSpace1pt5; 
    } 

    paragraph.Range.InsertParagraphAfter(); 
    paragraph = doc.Content.Paragraphs.Add();          
    //有编辑权限 
    if (chapter.wordFlag == "E") 
    { 
     paragraph.Range.Text = "请您编辑," + userName;       
    } 
    else 
    { 
     paragraph.Range.HighlightColorIndex = Word.WdColorIndex.wdGray25; 
    } 
    paragraph.Range.InsertParagraphAfter(); 
} 

foreach (Word.Paragraph p in doc.Paragraphs) 
{ 
    if (p.Range.Text.Contains("请您编辑")) 
    { 
     p.Range.Select(); 
     p.Range.Editors.Add(Word.WdEditorType.wdEditorEveryone); 
    } 
} 
1

你的想法是正确的,但是Word的行为与预期略有不同。我注意到,就像你一样,不管添加新的段落,新的段落都可以编辑,即使你没有在新的段落中专门添加编辑。

因此,您需要将其转换,将所有人都添加到完整文档中,并通过从要保护的部分中删除编辑器来解决其他问题。

为了给你一个想法,我创建了一小段VBA代码,但我相信你可以用C#重写你需要的部分。另请注意,我循环遍历编辑器,而不是使用DeleteAll()单独删除它们。我发现使用DeleteAll引发了意外的异常。

Sub TestRestrictDocument() 

    If ActiveDocument.ProtectionType <> wdNoProtection Then 
     ActiveDocument.Unprotect "000" 
    End If 

    ActiveDocument.Content.Editors.Add Word.WdEditorType.wdEditorEveryone 

    Dim paragraph As paragraph 

    For I = 1 To 5 

     Set paragraph = ActiveDocument.Paragraphs(I) 

     If I <> 4 Then 
      paragraph.Range.Select 

      Dim objEditor As Editor 

      If Selection.Editors.Count > 0 Then 
       For X = 1 To Selection.Editors.Count 
        Selection.Editors(X).Delete 
       Next 
      End If 
     End If 

    Next 

    ActiveDocument.Protect Word.WdProtectionType.wdAllowOnlyReading, False, "000", False, True 

End Sub 

这个例子显示了你,(我创建的文档与5段进行测试)所有,但第四段落进行编辑。很明显,你可以动态地创建你的文档,并删除编辑器。

一些旁注要记住,我碰到了,可能有所帮助:

  • 经常检查,如果你的文档已受到保护
  • 始终测试如果范围编辑删除
  • 避免DeleteAll在编辑器中由于某种原因
+0

对不起,对于迟到的回复, 我试过你的解决方案。我发现当我打开一个文档,它的工作原理,当我创建一个文档,它仍然faild。 我会在稍后尝试更多解决方案。 – mymbrooks

+0

注意解决方案,演示代码包含一行:[ActiveDocument.Content.Editors.Add Word.WdEditorType.wdEditorEveryone],所以如果你在现有页面上运行它,整个文档将再次获得一个编辑器。在现有文档中,您应该将其保留,并且仅在要更改的范围上删除/添加编辑器。 –