【发布时间】:2014-04-24 07:34:32
【问题描述】:
我正在尝试获取一些存储在数据库中的数据,并使用 Open XML SDK 填充 Word 模板的内容控件。数据包含段落,因此其中有回车符和换行符。数据在数据库中存储为nvarchar。
当我打开生成的文档时,CR+LF 组合显示为一个带框的问号(不确定该字符的名称)。这实际上是两个背靠背的序列,所以CR+LFCR+LF等于两个奇怪的字符:
如果我解压缩.docx,获取自定义XML 部分并进行十六进制转储,我可以清楚地看到0d0a 0d0a,所以CR+LF 就在那里。 Word 只是打印出来很奇怪。
我已尝试在 XmlWriter 的设置中强制执行 UTF-8 编码,但这似乎没有帮助:
Dim docStream As New MemoryStream
Dim settings As XmlWriterSettings = New XmlWriterSettings()
settings.Encoding = New UTF8Encoding(False)
Dim docWriter As XmlWriter = XmlTextWriter.Create(docStream, settings)
有谁知道当通过 Open XML SDK 写入 .docx 时如何让 Word 正确呈现这些字符?
【问题讨论】:
-
也许有助于理解 Word 不会保存 CR/CRLF 组合,而是具有 XML 结构 - 例如一个带有“abc”的段落,然后是一个换行符,然后是“def”会更像:
abc def -
正确。 @bibadia 提供了答案。我使用带有 Open XML 编辑器的加载项来分析正在发生的事情。您还可以使用您开发的插件从 VS 进行调试,并在单步执行时不断查看 xml 版本。
-
@bibadia 好的,这很有帮助。我可能只对数据库中的字符串运行正则表达式替换以应用正确的标签。但我尝试将这些标签手动添加到自定义 XML 部分,Word 无法再读取该文档。我在一些 MSDN 文章中包含了
w命名空间,但这并没有帮助。知道这些标签对于自定义 XML 部件是否不同? -
我的错误 - 如果数据进入自定义部分,那么它不应该具有 XML 编码(除非您要在 Word 2013 中打开并且您的控件是富文本控件,其中如果自定义零件需要更多)。我在这里看到 0d0a 是控件中的换行符。我想有可能控件没有设置为多行,但是在这种情况下显示时,换行符会消失。
-
@bibadia 好吧,我am 在 Word 2013 中打开,控件是富文本控件。您能否详细说明“相当多”的含义?可能是包含相关信息的 MSDN 链接?此外,我在属性中看不到将控件设置为多行的选项。它在哪里?
标签: ms-word newline openxml openxml-sdk