Python 获取给定字体和容器宽度的字符串的高度或行数

Python get the height or number of lines for a string given a font and container width

我正在尝试使用包含以下格式数据的 openpyxl 生成电子表格。所有单元格都应按照给定的宽度进行包装。

+-----------+-------------------+-----+
| Long text | More Long text h..| num |
| Here....  +-------------------+-----+
|           | More Long text h..| num |
+-----------+-------------------+-----+

问题是行高是固定的,文本被截断了。

openpyxl 似乎没有自动行高功能,因此我必须计算给定字体和宽度的高度或行数。

我四处寻找可以执行此操作但没有成功的软件包。任何解决此问题的想法或方法将不胜感激,谢谢!

编辑:

# this generates the example above
from openpyxl.styles import *
from openpyxl import Workbook

alignment = Alignment (
    horizontal='center',
    vertical='center',
    wrap_text= True,
)
font = Font(name='Calibri',
    size=11,
)

wb = Workbook()
ws = wb.active

ws.merge_cells("A1:A2")
ws["A1"] = "Long text here..."

long_string = "More Long text here..."

ws["B1"], ws["B2"] = long_string
# sets a fixed width for column `B`
ws.column_dimensions["B"].width = 50
# sets a height for row 1
ws.row_dimensions[1].height = get_row_height(text=long_text, width=50)

ws["C1"], ws["C2"] = 0

def get_row_height(text, width):
    # this magic function returns how many lines `text` takes up

在发布这个问题之前,我尝试使用 tkinter,但结果并不是我想要的

from tkinter import Tk, BOTH, Y, END, Text, font as f
root = Tk()
font = f.Font(family="Calibri", size=11)
line_height = font.metrics("linespace")
T = Text(root, width=30, font=font)
T.pack(fill=BOTH, expand=Y)
T.insert(END, "THIS IS A VERY VERY VERY VERY VERY VERY VERY LONG TEXT")
num_lines = int(T.index('end-1c').split('.')[0])

不幸的是,openpyxl 可以应用的格式比您希望的要少。特别是行高和列宽 完全 取决于阅读应用程序和操作系统等因素。

此外,openpyxl 遵循规范而不是 Excel 因此,例如,将样式应用于 Row 或 ColumnDimension 是 Excel 格式化 future 单元格不存在。该规范不包含 任何 关于应如何格式化合并单元格的信息。错误报告已于一年多前提交,但我们仍在等待澄清。

要获得最佳结果,您应该准备好剖析现有工作表并从中重新创建样式。注意。由于使用了 OOXML 格式的指针,这有点棘手。