Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

第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:tblw:tblPr + w:tblGrid + 多个w:tr
  • 行:w:trw:trPr + 多个w:tc
  • 单元格:w:tcw:tcPr + 内容(段落等)
  • 水平合并:用gridSpan指定跨几列,只放一个格子
  • 垂直合并:第一个格子vMerge="restart",后续格子只放vMerge
  • 表格宽度可以是百分比或绝对宽度
  • 边框在表格级别设置内部和外部边框,单元格可以单独覆盖

下一章我们讲解图片和嵌入式对象。