Python - Automatically adjust width of an excel file's columns

后端 未结 6 1550
夕颜
夕颜 2021-02-01 22:15

Newbie - I have a Python script that adjusts the width of different columns of an excel file, according to the values specified:

import openpyxl
from string impo         


        
相关标签:
6条回答
  • 2021-02-01 22:30

    Based on the comment above and add this post openpyxl - adjust column width size. I succeeded, but the answer should be:

    from openpyxl.utils import 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
    

    i'm using openpyxl = "^3.0.5"

    0 讨论(0)
  • 2021-02-01 22:31

    If possible you should determine the length of the longest entry in the column and use that to set the width.

    I'm assuming you can make use of for entry in ascii_uppercase.

    I'm on mobile atm so can't give a concrete code example but what I said before should help you get closer to what you want to achieve.

    0 讨论(0)
  • 2021-02-01 22:37
    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
    

    This could probably be made neater but it does the job. You will want to play around with the adjusted_width value according to what is good for the font you are using when viewing it. If you use a monotype you can get it exact but its not a one-to-one correlation so you will still need to adjust it a bit.

    If you want to get fancy and exact without monotype you could sort letters by width and assign each width a float value which you then add up. This would require a third loop parsing each character in the cell value and summing up the result for each column and probably a dictionary sorting characters by width, perhaps overkill but cool if you do it.

    Edit: Actually there seems to be a better way of measuring visual size of text: link personally I would prefer the matplotlib technique.

    Hope I could be of help, my very first stackoverflow answer =)

    0 讨论(0)
  • 2021-02-01 22:42

    I have a problem with merged_cells and autosize not work correctly, if you have the same problem, you can solve adding the next lines inside code of 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
    
    0 讨论(0)
  • 2021-02-01 22:42
    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
    
    0 讨论(0)
  • 2021-02-01 22:47

    Updated version as of openpyxl 3.0.0 (using .columns fails with 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
    
    0 讨论(0)
提交回复
热议问题