表格

文件.add_table(rows = 多少行, cols = 多少列)

from docx import Document
文件 = Document('c:/test.docx')
列表 = [
    ['姓名','性别','年龄'],
    ['孙兴华','男',20],
    ['赵丽颖','女',33],
    ['李小龙','男',80],
    ['叶问','男',127]
]
r = 5
c = 3
表 = 文件.add_table(rows = r, cols = c)
for 行号 in range(r):
    单元格 = 表.rows[行号].cells
    for 列号 in range(c):
        单元格[列号].text = str(列表[行号][列号])
文件.save('c:/test.docx')

添加行和列及查看行列数

from docx import Document
from docx.shared import Cm
文件 = Document('c:/test.docx')
文件.tables[0].add_row() # 表格最下方增加一行
文件.tables[0].add_column(Cm(5)) # 表格最右侧增加一列,一定要写列宽
print(f'现在第1个表的行是{len(文件.tables[0].rows)},列是{len(文件.tables[0].columns)}')
文件.save('c:/test.docx')

表格行和列的定位

row = table.rows[1]
column = table.columns[1]

删除表格中的行和列

删除表格中的行

from docx import Document
文件 = Document('c:/test.docx')
print(f'此文件中共{len(文件.tables)}个表格')
表1 = 文件.tables[0]  # 获取第一个表格
print(f'表1的共{len(表1.rows)}行,{len(表1.columns)}列')
行 = 表1.rows[1]  # 获取表格中的第2行
行._element.getparent().remove(行._element)  # 删除行
print(f'删除表格中的第2行后,表1共{len(表1.rows)}行,{len(表1.columns)}列')
文件.save('c:/test.docx')

删除表格中的列

from docx import Document
文件 = Document('c:/test.docx')
print(f'此文件中共{len(文件.tables)}个表格')
表1 = 文件.tables[0]  # 获取第一个表格
print(f'表1的共{len(表1.rows)}行,{len(表1.columns)}列')
列 = 表1.table.columns[1]  # 获取表1中第2列
for 单元格 in 列.cells:  # 遍历列中的单元格
    单元格._element.getparent().remove(单元格._element)   # 删除第2列的单元格
print(f'删除表格中的第2行后,表1共{len(表1.rows)}行,{len(表1.columns)}列')
文件.save('c:/test.docx')
from docx import Document
文件 = Document('c:/test.docx')
表1 = 文件.tables[0]  # 获取第一个表格
i =0  # 标识行的序号
for 行 in 表1.rows:  # 遍历取表格中的行
    i += 1  # 行的序号从1开始
    for 单元格 in 行.cells:  # 遍历行中的单元格
        print(f'第{i}行:',单元格.text)
文件.save('c:/test.docx')

表格的删除

from docx import Document
文件 = Document('c:/test.docx')
print(f'文件中表格总数:{len(文件.tables)}个')
表 = 文件.tables[1]  # 获取第二个表格
表._element.getparent().remove(表._element)  # 删除表格
print(f'删除后的表格总数:{len(文件.tables)}个')
文件.save('c:/test.docx')

设置单元格的值

from docx import Document
from docx.enum.text import WD_PARAGRAPH_ALIGNMENT # 导入段落对齐方式
文件 = Document('c:/test.docx')

# 方法1
表 = 文件.add_table(3, 3)  # 为文档新增3行3列的表格
表.cell(0, 0).text = 'docu'  # 为表格的(0,0)位置单元格赋值

# 方法2
段落 = 表.cell(0, 1).paragraphs[0]  # 获取表格(0,1)位置单元格中的段落
段落.text = 'pic02'
段落 = 表.cell(0, 1).add_paragraph('第二个段落居中')
段落.alignment = WD_PARAGRAPH_ALIGNMENT.CENTER  # 设置段落居中

文件.save('c:/test.docx')

表格的录入

简单直接的方式进入录入

