2

我将 Office Interop 与 MS Word (Microsoft.Office.Interop.Word) 和 Microsoft.Office.Tools.Word 一起使用来修改 Word 加载项中的 Word 文档。我有一个包含我要编辑的特定文本的范围。

当我更新 Text 对象时,Range 的段落格式被重置,特别是 Alignment 和 LeftIndent。我可以将 Alignment 和 LeftIndent 保存在临时变量中并重置它们,但这并不理想。有没有办法阻止 ParagraphFormat 被重置,如果没有,是否还有其他我可能忘记需要保存的属性(我刚刚意识到前后段落间距也会被重置......)。

Microsoft.Office.Interop.Word.Range range = myObject.range;
var oldAlignment = range.ParagraphFormat.Alignment;
var oldLeftIndent = range.ParagraphFormat.LeftIndent;

range.Text = "new text";
range.ParagraphFormat.Alignment = oldAlignment;
range.ParagraphFormat.LeftIndent = oldLeftIndent;

编辑:我只是尝试将 ParagraphFormat 保存为临时变量,然后用它重置格式,但是临时变量也丢失了它的格式。

oldParagraphFormat = range.ParagraphFormat;
range.Text = "new text";
range.ParagraphFormat = oldParagraphFormat; // oldParagraphFormat's objects are reset
4

1 回答 1

5

Range.ParagraphFormat在更改文本之前尝试创建对象的副本。您可以通过ParagraphFormat.Duplicate对象执行此操作。这将保留旧的 ParagraphFormat 值。更改范围的文本并重置其 ParagraphFormat 后,您可以从副本中恢复值。

// Get current value of ParagraphFormat.
Microsoft.Office.Interop.Word.Range range = myObject.range;
var oldParagraphFormat = myObject.range.ParagraphFormat.Duplicate;

// Change the range's text. This will reset ParagraphFormat, so reapply the previous value.
range.Text = "new text";
range.ParagraphFormat = oldParagraphFormat;

关于发生了什么的一些背景:更改Range.Text本质上会重置 Range 对象,因为 Range 是文本 + 格式。因此,在不包含任何格式信息的情况下更改文本将导致所有以前的格式丢失。(很像更改 HTML 标记的 innerText 属性会导致该标记丢失所有子标记。)

如果复制 ParagraphFormat 没有帮助,那么您可能需要考虑设置Range.FormattedText属性而不是 Range.Text。

于 2012-10-11T13:45:22.497 回答