【问题标题】:Writing CR+LF into Open XML from a Database将 CR+LF 从数据库写入 Open XML
【发布时间】: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


【解决方案1】:

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

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

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

如果您绑定到纯文本控件,并且将 multiline 设置为 true,那么一切应该可以正常工作(使用 CR/LF,而不是 w:br)。

【讨论】:

  • 绝对需要一个富文本控件。格式化它的能力是一个要求。绑定到预先格式化的完整 .docx 实际上是有益的。虽然我不知道该怎么做。我按照@bibadia 的建议上传了一个Word XML 文件。我使用 LINQ 从数据库中检索它。然后我尝试使用我的XmlWriter 将其作为字符串写入适当的元素。但是填充的是System.Byte[]。关于如何将完整的.docx 写入自定义 XML 部分的任何提示?
  • 您实际上可以通过 w:sdtPr/w:rPr 格式化纯文本控件,但只能统一。
  • 对于扁平化的 WordML,请参阅blogs.msdn.com/b/ericwhite/archive/2008/09/29/…
  • 在您需要 2013 年之前的完整 docx 绑定,docx4j (Java) 和 www.nuget.org/packages/docx4j.NET/3.0.1 支持。
猜你喜欢
  • 2010-12-04
  • 1970-01-01
  • 2014-11-19
  • 2011-08-06
  • 2011-03-07
  • 1970-01-01
  • 1970-01-01
  • 2019-03-14
相关资源
最近更新 更多