再谈列宽设置

由于Word的表格没有列的概念,所以当一个表格存在合并单元格的时候,设置列宽将稍微繁琐一点。

本节的任务是设计一个下图所示的表格:

为方便理解,我们按步骤来讲述设计过程。

一、计算表宽

一般来说,表格的宽度就是也页宽,我们可以在命令窗口执行下面的代码,得到页宽,也就是表宽:

 

Dim wdc As New WordCreator

'设置纸张的代码

Return wdc.PageSize.Width - wdc.LeftMargin - wdc.RightMargin

 

或者:
 

Dim wdc As New WordCreator

'设置纸张的代码

Return wdc.ClientRectangle.Width

执行上述代码后,得到页面宽度是467.7。

二、定义列宽

定义一个数组,用于存储每一列的宽度,数组元素之和约等于页面宽度,也就是467.7
 

表格有五列,第一列和第三列的宽度为45,剩下的宽度为467.7-45*2= 377.7,所以其他列的宽度为377.7/3=125.9

 

Dim wdc As New WordCreator()

Dim tb As New Word.Objects.RtfTable(6, 5)

wdc.Add(tb)

tb.Alignment = ContentAlignment.TopCenter '表格位置居中

Dim widths() As Double = {45, 125.9, 45, 125.9, 125.9} '用数组存储列宽,数组之和 约为467.7,也就是页宽

 

三、设置列宽

 

接下来先合并单元格,然后设置列宽,

因为Word的表格并没有列的概念,所以只能逐行去设置每个单元格的宽度。
 

需要注意的是:

 

1、对于垂直合并的单元格,在合并单元格的第一行设置此单元格的宽度。

2、对于水平合并的单元格,单元格宽度设为所有合并列的宽度之和。

3、RtfRow和RtfCell都有Index属性,前者返回行号(第几行),后者返回单元格编号(所在行的第几个单元格),都是从0开始编号。

 

 

基于上述三点,复杂表格的列宽设置变得简单了,下面是完整的代码:

 

 

Dim wdc As New WordCreator()
Dim
tb As New Word.Objects.RtfTable(6, 5)
wdc.Add(tb)
tb.Alignment = ContentAlignment.TopCenter
'表格位置居中
Dim
widths() As Double = {45, 125.9, 45, 125.9, 125.9} '用数组存储列宽,数组之和为467.7,也就是页宽
tb.Rows(0).Cells(4).SetMerged(5, 1)
'1行第5个单元格向下合并5
tb.Rows(3).Cells(1).SetMerged(1, 3)
'4行第2个单元格向右合并3
tb.Rows(5).Cells(0).SetMerged(1, 5)
'6行第1个单元格向右合并5
For
Each tr As Word.Objects.RtfRow In tb.Rows '遍历行
    tr.Height = 25
'设置默认行高
   
For Each cl As Word.Objects.RtfCell In tr.Cells '遍历单元格
        cl.SetRectBorder(Word.RtfBorderStyle.Single, color.Black, 1)
'设置默认边框
       
Select Case tr.Index
           
Case 0 '正常设置第一行各单元格的宽度
                cl.Width = widths(cl.Index)
           
Case 1, 2, 4 '对于第二、第三和第五行
               
If cl.Index <> 4 Then '这三行的第五个单元格被合并了,不需要设置宽度 ,所以要跳过
                     cl.Width = widths(cl.Index)
'其他单元格正常设置宽度
               
End If
           
Case 3 '如果是第四行 ,只需设置头两个单元格
               
If cl.Index = 0 Then
                    cl.Width = widths(0)
'正常设置第一个单元格的宽度
               
ElseIf cl.Index = 1 Then '第二个单元格合并了三列,所以其宽度为合并列宽度之和
                     cl.Width = widths(1) + widths(2) + widths(3)
               
End If
           
Case 5 '第五行全部合并了,只有一个单元格,其宽度等于所有列宽之和,也就是467.7
                cl.Width = 467.7
'
widths(0) + widths(1) + widths(2) + widths(3) + widths(4)
       
End Select
   
Next
Next

tb.Rows(5).Height = 75
'设置第六行的高度
Dim
fl As String = "c:\temp\test.docx"
wdc.Save(fl)
Process.Start(fl)


本页地址:http://www.foxtable.com/webhelp/topics/6040.htm