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

Python获取给定字体和容器宽度的字符串的高度或行数,python,user-interface,openpyxl,Python,User Interface,Openpyxl,我正在尝试使用openpyxl生成一个speadsheet,其中包含以下格式的数据。所有单元格都应按照给定的宽度进行包装 +-----------+-------------------+-----+ | Long text | More Long text h..| num | | Here.... +-------------------+-----+ | | More Long text h..| num | +-----------+----------------

我正在尝试使用openpyxl生成一个speadsheet,其中包含以下格式的数据。所有单元格都应按照给定的宽度进行包装

+-----------+-------------------+-----+
| 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,因此,例如,将样式应用于行或列维度是Excel设置未来单元格格式而不是现有单元格格式的指令。该规范不包含任何关于合并单元格应如何格式化的信息。一年多前提交了一份bug报告,但我们仍在等待澄清


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

您可以将代码添加到问题中吗?如果您的问题中有一个新的指针就好了。你退房了吗?它可以以多种格式输出,而且非常容易使用。@MarkyPython请参阅edit@Igor,我已经签出了表格,但我不相信它会导出到excel或单元格合并/样式化,这正是我在这里尝试实现的。对于tkinter解决方案,单元格需要可编辑还是只需要显示数据?可以告诉tkinter标签小部件以特定的宽度(即:列的宽度)换行。