victory的博客

长安一片月,万户捣衣声

0%

python-docx | 设置word文档里表格的格式

设置word文档里表格的格式

以下代码实现使用python-docx对word文档里表格的格式进行设置。

# 单元格边框设置函数
from docx.table import _Cell
from docx.oxml import OxmlElement
from docx.oxml.ns import qn


def Set_cell_border(cell: _Cell, **kwargs):
    """
    设置单元格边框函数
    使用方法:
    Set_cell_border(
        cell,
        top={"sz": 12, "val": "single", "color": "#FF0000", "space": "0"},
        bottom={"sz": 12, "color": "#00FF00", "val": "single"},
        start={"sz": 24, "val": "dashed", "shadow": "true"},
        end={"sz": 12, "val": "dashed"},
    )
    传入参数有cell, 即单元格;top指上边框;bottom指下边框;start指左边框;end指右边框。
    "sz"指线的粗细程度;"val"指线型,比如单线,虚线等;"color"指颜色,颜色编码可百度;
    "space"指间隔,一般不设置,设置的值大于0会导致线错开;"shadow"指边框阴影
    """
    tc = cell._tc
    tcPr = tc.get_or_add_tcPr()

    tcBorders = tcPr.first_child_found_in("w:tcBorders")
    if tcBorders is None:
        tcBorders = OxmlElement('w:tcBorders')
        tcPr.append(tcBorders)

    for edge in ('start', 'top', 'end', 'bottom', 'insideH', 'insideV'):
        edge_data = kwargs.get(edge)
        if edge_data:
            tag = 'w:{}'.format(edge)

            element = tcBorders.find(qn(tag))
            if element is None:
                element = OxmlElement(tag)
                tcBorders.append(element)

            for key in ["sz", "val", "color", "space", "shadow"]:
                if key in edge_data:
                    element.set(qn('w:{}'.format(key)), str(edge_data[key]))


# 定义单元格填充颜色函数
from docx.oxml.ns import nsdecls
from docx.oxml import parse_xml


def Set_Background_Color(cell, rgbColor):
    shading_elm = parse_xml(
        r'<w:shd {} w:fill="{color_value}"/>'.format(nsdecls('w'), color_value=rgbColor))  # 固定写法,照抄即可
    cell._tc.get_or_add_tcPr().append(shading_elm)


from docx.enum.text import WD_ALIGN_PARAGRAPH  # 设置水平居中对齐需要用到的库
from docx.enum.table import WD_ALIGN_VERTICAL  # 设置垂直居中对齐需要用到的库
from docx.shared import Cm  # 长度单位(厘米cm用到的库)
from docx import Document

doc = Document("收货记录.docx")  # 打开word文件
table = doc.tables[0]
max_row = len(table.rows)  # 获取表格总行数

# 1.最后一行中,“总数”两个字要加粗
run = table.cell(max_row - 1, 4).paragraphs[0].runs[0]  # 获取最后一行第五列对应单元格中的文字块,即“总数”字样所在单元格
run.font.bold = True  # 将文字块设置为粗体

# 2.最后一行的行高要调大一点,现在这样扁扁的,难看
table.rows[max_row - 1].height = Cm(1)  # 将最后一行的行高设置为1厘米

# 3.最后一行那几个空单元格有框线,太碍眼,得去掉,将总数及左边两个cell左边框和下边框设成白色
for i in range(3):
    cell = table.cell(max_row - 1, i)
    Set_cell_border(
        cell,
        bottom={"color": "#FFFFFF"},
        start={"color": "#FFFFFF"},
        end={"color": "#FFFFFF"}
    )

cell_1 = table.cell(max_row - 1, 3)
Set_cell_border(cell_1, start={"color": "#FFFFFF"}, bottom={"color": "#FFFFFF"})

cell_2 = table.cell(max_row - 1, 6)
Set_cell_border(cell_2, end={"color": "#FFFFFF"}, bottom={"color": "#FFFFFF"})

# 4.各单元格水平和垂直方向都要居中对齐
for row in range(1, max_row):
    for col in range(len(table.columns)):
        table.cell(row, col).paragraphs[0].alignment = WD_ALIGN_PARAGRAPH.CENTER
        table.cell(row, col).vertical_alignment = WD_ALIGN_VERTICAL.CENTER

# 5.数量列≥85的,底色设置为橙色
qty = []  # 存储数量信息
# 读取第二行到29行,第2,3列中的数据
for i in range(1, max_row - 1):
    qty_info = table.rows[i].cells[5].text  # cells[5]指表格第6列
    qty.append(int(qty_info))

# 将数量≥85的单元格填色
row = 1  # 行计数器
for i in qty:
    if i >= 85:
        cell = table.cell(row, 5)  # 第6列数据为数量,列索引是5
        Set_Background_Color(cell, "98F5FF")  # 填充颜色,"98F5FF"是蓝色的编码
    row += 1  # 跳转到下一行

doc.save("收货记录-整理.docx")

收货记录.docx