我正在尝试使用包含以下格式数据的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])
答案 0 :(得分:2)
不幸的是,openpyxl可以应用的格式比你希望的要少。特别是行高和列宽完全取决于阅读应用程序,并依赖于操作系统之类的东西。
此外,openpyxl遵循规范而不是Excel,因此,例如,将样式应用于Row或ColumnDimension是Excel格式化 future 单元格而不是现有单元格的指令。该规范不包含有关如何格式化合并单元格的无论的信息。一年前提交了一份错误报告,但我们仍在等待澄清。
为了获得最佳效果,您应该准备好剖析现有工作表并从中重新创建样式。 NB。由于使用了OOXML格式的指针,这有点棘手。