再谈列宽设置
由于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)