如何在openpyxl中将列宽设置为bestFit

问题描述 投票:0回答:6

我已经在工作表中填充了一些数据,并且我正在尝试使列宽度假设最适合,如here所示。基本上是双击列宽调整分隔符时发生的自动调整。

这是我的最小示例,据我对

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")

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

python openpyxl
6个回答
15
投票

经过几个小时的研究终于找到了。

注意:在下面的代码中,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

更新:此代码并不适用于所有人,但请毫不犹豫地尝试一下 😆


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

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")

0
投票

这已经最接近我的愿望了。
“bestfit”似乎不起作用。
Excel 版本 2308,内部版本 16731.20716

代码是从某处复制的,不记得在哪里找到的。
当我打开结果 .xlsx 时 - 我仍然可以执行 CTRL-A、CTRL-A 并双击列边框以获得更好的拟合效果。
(例如,其中一列从 149 像素变为 94 像素)

 导入 openpyxl
    wb=openpyxl.Workbook()
    ws=wb.活动
    
    # ...在 ws(工作表)中创建信息
    
    对于 ws.columns 中的 column_cells:
      new_column_length = max(len(str(cell.value)) 对于 column_cells 中的单元格)
      new_column_letter = (chr(64+(column_cells[0].column)))
      如果 new_column_length > 0:
        ws.column_dimensions[new_column_letter].width = new_column_length # *1.10

0
投票

我尝试了几种解决方案,并且必须以这种方式调整我的代码。因此,这允许您在下面的代码中调整 Workbook()“wb”所有列的宽度。

for ws in wb.worksheets:
    index_column = 1
    for column_cells in ws.columns:
        new_column_length = max(len(str(cell.value)) for cell in column_cells)
        column_letter = get_column_letter(index_column)
        ws.column_dimensions[column_letter].width = new_column_length*1.23
        index_column += 1
wb.save("resut.xlsx")

-1
投票

我用过一些这样的:

from openpyxl.worksheet.dimensions import ColumnDimension

wb = Workbook()
ws = wb.active
ColumnDimension(ws, bestFit=True)
© www.soinside.com 2019 - 2024. All rights reserved.