编辑Word文档范围的文本将删除段落格式

问题描述 投票:2回答:1

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

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

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保存为临时变量,然后使用该变量重置格式,但是temp变量也丢失了其格式。

oldParagraphFormat = range.ParagraphFormat;
range.Text = "new text";
range.ParagraphFormat = oldParagraphFormat; // oldParagraphFormat's objects are reset
c# ms-word vsto add-in office-interop
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。

© www.soinside.com 2019 - 2024. All rights reserved.