如何在openpyxl中将列宽设置为最佳适合大小

16

我已经填好了一个工作表,里面有一些数据。我想让列的宽度自适应,就像这里所描述的那样。基本上,就是当您双击列宽调整分隔符时发生的自动调整。

这是我的最小示例,根据我对openpyxl文档的理解,这应该可以工作:

import openpyxl
from typing import NoReturn

def columns_best_fit(ws: openpyxl.worksheet.worksheet.Worksheet) -> NoReturn:
    """
    Make all columns best fit
    """
    column_letters = tuple(openpyxl.utils.get_column_letter(col_number + 1) for col_number in range(ws.max_column))
    for column_letter in column_letters:
        dim = openpyxl.worksheet.dimensions.ColumnDimension(ws, index=column_letter, bestFit=True, customWidth=True)
        ws.column_dimensions[column_letter] = dim


wb = openpyxl.Workbook()
ws = wb.active
ws.append(("Long Column Header 1", "Even Longer Column Header 2"))
ws.append(("some data", "more data"))
columns_best_fit(ws)
wb.save("column_width_test.xlsx")

然而,当我打开生成的文件时,列只是稍微更宽了一点,但肯定不是最适合的。


2
列宽度必须不幸地始终进行计算。设置bestWidth=True没有任何效果。 - Charlie Clark
1
这里有一个有用的答案:链接 - Nathaniel Jones
2
以下是原始的错误票据链接:https://foss.heptapod.net/openpyxl/openpyxl/-/issues/1275 简而言之,WONTFIX - kevinarpe
4个回答

13

经过多小时的研究,我终于找到了它。

注意:在下面的代码中,sheet 是工作表名称。通常在文档中,我们可以看到它被称为 ws。请不要忘记更改工作表名称。

# Imorting the necessary modules
try:
        from openpyxl.cell import get_column_letter
except ImportError:
        from openpyxl.utils import get_column_letter
        from openpyxl.utils import column_index_from_string
from openpyxl import load_workbook
import openpyxl
from openpyxl import Workbook



for column_cells in sheet.columns:
    new_column_length = max(len(str(cell.value)) for cell in column_cells)
    new_column_letter = (get_column_letter(column_cells[0].column))
    if new_column_length > 0:
        sheet.column_dimensions[new_column_letter].width = new_column_length*1.23

更新:这段代码并不适用于所有情况,但请不要犹豫尝试


你能否提供你找到的参考链接?自动调整列宽通常对于等宽字体来说没问题,但对于比例字体来说效果不佳,特别是在表格应用缩放时。 - flywire
您好, 能否请您详细说明您的问题?我没有理解清楚。 这个解决方案对您没有帮助吗? - Mounesh
经过多个小时的研究,我终于找到了它。您能提供参考链接吗? - flywire
抱歉,我没有得到链接。如果我得到了,我会在这里粘贴。 - Mounesh

4

我已经编辑了你的函数,现在应该可以正常工作了。

def columns_best_fit(ws: openpyxl.worksheet.worksheet.Worksheet) -> NoReturn:
        """
        Make all columns best fit
        """
        column_letters = tuple(openpyxl.utils.get_column_letter(col_number + 1) for col_number in range(ws.max_column))
        for column_letter in column_letters:
            ws.column_dimensions[column_letter].bestFit = True

没有自动调整大小 - Demetry Pascal

0
参考@Mounesh的答案,似乎在设置列宽后工作簿没有保存。这个方法可以解决问题。
# Imorting the necessary modules
try:
        from openpyxl.cell import get_column_letter
except ImportError:
        from openpyxl.utils import get_column_letter
        from openpyxl.utils import column_index_from_string
from openpyxl import load_workbook
import openpyxl
from openpyxl import Workbook


workbook = load_workbook("excel_name.xlsx")
for sheet_name in workbook.sheetnames:
  for column_cells in workbook[sheet_name].columns:
        new_column_length = max(len(str(cell.value)) for cell in column_cells)
        new_column_letter = (get_column_letter(column_cells[0].column))
        if new_column_length > 0:
            workbook[sheet_name].column_dimensions[new_column_letter].width = new_column_length*1.23
workbook.save("excel_name.xlsx")

-1
我使用了类似这样的代码:
from openpyxl.worksheet.dimensions import ColumnDimension

wb = Workbook()
ws = wb.active
ColumnDimension(ws, bestFit=True)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接