python-docx 垂直居中以及行高失效问题

这篇博客介绍了在使用python-docx库操作Word表格时遇到的垂直居中和行高设置问题。作者通过深入源码发现无法全局设置表格垂直居中,但能为单元格单独设置。对于行高失效的问题,作者提供了解决方案,即直接通过table.rows[index].height来设置。此外,还分享了一个自定义的`CreateTable`类,封装了表格创建、合并单元格、写入数据等方法,并展示了如何实现单元格垂直居中和行高的有效设置。
部署运行你感兴趣的模型镜像

python-docx 的垂直居中问题以及行高失效问题

我翻了下源码发现这个包暂时没有办法全局Table设置垂直居中,只找到了cell垂直居中的方法。所以我修改了行内的方法在写之前先设置样式。行高失效的话是因为这个模块的缺陷,导致直接对新的row赋值高度失效,所以就只能使用 self.table.rows[当前行索引].height来设置行高。下边是我对table相关操作简单封装的一个模块。

封装之后如下
class CreateTable:
    """
        table 操作
    """

    def __init__(self, rows, cols, width_list, height, document, font_size=10, font_color=(0, 0, 0), floats='LEFT',
                 font_name=u'仿宋'):
        """
        添加rows行cols列表格
        :param rows: 行
        :param cols: 列
        :param font_size: 字体大小
        :param font_color: 字体颜色
        :param floats: 居中格式
        """
        self.rows = rows
        self.cols = cols
        self.font_name = font_name
        self.width_list = width_list
        self.height = height
        self.now_row = 0
        self.table = document.add_table(rows=rows, cols=cols, style='Table Grid')
        self.table.style.font.size = Pt(font_size)
        self.table.style.font.name = font_name
        self.table.style.element.rPr.rFonts.set(qn('w:eastAsia'), font_name)
        self.table.style.font.color.rgb = RGBColor(*font_color)
        self.table.style.paragraph_format.alignment = getattr(WD_PARAGRAPH_ALIGNMENT, floats)
        self.table.alignment = WD_TABLE_ALIGNMENT.CENTER
        self.set_row_width()

    def set_row_width(self):
        for i in range(self.cols):
            self.table.cell(0, i).width = Cm(self.width_list[i])
        for i in range(self.rows):
            self.table.rows[i].height = Cm(self.height)

    def merge(self, tuple1, tuple2, text, font_name=u'仿宋', font_size=10, bold=False):
        self.table.cell(*tuple1).merge(self.table.cell(*tuple2))
        tr = self.table.cell(*tuple1).paragraphs[0].add_run(text)
        tr.font.name = font_name
        tr.font.size = Pt(font_size)
        tr.font.bold = bold
        xu = self.table.cell(*tuple1)
        xu.vertical_alignment = WD_CELL_VERTICAL_ALIGNMENT.CENTER
        xu.alignment = WD_TABLE_ALIGNMENT
        xt, y = tuple1
        self.table.rows[xt].height = Cm(self.height)

    def write_row(self, tuple1, tuple2, data_list, font_size=11, bold=False):
        LA, LB = tuple1
        RA, RB = tuple2
        if (LA == RA and RB >= LB) or (LB == RB and RA >= LA):
            if LA == RA:
                for index, i in enumerate(range(LB, RB)):
                    self._write((LA, i), data_list[index], font_size, bold)
                return
            if LB == RB:
                for index, i in enumerate(range(LA, RA)):
                    self._write((i, LB), data_list[index], font_size, bold)
                return

    def __add_row(self):
        self.now_row += 1
        return self.table.add_row().cells

    def add_new_row(self):
        self.now_row += 1
        return self.table.add_row().cells

    def add_row(self, data_list, color=None, font_size=11, bold=False):
        """
        :param bold:
        :param font_size:
        :param data_list: 数据列表
        :param color: 字体下标和颜色组成的字典 ps: {0:'RED',2:'YELLOW}
        :return:
        """
        row_cells = self.__add_row()
        # 行高设置在这里
        self.table.rows[self.now_row].height = Cm(self.height)
        for i in range(self.cols):
            xa = row_cells[i]
            xa.width = Cm(self.width_list[i])
            # 垂直居中在这里
            xa.vertical_alignment = WD_CELL_VERTICAL_ALIGNMENT.CENTER
            xx = xa.paragraphs[0].add_run(str(data_list[i]))
            xx.font.name = self.font_name
            xx.font.size = Pt(font_size)
            xx.font.bold = bold
            if color and i in color.keys():
                xx.font.highlight_color = getattr(WD_COLOR_INDEX, color[i])

    def _write(self, tuple1, text, font_size, bold):
        xu = self.table.cell(*tuple1)
        xu.vertical_alignment = WD_CELL_VERTICAL_ALIGNMENT.CENTER
        xx = xu.paragraphs[0].add_run(text)
        xx.font.name = self.font_name
        xx.font.size = Pt(font_size)
        xx.font.bold = bold
  • PS : 其中xu.vertical_alignment = WD_CELL_VERTICAL_ALIGNMENT.CENTERxu 为当前需要填充的cell,vertical_alignment = WD_CELL_VERTICAL_ALIGNMENT.CENTER 即为设置垂直居中的方法。

您可能感兴趣的与本文相关的镜像

Python3.11

Python3.11

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

### 如何使用 python-docx 实现单元格内容垂直居中Python 的 `python-docx` 库中,可以通过设置表格单元格的 `vertical_alignment` 属性来实现单元格内容的垂直居中对齐。以下是具体的实现方法和代码示例。 `WD_ALIGN_VERTICAL.CENTER` 是用于设置单元格内容垂直居中的枚举值[^1]。以下是一个完整的代码示例,展示如何创建一个 Word 表格,并将所有单元格的内容设置为垂直居中对齐: ```python from docx import Document from docx.shared import Cm from docx.enum.text import WD_ALIGN_VERTICAL # 创建一个新的 Word 文档 document = Document() # 添加一个 3x3 的表格 table = document.add_table(rows=3, cols=3) # 遍历表格的所有单元格并设置宽度、度和垂直对齐方式 for i in range(len(table.rows)): table.rows[i].height = Cm(2) # 设置 for j in range(len(table.columns)): cell = table.cell(i, j) cell.width = Cm(4) # 设置列宽 cell.vertical_alignment = WD_ALIGN_VERTICAL.CENTER # 设置垂直居中对齐 # 在每个单元格中添加文本 for row in table.rows: for cell in row.cells: cell.text = "示例文本" # 保存文档 document.save('vertical_centered_table.docx') ``` 上述代码中,`cell.vertical_alignment = WD_ALIGN_VERTICAL.CENTER` 是关键部分,它将单元格的内容设置为垂直居中对齐。 ### 注意事项 - 确保已安装 `python-docx` 库。如果未安装,可以使用以下命令进安装: ```bash pip install python-docx ``` - `WD_ALIGN_VERTICAL` 枚举值还支持其他对齐方式,例如 `TOP` 和 `BOTTOM`,可以根据需求选择不同的对齐方式。 - 如果需要同时设置水平对齐方式,可以参考 `WD_ALIGN_PARAGRAPH` 枚举值[^2]。 ### 示例效果 运上述代码后,生成的 Word 文档中,表格的所有单元格内容将垂直居中对齐,并且和列宽也已设置为指定值。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值