Ms word 如何将带有项目符号的OpenXml列表段落添加到内容控件?
我使用Word 2013.docx作为模板,在openxml代码中打开,填充内容控件,然后保存,下载给用户,这部分工作正常 在一个内容控件中,目标是添加项目符号列表。问题来自尝试附加或替换新段落,新段落是由方法生成的。这个方法工作得很好,我给它发送了一个变量,它返回一个带有项目符号的段落。它插入,但它破坏了doc这个词Ms word 如何将带有项目符号的OpenXml列表段落添加到内容控件?,ms-word,openxml,wordprocessingml,Ms Word,Openxml,Wordprocessingml,我使用Word 2013.docx作为模板,在openxml代码中打开,填充内容控件,然后保存,下载给用户,这部分工作正常 在一个内容控件中,目标是添加项目符号列表。问题来自尝试附加或替换新段落,新段落是由方法生成的。这个方法工作得很好,我给它发送了一个变量,它返回一个带有项目符号的段落。它插入,但它破坏了doc这个词 下面所示的是Tabel.Dox(上文)和结果.DOX(下),只有下一个段落是不同的,在多行=1之后,空白区域为;其余的都一样。如果我删除run元素,save,try,我可以打开w
下面所示的是Tabel.Dox(上文)和结果.DOX(下),只有下一个段落是不同的,在多行=1之后,空白区域为;其余的都一样。如果我删除run元素,save,try,我可以打开worddoc并查看格式化的项目符号列表,这样部分就“工作”,但是错误是什么呢
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;
}`
doc这个词:
<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的richtext内容控件*(它是用richtext cc设置的),作为标记名,contentcontrol中有一个空格,否则代码会抛出一个对象引用not set exception
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;
}
byte[]byteArray=System.IO.File.ReadAllBytes(文件名);
使用(MemoryStream mem=new MemoryStream())
{
mem.Write(byteArray,0,(int)byteArray.Length);
使用(WordProcessingDocumentWordDoc=
WordprocessingDocument.Open(mem,true))
{
MainDocumentPart mainDoc=wordDoc.MainDocumentPart;
Body bodyDoc=mainDoc.Document.Body;
foreach(wordDoc.ContentControls()中的var cc)
{
SdtProperties props=cc.Elements().FirstOrDefault();
Tag Tag=props.Elements().FirstOrDefault();
dat1=tag.Val.ToString();
开关(dat1)
{
案例“里程碑”:
props.RemoveAllChildren();
附属物(新段落(GenerateParagraph(custmilestone1));
打破
违约:
打破
}
编辑2015年7月30日,生成的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>
这是软件制作数字列表的测试语句1
这是软件制作数字列表的测试语句2
这是软件制作数字列表的测试语句3
看起来您将段落插入了
标记中,而不是
标记中
<w:sdtPr>
...
<w:p>
<w:p w:rsidR="00031711" w:rsidP="00031711" w:rsidRDefault="00031711">
...
</w:p>
</w:p>
</w:sdtPr>
...
...
指明将段落放在何处
更重要的是,你在一个段落中有一个段落,我不这么认为
编辑:标记sdtPr和sdtContent未出现我正在努力将其插入sdtContent中如果您在w:Std组件上,请使用
comp.Elements().GetFirstOrDefault()
查找StdContent,如果您在w:StdPr上,请使用comp.NextSiblin().GetFirstOrDefault()查找它
。如果结果不为空,只需在iti上执行.Append(p)即可。我不知道如何获取它获取的cc.Elements SdtContentCell或Block,如果您查看我在答案中“备注”部分中设置的链接,它将不允许使用.GetFirstOrDefault()您可以使用cc.ChildElements.GetItem(1).Append(p)查找信息SdtContentBlock
Trycc.Elements().ElementAtOrDefault(0)
ok;恰巧在正确的位置插入了段落,但Word有两个问题:第一,字体和大小是粗体的,18.必须是规则的,12.第二,Word文档中的文本被用户锁定。您可以选择并复制它,但仅此而已,它无法编辑。这是为什么?其目标是将文本放入文档并让用户能够编辑,这是一项要求。我发现项目符号使文本环绕错误;数字使文本保持对齐,但无论我如何设置模板。docx其粗体/18