from docx import Document # 导入docx包
文件 = Document('c:/test.docx') # 新建docx文档
表 = 文件.add_table(2, 4)
表.cell(0, 0).text = '序号'
表.cell(0, 1).text = '姓名'
表.cell(0, 2).text = '年龄'
表.cell(0, 3).text = '身高'
# 表格赋值,将第二行作为数据输入第一行
表.cell(1, 0).text = '1'
表.cell(1, 1).text = '孙悟空'
表.cell(1, 2).text = '500'
表.cell(1, 3).text = '178'
文件.save('c:/test.docx')

按行录入

from docx import Document # 导入docx包
数据 = [['序号', '姓名', '年龄', '身高'], ['1', '孙悟空', '50', '178'], ['2', '猪八戒', '400', '165']]
文件 = Document('c:/test.docx') # 新建docx文档
表 = 文件.add_table(3, 4)
表头 = 表.rows[0].cells
for 列 in range(4):
    表头[列].text = 数据[0][列]  # ['序号', '姓名', '年龄', '身高']里面的第几个
# 录入数据
    for 行 in range(1, 3):
        表数据 = 表.rows[行].cells
        for 列 in range(4): # 遍历列
            表数据[列].text = 数据[行][列]   # 数据中每一行是一个列表,每一列是一个元素
文件.save('c:/test.docx')

从表格中导入数据后按行录入

from docx import Document # 导入docx包
import pandas as pd
数据 = pd.read_excel('c:/test.xlsx',header=None)
文件 = Document('c:/test.docx')
表 = 文件.add_table(3, 4)
for 行 in range(3):
    for 列 in range(4):
        print(行,列)   # 可以查看表格输出结果
        表.cell(行,列).text = str(数据.iloc[行,列])  # 由于里面有数据型的,需要强制转字符
文件.save('c:/test.docx')

删除单元格数据

from docx import Document # 导入docx包
文件 = Document('c:/test.docx')
表 = 文件.tables[0] # 读取第1个表格

# 第一种方法,对单元格赋值为空
表.cell(0,0).text = "" # 将表的第1行第1列单元格赋值为空

# 第二种方法,对段落赋值为空
段落 = 表.cell(0,1).paragraphs[0].text = "" # 表的第1行第2列第1个段落赋值为空
文件.save('c:/test.docx')

删除表格行或列数据

删除表格行数据

from docx import Document # 导入docx包
文件 = Document('c:/test.docx')
表 = 文件.tables[0] # 读取第1个表格
for 单元格 in 表.rows[0].cells: # 遍历表格中第1行中所有的单元格
    单元格.text = "" # 将所有单元格赋值为空
文件.save('c:/test.docx')

删除表格列数据

from docx import Document # 导入docx包
文件 = Document('c:/test.docx')
表 = 文件.tables[0]  # 读取第1个表格
for 单元格 in 表.columns[0].cells:  # 遍历表格中第1列中所有的单元格
    单元格.text = ""  # 将所有单元格赋值为空
文件.save('c:/test.docx')

表格对齐

参数 说明
WD_TABLE_ALIGNMENT.LEFT 左对齐
WD_TABLE_ALIGNMENT.CENTER 居中对齐
WD_TABLE_ALIGNMENT.RIGHT 右对齐
from docx.enum.table import WD_TABLE_ALIGNMENT # 导入表格对齐方式
from docx.shared import Cm # 导入单位转换函数
from docx import Document
文件 = Document('c:/test.docx')  # 新建docx文档
表 = 文件.tables[0]  # 指定第1个表格
表.alignment = WD_TABLE_ALIGNMENT.LEFT  # 设置表格为左对齐
for 列 in 表.columns:  # 表格1设置列宽为10cm
    for 单元格 in 列.cells:
        单元格.width = Cm(1)
文件.save('c:/test.docx')

单元格对齐

