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