Python - автоматическая настройка ширины столбцов файла Excel

Новичок. У меня есть скрипт 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" " состав)? Благодарю!

Ответ 1

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 в соответствии с тем, что хорошо для шрифта, который вы используете при его просмотре. Если вы используете монотип, вы можете получить его точно, но это не взаимно-однозначная корреляция, поэтому вам все равно придется немного его скорректировать.

Если вы хотите получить фантазию и точность без монотипии, вы можете отсортировать буквы по ширине и присвоить каждой ширине значение с плавающей запятой, которое вы затем сложите. Это потребует третьего цикла синтаксического анализа каждого символа в значении ячейки и суммирования результата для каждого столбца и, возможно, словаря, сортирующего символы по ширине, возможно, излишнего, но крутого, если вы это сделаете.

Изменение: На самом деле, кажется, есть лучший способ измерения визуального размера текста: ссылка лично я бы предпочел технику matplotlib.

Надеюсь, что смогу помочь, мой самый первый ответ на stackoverflow =)

Ответ 2

У меня проблема с merged_cells, и autosize не работает правильно, если у вас есть такая же проблема, вы можете решить добавить следующие строки внутри кода 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

Ответ 3

Обновленная версия от 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

Ответ 4

Если возможно, вы должны определить длину самой длинной записи в столбце и использовать ее для установки ширины.

Я предполагаю, что вы можете использовать для входа в ascii_uppercase.

Я нахожусь на мобильных atm, поэтому не могу привести конкретный пример кода, но то, что я сказал ранее, должно помочь вам приблизиться к тому, чего вы хотите достичь.