Ms word 写CR+;从数据库转换为开放式XML

Ms word 写CR+;从数据库转换为开放式XML,ms-word,newline,openxml,openxml-sdk,Ms Word,Newline,Openxml,Openxml Sdk,我试图获取存储在数据库中的一些数据,并使用OpenXMLSDK填充Word模板的内容控件。数据包含段落,因此其中包含回车符和换行符。数据以nvarchar的形式存储在数据库中 当我打开生成的文档时,CR+LF组合显示为一个带方框的问号(不确定该字符的名称)。这实际上是两个背靠背的序列,因此CR+LFCR+LF等于两个奇怪的字符: 如果我解压缩.docx,获取自定义XML部分并进行十六进制转储,我可以清楚地看到0d0a 0d0a,因此CR+LF就在那里。Word只是把它打印得很奇怪 我尝试在我的

我试图获取存储在数据库中的一些数据,并使用OpenXMLSDK填充Word模板的内容控件。数据包含段落,因此其中包含回车符和换行符。数据以
nvarchar
的形式存储在数据库中

当我打开生成的文档时,
CR
+
LF
组合显示为一个带方框的问号(不确定该字符的名称)。这实际上是两个背靠背的序列,因此
CR
+
LF
CR
+
LF
等于两个奇怪的字符:

如果我解压缩
.docx
,获取自定义XML部分并进行十六进制转储,我可以清楚地看到
0d0a 0d0a
,因此
CR
+
LF
就在那里。Word只是把它打印得很奇怪

我尝试在我的
XmlWriter
设置中强制使用UTF-8编码,但似乎没有帮助:

Dim docStream作为新内存流
作为XmlWriterSettings的Dim设置=新的XmlWriterSettings()
settings.Encoding=新的UTF8Encoding(False)
Dim docWriter As XmlWriter=XmlTextWriter.Create(docStream,设置)

有人知道如何让Word在通过Open XML SDK写入
.docx
时正确呈现这些字符吗?

要绑定到Word 2013富文本控件,您的XML元素必须包含完整的docx。见[MS-DOCX]:

存储在XML元素中的数据将是一个转义字符串,由一个扁平的WordprocessingML文档组成,表示结构化文档标记范围中的格式化数据

早期版本无法绑定富文本控件


但是,如果您绑定到纯文本控件,并将multiline设置为true,事情应该可以正常进行(使用CR/LF,而不是w:br)。

也许有助于理解Word不会保存CR/CRLF组合,而是使用XML构造—例如,一个带有“abc”的段落,然后是换行符,然后是“def”更像:abcdefCorrect@比巴迪亚提供了答案。我使用带有OpenXML编辑器的外接程序来分析正在发生的事情。您还可以使用自己开发的外接程序从VS进行调试,并在逐步执行时不断查看xml版本。@bibadia好的,这很有帮助。我可能只需要在数据库中的字符串上运行一个正则表达式替换来应用正确的标记。但是我尝试将这些标记手动添加到自定义XML部分,Word无法再读取文档。我包括了一些MSDN文章中的
w
名称空间,但这没有帮助。知道自定义XML部件的这些标记是否不同吗?我的错误-如果数据在自定义部件中,那么它不应该具有XML编码(除非您将在Word 2013中打开,并且您的控件是富文本控件,在这种情况下,自定义部件需要更多)。我在这里看到0d0a表示控件中的换行符。我想该控件可能没有设置为多行,但在这种情况下显示时,换行符就消失了。@bibadia好吧,我在Word 2013中打开,该控件是一个富文本控件。你能详细说明你所说的“更多”是什么意思吗?可能是MSDN与相关信息的链接?此外,我在属性中没有看到将控件设置为多行的选项。它位于哪里?它肯定需要是一个富文本控件。格式化它的能力是一项要求。绑定到预格式化的完整
.docx
实际上是有益的。虽然我不知道怎么做。我按照@bibadia的建议上传了一个Word XML文件。我使用LINQ从数据库中检索它。然后,我尝试使用
XmlWriter
将其作为字符串写入适当的元素。但是填充的是
System.Byte[]
。关于如何将完整的
.docx
写入自定义XML部件的任何提示?实际上,您可以通过w:sdtPr/w:rPr格式化纯文本控件,但只能统一格式化。对于扁平化的WordML,请参见《您需要2013年之前的完整docx绑定》,docx4j(Java)和www.nuget.org/packages/docx4j.NET/3.0.1支持这一点。