首页 > 解决方案 > 有没有办法用openxml制作一个只读段落?

问题描述

我正在使用 OpenXML 和 C# 生成一个 word 文档。我想阻止(只读)文本中的一个段落,以便用户在编辑时无法将其删除。

我做了一些不成功的测试,使整个文档成为只读的,但这不是我想要的。

var file = $"{directory}\\{fileName}.docx";
using (WordprocessingDocument package =
    WordprocessingDocument.Create(file, WordprocessingDocumentType.Document))
{
    package.AddMainDocumentPart();

    var documentProtection = new DocumentProtection();
    documentProtection.Edit = DocumentProtectionValues.ReadOnly;

    package.MainDocumentPart.AddNewPart<DocumentSettingsPart>();
    package.MainDocumentPart.DocumentSettingsPart.Settings = new Settings();

    package.MainDocumentPart.DocumentSettingsPart.Settings.AppendChild(documentProtection);
    package.MainDocumentPart.DocumentSettingsPart.Settings.Save();

    package.MainDocumentPart.Document = new Document(DocBody);
    package.MainDocumentPart.Document.Save();

    Process.Start(file);
}

以下是我为生成段落而编写的代码:

var paragraph = new Paragraph();
var run = new Run();
var properties = new RunProperties();
var paragraphProperties = new ParagraphProperties();

properties.FontSize = new FontSize();
properties.FontSize.Val = new StringValue("20");
properties.RunFonts = new RunFonts()
{
    Ascii = "Arial"
};
paragraphProperties.Justification = new Justification() { Val = JustificationValues.Center };

paragraph.Append(paragraphProperties);
run.Append(properties);

var text = new Text("Text content...") { Space = SpaceProcessingModeValues.Preserve };

run.Append(text);
paragraph.Append(run);

DocBody.Append(paragraph);

谢谢!

标签: c#ms-wordopenxml-sdk

解决方案


实用(但不是 100% 安全)的解决方案是将受保护的一个或多个段落包装在一个锁定的富文本内容控件中,即SdtBlock配置一个实例,使用户无法编辑或删除内容控件及其内容。

下面是一些示例标记,显示了一个锁定的内容控件,其中一个段落以这种方式保护,另一个段落在该内容控件之外。

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<w:document xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main">
  <w:body>
    <w:sdt>
      <w:sdtPr>
        <w:lock w:val="sdtContentLocked"/>
      </w:sdtPr>
      <w:sdtContent>
        <w:p>
          <w:r>
            <w:t>This is a protected paragraph.</w:t>
          </w:r>
        </w:p>
      </w:sdtContent>
    </w:sdt>
    <w:p>
      <w:r>
        <w:t>This is another, unprotected paragraph.</w:t>
      </w:r>
    </w:p>
  </w:body>
</w:document>

记下由Open XML SDK 中w:lock的类表示的元素。Lock

创建上述w:sdt元素所需的 C# 代码如下:

var sdt =
    new SdtBlock(
        new SdtProperties(
            new Lock { Val = LockingValues.SdtContentLocked }),
        new SdtContentBlock(
            new Paragraph(
                new Run(
                    new Text("This is a protected paragraph.")))));


推荐阅读