在 Word 中配置内容控件以添加新行
Configuring a Content Control in Word to add New Lines
我在 Word 模板中使用内容控件,我以编程方式向其中添加文本(使用 java)。这很好用。现在我想在文本中的每个新句子中插入一个新行。有没有办法配置内容控件,使其自动执行此操作?
您可以使用 w:br 元素,如下所示:
<w:p>
<w:sdt>
<w:sdtPr>
<w:id w:val="711844519"/>
</w:sdtPr>
<w:sdtContent>
<w:r>
<w:t>foo</w:t>
<w:br/>
<w:t>bar</w:t>
</w:r>
</w:sdtContent>
</w:sdt>
<w:r>
</w:p>
有关如何添加其中一个使用 docx4j 的信息,请参阅 linebreaks-in-strings
恐怕您无法将内容控件配置为自动执行此操作。
但是,如果您通过 Word 对象模型填充内容控件,则可以简单地使用富文本内容控件或纯文本内容控件,后者具有 "allow carriage returns (multiple paragraphs)" 选项(MultiLine 在对象模型)激活,并用包含换行符的文本填充它。
为了进行快速测试,我将这样一个纯文本内容控件添加到一个空文档中,并使用了以下 VBA 代码:
Sub FillContentControl()
ContentControls(1).Range.Text = "Sentence One." & vbNewLine & "Sentence Two."""
End Sub
在我的示例中,这产生了以下输出:
Sentence One.
Sententce Two.
您当然应该在 Java 代码中添加换行符。你只需要检测你的句子在哪里结束。
如果正如您对基于 docx4j 的解决方案的请求所表明的那样,您没有通过 Word 而是直接在 docx 中填写内容控件,我可以想到另一种涉及 VBA 宏的解决方法(我通常不会推荐):您可以为 Document.Open 事件添加一个事件处理程序来更新文档中所有标记的内容控件。它可能看起来像这样:
Private Sub Document_Open()
For Each ContentControl In ThisDocument.ContentControls
If ContentControl.Tag = "TODO_Add_Linebreaks" Then
ContentControl.Range.Text = Replace(ContentControl.Range.Text, ". ", "." & vbNewLine)
ContentControl.Tag = ""
End If
Next
End Sub
第二个解决方案要求您使用标签 "TODO_Add_Linebreaks"(或您喜欢的任何指示)添加您的内容控件,并使您的文档启用宏。
我在 Word 模板中使用内容控件,我以编程方式向其中添加文本(使用 java)。这很好用。现在我想在文本中的每个新句子中插入一个新行。有没有办法配置内容控件,使其自动执行此操作?
您可以使用 w:br 元素,如下所示:
<w:p>
<w:sdt>
<w:sdtPr>
<w:id w:val="711844519"/>
</w:sdtPr>
<w:sdtContent>
<w:r>
<w:t>foo</w:t>
<w:br/>
<w:t>bar</w:t>
</w:r>
</w:sdtContent>
</w:sdt>
<w:r>
</w:p>
有关如何添加其中一个使用 docx4j 的信息,请参阅 linebreaks-in-strings
恐怕您无法将内容控件配置为自动执行此操作。
但是,如果您通过 Word 对象模型填充内容控件,则可以简单地使用富文本内容控件或纯文本内容控件,后者具有 "allow carriage returns (multiple paragraphs)" 选项(MultiLine 在对象模型)激活,并用包含换行符的文本填充它。
为了进行快速测试,我将这样一个纯文本内容控件添加到一个空文档中,并使用了以下 VBA 代码:
Sub FillContentControl()
ContentControls(1).Range.Text = "Sentence One." & vbNewLine & "Sentence Two."""
End Sub
在我的示例中,这产生了以下输出:
Sentence One.
Sententce Two.
您当然应该在 Java 代码中添加换行符。你只需要检测你的句子在哪里结束。
如果正如您对基于 docx4j 的解决方案的请求所表明的那样,您没有通过 Word 而是直接在 docx 中填写内容控件,我可以想到另一种涉及 VBA 宏的解决方法(我通常不会推荐):您可以为 Document.Open 事件添加一个事件处理程序来更新文档中所有标记的内容控件。它可能看起来像这样:
Private Sub Document_Open()
For Each ContentControl In ThisDocument.ContentControls
If ContentControl.Tag = "TODO_Add_Linebreaks" Then
ContentControl.Range.Text = Replace(ContentControl.Range.Text, ". ", "." & vbNewLine)
ContentControl.Tag = ""
End If
Next
End Sub
第二个解决方案要求您使用标签 "TODO_Add_Linebreaks"(或您喜欢的任何指示)添加您的内容控件,并使您的文档启用宏。