参数 说明
WD_CELL_VERTICAL_ALIGNMENT.TOP 单元格内容靠上对齐
WD_CELL_VERTICAL_ALIGNMENT.CENTER 单元格内容居中对齐
WD_CELL_VERTICAL_ALIGNMENT.BOTTOM 单元格内容靠下对齐
参数 说明
WD_PARAGRAPH_ALIGNMENT.LEFT 段落左对齐
WD_PARAGRAPH_ALIGNMENT.CENTER 段落居中对齐
WD_PARAGRAPH_ALIGNMENT.RIGHT 段落右对齐
WD_PARAGRAPH_ALIGNMENT.JUSTIFY 段落两端对齐
from docx import Document # 导入docx
from docx.enum.table import WD_CELL_VERTICAL_ALIGNMENT # 导入单元格垂直对齐
from docx.enum.text import WD_PARAGRAPH_ALIGNMENT # 导入段落对齐
文件 = Document('c:/test.docx') 
表 = 文件.tables[0] # 指定第1个表格
单元格 = 表.cell(0,1) # 指定单元格
# 靠上居中对齐
单元格.vertical_alignment = WD_CELL_VERTICAL_ALIGNMENT.TOP
单元格.paragraphs[0].alignment = WD_PARAGRAPH_ALIGNMENT.CENTER
文件.save('c:/test.docx')

对齐方式

对齐方式 参数
靠上两端对齐 单元格.vertical_alignment = WD_CELL_VERTICAL_ALIGNMENT.TOP
单元格.paragraphs[0].alignment = WD_PARAGRAPH_ALIGNMENT.JUSTIFY
靠上右对齐 单元格.vertical_alignment = WD_CELL_VERTICAL_ALIGNMENT.TOP
单元格.paragraphs[0].alignment = WD_PARAGRAPH_ALIGNMENT.RIGHT
中部两端对齐 单元格.vertical_alignment = WD_CELL_VERTICAL_ALIGNMENT.CENTER
单元格.paragraphs[0].alignment = WD_PARAGRAPH_ALIGNMENT.JUSTIFY
中部居中对齐 单元格.vertical_alignment = WD_CELL_VERTICAL_ALIGNMENT.CENTER
单元格.paragraphs[0].alignment = WD_PARAGRAPH_ALIGNMENT.CENTER
中部右对齐 单元格.vertical_alignment = WD_CELL_VERTICAL_ALIGNMENT.CENTER
单元格.paragraphs[0].alignment = WD_PARAGRAPH_ALIGNMENT.RIGHT
靠下两端对齐 单元格.vertical_alignment = WD_CELL_VERTICAL_ALIGNMENT.BOTTOM
单元格.paragraphs[0].alignment = WD_PARAGRAPH_ALIGNMENT.JUSTIFY
靠下中部对齐 单元格.vertical_alignment = WD_CELL_VERTICAL_ALIGNMENT.BOTTOM
单元格.paragraphs[0].alignment = WD_PARAGRAPH_ALIGNMENT.CENTER
靠下右对齐 单元格.vertical_alignment = WD_CELL_VERTICAL_ALIGNMENT.BOTTOM
单元格.paragraphs[0].alignment = WD_PARAGRAPH_ALIGNMENT.RIGHT

表格样式

from docx import Document
from docx.oxml.ns import qn # 中文字体
文件 = Document()
表 = 文件.add_table(3, 3, style="Medium Grid 1 Accent 1")
表头 = 表.rows[0].cells
表头[0].text = '姓名'
表头[1].text = '性别'
表头[2].text = '年龄'
# 将表格中所有单元格修改字体
for 行 in 表.rows:
    for 单元格 in 行.cells:
        for 段落 in 单元格.paragraphs:
            for 块 in 段落.runs:
                块.font.name = 'Arial'  # 英文字体设置
                块._element.rPr.rFonts.set(qn('w:eastAsia'), '微软雅黑')  # 设置中文字体

文件.save('c:/test.docx')

查看所有支持的表格样式

from docx.enum.style import WD_STYLE_TYPE # 读标题笔记05
from docx import Document  # 可以写成 from docx import *
文件 = Document()
所有样式 = 文件.styles
#生成所有表样式
for 样式 in 所有样式:
    if 样式.type == WD_STYLE_TYPE.TABLE:
        文件.add_paragraph("表格样式 :  "+ 样式.name)
        表 = 文件.add_table(3,3, style = 样式)
        单元格 = 表.rows[0].cells
        单元格[0].text = '第一列内容'
        单元格[1].text = '第二列内容'
        单元格[2].text = '第三列内容'
        文件.add_paragraph("\n")

文件.save('c:/style.docx')  # 这个文档里就包含了所有支持的样式