Python - 自动调整excel文件列的宽度

时间:2016-09-16 10:49:19

标签: python excel openpyxl

新手 - 我有一个Python脚本,根据指定的值调整excel文件的不同列的宽度:

import openpyxl
from string import ascii_uppercase

newFile = "D:\Excel Files\abc.xlsx"

wb = openpyxl.load_workbook(filename = newFile)        
worksheet = wb.active

for column in ascii_uppercase:
    if (column=='A'):
        worksheet.column_dimensions[column].width = 30
    elif (column=='B'):
        worksheet.column_dimensions[column].width = 40            
    elif (column=='G'):
        worksheet.column_dimensions[column].width = 45            
    else:
        worksheet.column_dimensions[column].width = 15

wb.save(newFile)

我们可以通过哪种方式将每列的宽度调整到最佳值,而无需为不同的列明确指定(意味着,不使用此" if-elif-elif-。 .....- elif-else "结构)? 谢谢!

7 个答案:

答案 0 :(得分:29)

for col in worksheet.columns:
     max_length = 0
     column = col[0].column # Get the column name
# Since Openpyxl 2.6, the column name is  ".column_letter" as .column became the column number (1-based) 
     for cell in col:
         try: # Necessary to avoid error on empty cells
             if len(str(cell.value)) > max_length:
                 max_length = len(cell.value)
         except:
             pass
     adjusted_width = (max_length + 2) * 1.2
     worksheet.column_dimensions[column].width = adjusted_width

这可能会变得更整洁,但它可以完成这项工作。您将需要根据您在查看时使用的字体的好处来调整adjust_width值。如果你使用一个单一型,你可以得到它的确切但它不是一对一的相关性,所以你仍然需要稍微调整它。

如果你想获得没有monotype的花哨和精确,你可以按宽度排序字母,并为每个宽度分配一个浮动值,然后你加起来。这将需要第三个循环解析单元格值中的每个字符并总结每列的结果,并且可能是按宽度排序字符的字典,如果你这样做可能有点过分但很酷。

编辑:实际上似乎有更好的方法来测量文本的视觉大小:link我个人更喜欢matplotlib技术。

希望我可以提供帮助,我的第一个stackoverflow回答=)

答案 1 :(得分:3)

我遇到merged_cells有问题,自动调整不能正常工作,如果遇到同样的问题,你可以解决在oldsea代码中添加下一行

for col in worksheet.columns:
    max_length = 0
    column = col[0].column # Get the column name
    for cell in col:
        if cell.coordinate in worksheet.merged_cells: # not check merge_cells
            continue
        try: # Necessary to avoid error on empty cells
            if len(str(cell.value)) > max_length:
                max_length = len(cell.value)
        except:
            pass
    adjusted_width = (max_length + 2) * 1.2
    worksheet.column_dimensions[column].width = adjusted_width

答案 2 :(得分:2)

openpyxl 3.0.0的更新版本(使用.columns失败,出现TypeError: expected <class 'str'>

for column_cells in ws.columns:
    length = max(len(as_text(cell.value)) for cell in column_cells)
    ws.column_dimensions[column_cells[0].column_letter].width = length

答案 3 :(得分:0)

def auto_format_cell_width(ws):
    for letter in range(1,ws.max_column):
        maximum_value = 0
        for cell in ws[get_column_letter(letter)]:
            val_to_check = len(str(cell.value))
            if val_to_check > maximum_value:
               maximum_value = val_to_check
        ws.column_dimensions[get_column_letter(letter)].width = maximum_value + 1

答案 4 :(得分:0)

基于上面的评论,并添加此帖子openpyxl - adjust column width size。我成功了,但是答案应该是:

从openpyxl.utils导入get_column_letter

    for col in ws.columns:
        max_length = 0
        column = get_column_letter(col[0].column)  # Get the column name
        # Since Openpyxl 2.6, the column name is  ".column_letter" as .column became the column number (1-based)
        for cell in col:
            try:  # Necessary to avoid error on empty cells
                if len(str(cell.value)) > max_length:
                    max_length = len(cell.value)
            except:
                pass
        adjusted_width = (max_length + 2) * 1.2
        ws.column_dimensions[column].width = adjusted_width

我正在使用openpyxl =“ ^ 3.0.5”

答案 5 :(得分:0)

使用最新的 openpyxl,您可以使用它:

from openpyxl.utils import get_column_letter
for idx, col in enumerate(worksheet.columns, 1):
    worksheet.column_dimensions[get_column_letter(idx)].auto_size = True

答案 6 :(得分:-5)

如果可能,您应该确定列中最长条目的长度,并使用它来设置宽度。

我假设您可以使用ascii_uppercase中的条目。

我是关于移动设备的,所以不能提供具体的代码示例,但我之前所说的应该可以帮助您更接近您想要实现的目标。