第11章:表格结构与格式
学习目标
- 理解表格的XML结构层次
- 掌握表格、行、单元格的结构
- 理解单元格合并怎么表示
- 掌握表格宽度和边框设置
- 理解表格样式的作用
11.1 表格整体结构
在Word中,表格是块级元素,和段落同级别,直接放在body中。
表格的XML结构层次:
<w:tbl> <!-- 表格 Table -->
<w:tblPr> <!-- 表格属性 -->
<!-- 表格级别格式设置 -->
</w:tblPr>
<w:tblGrid> <!-- 表格网格定义列宽度 -->
<w:gridCol w:w="2880"/> <!-- 第一列 -->
<w:gridCol w:w="2880"/> <!-- 第二列 -->
<w:gridCol w:w="2880"/> <!-- 第三列 -->
</w:tblGrid>
<w:tr> <!-- 行 Table Row -->
<w:trPr> <!-- 行属性 -->
</w:trPr>
<w:tc> <!-- 单元格 Table Cell -->
<w:tcPr> <!-- 单元格属性 -->
</w:tcPr>
<w:p>...</w:p> <!-- 单元格内容:可以放段落 -->
</w:tc>
<w:tc>...</w:tc>
<!-- ... 更多单元格 ... -->
</w:tr>
<w:tr>...</w:tr>
<!-- ... 更多行 ... -->
</w:tbl>
层次很清晰:
w:tbl→ 整个表格w:tblPr→ 表格属性w:tblGrid→ 定义列网格w:tr→ 每一行w:tc→ 每个单元格- 单元格内可以放段落、甚至嵌套表格
11.2 表格属性 tblPr
表格属性包含整个表格的格式设置。
表格宽度 w:tblW
<w:tblPr>
<w:tblW w:w="5000" w:type="pct"/> <!-- 宽度50%页面宽度 -->
</w:tblPr>
w:type有两种:
| type | 说明 |
|---|---|
pct | 百分比,w:w 单位是百分之一百分点(50% → 5000) |
dxa | 绝对宽度,单位缇 |
例子:
- 宽度100%:
<w:tblW w:w="10000" w:type="pct"/> - 宽度10厘米:大概5670缇 →
<w:tblW w:w="5670" w:type="dxa"/>
对齐方式 w:jc
表格对齐和段落对齐类似:
<w:jc w:val="center"/> <!-- 表格居中 -->
值:left, center, right
表格边框 w:tblBorders
设置整个表格边框:
<w:tblBorders>
<w:top w:val="single" w:sz="4" w:color="000000"/>
<w:left w:val="single" w:sz="4" w:color="000000"/>
<w:bottom w:val="single" w:sz="4" w:color="000000"/>
<w:right w:val="single" w:sz="4" w:color="000000"/>
<w:insideH w:val="single" w:sz="4" w:color="000000"/>
<w:insideV w:val="single" w:sz="4" w:color="000000"/>
</w:tblBorders>
top,left,bottom,right:四条外边框insideH:内部水平边框(行之间)insideV:内部垂直边框(列之间)
属性和段落边框一样:
w:val:样式(single单线,double双线等)w:sz:粗细,1/8磅w:color:RGB颜色
所以所有框都有就是上面例子那样,如果要无框就都设为none。
表格样式 w:tblStyle
可以引用表格样式:
<w:tblPr>
<w:tblStyle w:val="TableGrid"/>
</w:tblPr>
TableGrid是Word内置的网格表格样式。
11.3 网格定义 tblGrid
tblGrid定义表格有多少列,每列宽度:
<w:tblGrid>
<w:gridCol w:w="2000"/> <!-- 第一列宽度 2000缇 -->
<w:gridCol w:w="3000"/> <!-- 第二列宽度 3000缇 -->
<w:gridCol w:w="2000"/> <!-- 第三列宽度 2000缇 -->
</w:tblGrid>
即使后来单元格合并了,原来的gridCol定义还是保留,这是网格基础。
11.4 行 tr
每一行用<w:tr>表示:
<w:tr>
<w:trPr>
<!-- 行属性 -->
<w:cantSplit/> <!-- 不允许跨页断行 -->
</w:trPr>
<!-- 单元格 -->
<w:tc>...</w:tc>
<w:tc>...</w:tc>
</w:tr>
常用行属性:
| 元素 | 作用 |
|---|---|
<w:cantSplit/> | 整行不允许跨页断行 |
<w:trHeight w:val="..." w:hRule="..."/> | 行高设置 |
行高
<w:trHeight w:val="600" w:hRule="atLeast"/>
hRule:
atLeast:最小值,至少这么高,内容多可以撑开exact:精确高度,内容多了也不变auto:自动高度
11.5 单元格 tc
每个单元格用<w:tc>表示:
<w:tc>
<w:tcPr>
<!-- 单元格属性 -->
<w:tcW w:w="2880" w:type="dxa"/> <!-- 单元格宽度 -->
<w:vMerge/> <!-- 垂直合并 -->
<w:gridSpan w:val="2"/> <!-- 水平合并跨2列 -->
</w:tcPr>
<w:p>
<!-- 单元格内容,至少一个段落 -->
<w:r><w:t>单元格内容</w:t></w:r>
</w:p>
</w:tc>
单元格宽度 w:tcW
<w:tcW w:w="2880" w:type="dxa"/>
单位通常是dxa(缇)。
单元格垂直对齐 w:vAlign
<w:vAlign w:val="center"/> <!-- 垂直居中 -->
值:top, center, bottom, both
边框
单元格也可以单独设置边框:
<w:tcPr>
<w:tcBorders>
<w:top w:val="single" w:sz="4" w:color="000000"/>
<!-- ...其他边... -->
</w:tcBorders>
</w:tcPr>
单元格边框优先级高于表格边框。
背景底纹
<w:shd w:fill="EEEEEE"/> <!-- 灰色背景 -->
11.6 单元格合并
单元格合并分水平合并和垂直合并。
水平合并
水平合并用w:gridSpan,表示跨几列:
<!-- 第一行第一单元格,跨2列 -->
<w:tc>
<w:tcPr>
<w:gridSpan w:val="2"/> <!-- 跨2列 -->
</w:tcPr>
</w:tc>
意思就是:这个单元格占据原来网格的2列宽度。剩下的单元格还是每列一个。
很简单,一句话:跨n列就写gridSpan=“n”,其他被跨的列不需要格子。
垂直合并
垂直合并用w:vMerge,稍微复杂一点:
<!-- 第一行 -->
<w:tr>
<w:tc>
<w:tcPr>
<w:vMerge w:val="restart"/> <!-- 开始垂直合并 -->
</w:tcPr>
</w:tc>
</w:tr>
<!-- 第二行 -->
<w:tr>
<w:tc>
<w:tcPr>
<w:vMerge/> <!-- 继续合并,没有val就是继续 -->
</w:tcPr>
</w:tc>
</w:tr>
<!-- 第三行 -->
<w:tr>
<w:tc>
<w:tcPr>
<w:vMerge/> <!-- 继续合并 -->
</w:tcPr>
</w:tc>
</w:tr>
规则:
- 第一个单元格:
<w:vMerge w:val="restart"/>开始合并 - 后续要合并的单元格:只写
<w:vMerge/>不写val,表示继续 - 合并到哪里就到哪里结束
这样就从第一行开始垂直合并了3行。
11.7 嵌套表格
单元格里面可以再放表格,实现复杂布局:
<w:tc>
<w:p>...</w:p>
<w:tbl> <!-- 嵌套表格 -->
<!-- ...表格结构... -->
</w:tbl>
<w:p>...</w:p>
</w:tc>
Word支持任意嵌套,只要你需要。
11.8 完整例子:简单的两列表格
让我们看一个完整的简单例子:
<w:tbl>
<w:tblPr>
<w:tblW w:w="10000" w:type="pct"/> <!-- 100%宽度 -->
<w:jc w:val="center"/>
<w:tblBorders>
<w:top w:val="single" w:sz="4" w:color="000000"/>
<w:left w:val="single" w:sz="4" w:color="000000"/>
<w:bottom w:val="single" w:sz="4" w:color="000000"/>
<w:right w:val="single" w:sz="4" w:color="000000"/>
<w:insideH w:val="single" w:sz="4" w:color="000000"/>
<w:insideV w:val="single" w:sz="4" w:color="000000"/>
</w:tblBorders>
</w:tblPr>
<w:tblGrid>
<w:gridCol w:w="3000"/>
<w:gridCol w:w="5000"/>
</w:tblGrid>
<!-- 表头行 -->
<w:tr>
<w:tc>
<w:tcPr>
<w:shd w:fill="DDDDDD"/>
</w:tcPr>
<w:p><w:r><w:t>姓名</w:t></w:r></w:p>
</w:tc>
<w:tc>
<w:tcPr>
<w:shd w:fill="DDDDDD"/>
</w:tcPr>
<w:p><w:r><w:t>职业</w:t></w:r></w:p>
</w:tc>
</w:tr>
<!-- 数据行1 -->
<w:tr>
<w:tc><w:p><w:r><w:t>张三</w:t></w:r></w:p></w:tc>
<w:tc><w:p><w:r><w:t>工程师</w:t></w:r></w:p></w:tc>
</w:tr>
<!-- 数据行2 -->
<w:tr>
<w:tc><w:p><w:r><w:t>李四</w:t></w:r></w:p></w:tc>
<w:tc><w:p><w:r><w:t>设计师</w:t></w:r></w:p></w:tc>
</w:tr>
</w:tbl>
这个例子:
- 表格宽度100%页面宽度
- 全部边框黑色单线
- 两列,第一列3000缇,第二列5000缇
- 表头灰色背景
- 两行数据
11.9 完整例子:合并单元格
带合并单元格的例子:
<w:tbl>
<w:tblPr>
<w:tblW w:w="10000" w:type="pct"/>
<w:tblBorders>
<!-- 边框... -->
</w:tblBorders>
</w:tblPr>
<w:tblGrid>
<w:gridCol w:w="2000"/>
<w:gridCol w:w="2000"/>
<w:gridCol w:w="2000"/>
</w:tblGrid>
<!-- 第一行:第一格跨3列 -->
<w:tr>
<w:tc>
<w:tcPr>
<w:gridSpan w:val="3"/> <!-- 水平跨3列 -->
</w:tcPr>
<w:p><w:r><w:t>跨三列表头</w:t></w:r></w:p>
</w:tc>
</w:tr>
<!-- 第二行 -->
<w:tr>
<w:tc>
<w:tcPr>
<w:vMerge w:val="restart"/> <!-- 开始垂直合并 -->
</w:tcPr>
<w:p><w:r><w:t>左列</w:t></w:r></w:p>
</w:tc>
<w:tc><w:p><w:r><w:t>中1</w:t></w:r></w:p></w:tc>
<w:tc><w:p><w:r><w:t>右1</w:t></w:r></w:p></w:tc>
</w:tr>
<!-- 第三行 -->
<w:tr>
<w:tc>
<w:tcPr>
<w:vMerge/> <!-- 继续合并 -->
</w:tcPr>
</w:tc>
<w:tc><w:p><w:r><w:t>中2</w:t></w:r></w:p></w:tc>
<w:tc><w:p><w:r><w:t>右2</w:t></w:r></w:p></w:tc>
</w:tr>
</w:tbl>
本章小结
- 表格结构:
w:tbl→w:tblPr+w:tblGrid+ 多个w:tr - 行:
w:tr→w:trPr+ 多个w:tc - 单元格:
w:tc→w:tcPr+ 内容(段落等) - 水平合并:用
gridSpan指定跨几列,只放一个格子 - 垂直合并:第一个格子
vMerge="restart",后续格子只放vMerge - 表格宽度可以是百分比或绝对宽度
- 边框在表格级别设置内部和外部边框,单元格可以单独覆盖
下一章我们讲解图片和嵌入式对象。