如何根据数据类型设置MS表列的文本对齐方式?

时间:2018-07-09 09:47:45

标签: c# ms-word

我试图像这样在MS Word的表格上显示类列表中的属性值:

public void CreateTable<T>(IList<T> list)
{
    if (list != null)
    {
        var props = typeof(T).GetProperties();

        Range tableLoc = WdDoc.Range();            

        var table = WdDoc.Tables.Add(tableLoc, list.Count, props.Length);  

        for (int i = 0; i < props.Length; i++)
        {
            table.Columns[i + 1].Select();                    
            if (props[i].PropertyType == typeof(double))
            {                        
                WdApp.Selection.Range.ParagraphFormat.Alignment = WdParagraphAlignment.wdAlignParagraphRight;
            }
            else
            {                        
                WdApp.Selection.Range.ParagraphFormat.Alignment = WdParagraphAlignment.wdAlignParagraphCenter;
            }
        }

        //...
    }
}

我尝试根据填充属性类型自动设置列的文本对齐方式。 但是,只能将每列的第一行设置为我分配的正确对齐方式。 其他行将始终设置为for循环的最新对齐方式。 为什么会这样呢?我想念任何片段吗?

此外,两者之间有什么区别

WdApp.Selection.Paragraphs.Format.Alignment = WdParagraphAlignment.wdAlignParagraphCenter;

WdApp.Selection.Range.ParagraphFormat.Alignment = WdParagraphAlignment.wdAlignParagraphCenter;

谢谢!

1 个答案:

答案 0 :(得分:1)

问题来自在使用Word对象模型的此特定实例中使用Selection.Range。使用列时,您需要使用

WdApp.Selection.ParagraphFormat.Alignment

背景

Selection会完全影响所选内容-整个列。

Selection.Range影响所选内容的 Range 。对于列,Selection.Range不能不是是整个列。 Word中的范围必须是连续的文本行,但列不是连续的。因此Selection.Range仅返回选择的连续部分:第一个单元格(行)。这就解释了为什么只有表格的第一行会受到当前代码的影响。

所选列出现连续时,这只是给用户带来方便。在幕后,一列和下一列中的单元格之间的行中的所有内容都使文本运行中断。

如果您熟悉HTML,请考虑如何在HTML中定义表。 Word Open XML定义表的方式基于相同的原理。这个概念看起来像这样:

<table><row><cell><cell></row><row><cell><cell><row></table>

行及其内容是连续的。