【问题标题】:How to add OpenXml list paragraph with bullets to content control?如何将带有项目符号的 OpenXml 列表段落添加到内容控件?
【发布时间】:2015-07-31 01:33:50
【问题描述】:

我使用 Word 2013 .docx 作为在 openxml 代码中打开的模板,填充内容控件,然后将其保存,下载给用户,这部分工作正常。

在一个内容控件中,目标是添加一个项目符号列表。问题来自尝试附加或替换从方法生成的新段落。此方法工作正常,我将变量发送给它,它返回一个带有项目符号的段落。它插入,但它破坏了单词 doc;

下图是template.docx(上)和resulting.docx(下),只有下段不同,multiline=1后的空白区域;其余部分相同。如果我删除 run 元素,保存,尝试,我可以打开 word doc 并在那里查看格式化的项目符号列表,以便该部分“有效”,但错误是什么?

  public static Paragraph GenerateParagraph(string bulletText)
    {
        var element =
        new Paragraph(
        new ParagraphProperties(
        new ParagraphStyleId() { Val = "ListParagraph" },
        new NumberingProperties(
        new NumberingLevelReference() { Val = 1 },
        new NumberingId() { Val = 2 })),
        new Run(
        new Text(bulletText)) //Text you want to insert with bullet
        ) { RsidParagraphAddition = "00031711", RsidParagraphProperties = "00031711", RsidRunAdditionDefault = "00031711" };
        return element;
    }`

单词文档:

     <w:sdt>
<w:sdtPr>
 <w:rPr>
  <w:b w:val="0"/>
  <w:color w:val="000000" w:themeColor="text1"/>
  <w:sz w:val="24"/>
  <w:szCs w:val="24"/>
 </w:rPr>
 <w:tag w:val="custMilestones"/>
 <w:id w:val="-1610118874"/>
 <w:placeholder>
  <w:docPart w:val="DefaultPlaceholder_1081868574"/>
 </w:placeholder>
 <w:multiLine w:val="1"/>

   * in the file compare this original file was different, in this area with missing lines















</w:sdtPr>
<w:sdtEndPr/>
<w:sdtContent>
 <w:r w:rsidRPr="002C1BAC">
  <w:rPr>
   <w:b w:val="0"/>
   <w:color w:val="000000" w:themeColor="text1"/>
   <w:sz w:val="24"/>
   <w:szCs w:val="24"/>
  </w:rPr>
  <w:t xml:space="preserve">

  </w:t>
 </w:r>
 <w:r w:rsidR="00DD453F">
  <w:rPr>
   <w:b w:val="0"/>
   <w:color w:val="000000" w:themeColor="text1"/>
   <w:sz w:val="24"/>
   <w:szCs w:val="24"/>
  </w:rPr>
  <w:t xml:space="preserve">

  </w:t>
 </w:r>
</w:sdtContent>

以及生成的文件:

       <w:sdt>
<w:sdtPr>
 <w:rPr>
  <w:b w:val="0"/>
  <w:color w:val="000000" w:themeColor="text1"/>
  <w:sz w:val="24"/>
  <w:szCs w:val="24"/>
 </w:rPr>
 <w:tag w:val="custMilestones"/>
 <w:id w:val="-1610118874"/>
 <w:placeholder>
  <w:docPart w:val="DefaultPlaceholder_1081868574"/>
 </w:placeholder>
 <w:multiLine w:val="1"/>
 <w:p>
  <w:p w:rsidR="00031711" w:rsidP="00031711" w:rsidRDefault="00031711">
   <w:pPr>
    <w:pStyle w:val="ListParagraph"/>
    <w:numPr>
     <w:ilvl w:val="1"/>
     <w:numId w:val="2"/>
    </w:numPr>
   </w:pPr>
   <w:r>
    <w:t>
      Summary of outlines including the details of customer products and part numbers.
    </w:t>
   </w:r>
  </w:p>
 </w:p>
</w:sdtPr>
<w:sdtEndPr/>
<w:sdtContent>
 <w:r w:rsidRPr="002C1BAC">
  <w:rPr>
   <w:b w:val="0"/>
   <w:color w:val="000000" w:themeColor="text1"/>
   <w:sz w:val="24"/>
   <w:szCs w:val="24"/>
  </w:rPr>
  <w:t xml:space="preserve">

  </w:t>
 </w:r>
 <w:r w:rsidR="00DD453F">
  <w:rPr>
   <w:b w:val="0"/>
   <w:color w:val="000000" w:themeColor="text1"/>
   <w:sz w:val="24"/>
   <w:szCs w:val="24"/>
  </w:rPr>
  <w:t xml:space="preserve">

  </w:t>
 </w:r>
</w:sdtContent>

运行的代码,word doc 有一个名为 custMilestones 作为标记名的富文本内容控件*(它是使用富文本 cc 设置的),并且内容控件中有一个空格,否则代码将引发对象引用未设置异常.

      byte[] byteArray = System.IO.File.ReadAllBytes(fileName);
        using (MemoryStream mem = new MemoryStream())
        {
            mem.Write(byteArray, 0, (int)byteArray.Length);
            using (WordprocessingDocument wordDoc =
                WordprocessingDocument.Open(mem, true))
            {
                MainDocumentPart mainDoc = wordDoc.MainDocumentPart;
                Body bodyDoc = mainDoc.Document.Body;

                  foreach (var cc in wordDoc.ContentControls())
                {
                    SdtProperties props = cc.Elements<SdtProperties>().FirstOrDefault();
                    Tag tag = props.Elements<Tag>().FirstOrDefault();
                    dat1 = tag.Val.ToString();
                    switch (dat1)
                    {
                      case "custMilestones":

                         props.RemoveAllChildren<Paragraph>();
                         props.AppendChild<Paragraph>(new Paragraph(GenerateParagraph(custmilestone1)));

                       break;
                    default:
                       break;
                   }

编辑 7/30/15 生成的 xml 生成样式奇怪的结果:

     <w:sdt>
   <w:sdtPr>
    <w:rPr>
     <w:rStyle w:val="Style1"/>
     <w:b w:val="0"/>
     <w:szCs w:val="24"/>
    </w:rPr>
    <w:tag w:val="custmiles"/>
    <w:id w:val="568603642"/>
    <w:placeholder>
     <w:docPart w:val="D9E50C82EA8C4C45A237822288EB36B5"/>
    </w:placeholder>
    <w:showingPlcHdr/>
    <w15:appearance w15:val="hidden"/>
   </w:sdtPr>
   <w:sdtEndPr>
    <w:rPr>
     <w:rStyle w:val="DefaultParagraphFont"/>
     <w:sz w:val="36"/>
    </w:rPr>
   </w:sdtEndPr>
   <w:sdtContent>
    <w:r w:rsidRPr="00B87AB0" w:rsidR="00E73294">
     <w:rPr>
      <w:b w:val="0"/>
      <w:sz w:val="24"/>
      <w:szCs w:val="24"/>
     </w:rPr>
     <w:t xml:space="preserve"/>
    </w:r>
   </w:sdtContent>
  </w:sdt>
  <w:r w:rsidRPr="00B87AB0" w:rsidR="00C06C61">
   <w:rPr>
    <w:b w:val="0"/>
    <w:sz w:val="24"/>
    <w:szCs w:val="24"/>
   </w:rPr>
   <w:tab/>
   <w:sdt>
    <w:sdtPr>
     <w:id w:val="-206335861"/>
     <w:placeholder>
      <w:docPart w:val="DefaultPlaceholder_1081868574"/>
     </w:placeholder>
    </w:sdtPr>
    <w:sdtContent>
     <w:p w:rsidRDefault="00816E2A" w:rsidR="00816E2A" w:rsidP="00816E2A">
      <w:pPr>
       <w:pStyle w:val="ListParagraph"/>
       <w:numPr>
        <w:ilvl w:val="0"/>
        <w:numId w:val="1"/>
       </w:numPr>
       <w:ind w:leftChars="0"/>
      </w:pPr>
      <w:r>
       <w:t>
        this is test sentence1 for the software to make lists with numbers
       </w:t>
      </w:r>
     </w:p>
    <w:p w:rsidRDefault="00816E2A" w:rsidR="00816E2A" w:rsidP="00816E2A">
      <w:pPr>
       <w:pStyle w:val="ListParagraph"/>
       <w:numPr>
        <w:ilvl w:val="0"/>
        <w:numId w:val="1"/>
       </w:numPr>
       <w:ind w:leftChars="0"/>
      </w:pPr>
      <w:r>
       <w:t>
        this is test sentence2 for the software to make lists with numbers
       </w:t>
      </w:r>
      <w:bookmarkStart w:id="0" w:name="_GoBack"/>
      <w:bookmarkEnd w:id="0"/>
     </w:p>
     <w:p w:rsidRDefault="00816E2A" w:rsidR="00546790" w:rsidP="00816E2A">
      <w:pPr>
       <w:pStyle w:val="ListParagraph"/>
       <w:numPr>
        <w:ilvl w:val="0"/>
        <w:numId w:val="1"/>
       </w:numPr>
       <w:ind w:leftChars="0"/>
      </w:pPr>
      <w:r>
       <w:t>
        this is test sentence3 for the software to make lists with numbers         </w:t>
      </w:r>
     </w:p>
    </w:sdtContent>
   </w:sdt>
  </w:r>

【问题讨论】:

    标签: ms-word openxml wordprocessingml


    【解决方案1】:

    看起来您将段落插入到 &lt;w:sdtPr&gt; 标记而不是 &lt;w:sdtContent&gt; 标记中。

    <w:sdtPr>
    ...
     <w:p>
      <w:p w:rsidR="00031711" w:rsidP="00031711" w:rsidRDefault="00031711">
    ...
      </w:p>
     </w:p>
    </w:sdtPr>
    

    https://msdn.microsoft.com/en-us/library/documentformat.openxml.wordprocessing.sdtblock(v=office.14).aspx 指明段落的放置位置

    而且,你在一个段落里面有一个段落,我不认为这个词是那样的

    编辑:标签 sdtPr 和 sdtContent 没有出现

    【讨论】:

    • 我正在努力尝试将其插入到 sdtContent 中
    • 如果您在 w:Std 组件上,请使用 comp.Elements&lt;StdContent&gt;().GetFirstOrDefault() 找到 StdContent,如果您在 w:StdPr 上,请使用 comp.NextSiblin&lt;StdContent&gt;().GetFirstOrDefault() 找到它。如果结果不为空,只需对其执行 .Append(p)
    • 我无法弄清楚如何获取 cc.Elements 它获取 SdtContentCell 或 Block,并且它不允许 .GetFirstOrDefault()
    • 如果您查看我在答案中设置的链接,在“备注”部分中您可以找到信息SdtContentBlock &lt;w:sdtContent&gt;尝试cc.Elements&lt;SdtContentBlock&gt;().ElementAtOrDefault(0)
    • 好的,使用 cc.ChildElements.GetItem(1).Append(p);恰好在正确的位置插入了段落,但是 Word 有两个问题:首先字体和大小是粗体,18。必须是常规的,12。其次,Word 文档中的文本被用户锁定。您可以选择并复制它,但仅此而已,它不能被编辑。为什么是这样??目标是将文本放入文档并让用户能够编辑,这是一个要求。我发现子弹字符会使文本绕错;数字保持文本对齐,但无论我如何将 template.docx 设置为粗体/18
    猜你喜欢
    • 2015-05-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-26
    • 2019-09-16
    • 2021-11-27
    相关资源
    最近更新 更多