C#开发Word插件时Range.FitTextWidth始终返回0,如何正确使用或替代?
关于
Range.FitTextWidth返回0的原因及正确用法 你遇到的返回0的情况是正常的,FitTextWidth本身就不是用来读取现有内容宽度的属性:它是一个配置项,作用是指定Word是否要自动调整该区域内的字符间距,把文本宽度强制对齐到你设置的数值,默认值就是0,代表不启用自动适配宽度的功能,所以你没有主动设置过的话读取永远返回0。
它的正确用法示例:
// 将选中区域的文本强制适配为150磅宽度,Word会自动调整字符间距 selectedRange.FitTextWidth = 150f; // 此时读取该属性会返回150 float widthSetting = selectedRange.FitTextWidth;
替代方案:获取Range实际内容宽度
最稳定的实现方式是通过Range.Information属性读取区域首尾的水平坐标做差计算:
using Word = Microsoft.Office.Interop.Word; // 获取当前选中的Range Word.Range selectedRange = Application.Selection.Range; // 读取区域第一个字符的左边界坐标(单位:磅) float leftPos = (float)selectedRange.Information[Word.WdInformation.wdHorizontalPositionRelativeToPage]; // 读取区域最后一个字符的右边界坐标 float rightPos = (float)selectedRange.Characters.Last.Information[Word.WdInformation.wdHorizontalPositionRelativeToPage] + (float)selectedRange.Characters.Last.Information[Word.WdInformation.wdWidth]; // 计算得到实际内容宽度 float actualWidth = rightPos - leftPos;
注意事项
- 计算得到的数值单位为磅,1 磅 = 1/72 英寸 = 约0.3527毫米,需要其他单位可自行换算
- 如果选中区域存在跨行的情况,该方法得到的是首行开头到末行末尾的水平差值,需要逐行宽度的话可先将Range按行拆分后分别计算
- 该方法对区域内包含的内嵌图片、表格等非文本内容同样生效,会将对应对象的宽度纳入计算
内容的提问来源于stack exchange,提问作者nomacreates
相关产品推荐
相关产品推荐

