程序员最近都爱上了这个网站  程序员们快来瞅瞅吧!  it98k网:it98k.com

本站消息

站长简介/公众号

  出租广告位,需要合作请联系站长

+关注
已关注

分类  

暂无分类

标签  

暂无标签

日期归档  

暂无数据

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

发布于2020-01-16 22:16     阅读(2175)     评论(0)     点赞(27)     收藏(1)


我正在尝试使用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格式化未来不存在的单元格的指令该规范不包含任何信息任何关于如何合并单元格的格式应该。一年多以前提交了一个错误报告,但我们仍在等待澄清。

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



所属网站分类: 技术文章 > 问答

作者:黑洞官方问答小能手

链接:https://www.pythonheidong.com/blog/article/226461/f8e423160abfb2bafe7c/

来源:python黑洞网

任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任

27 0
收藏该文
已收藏

评论内容:(最多支持255个字符)