Python excel ширина столбца

Improve Article

Save Article

Like Article

  • Read
  • Discuss
  • Improve Article

    Save Article

    Like Article

    Prerequisites : Excel file using openpyxl writing | reading

    Set the height and width of the cells:

    Worksheet objects have row_dimensions and column_dimensions attributes that control row heights and column widths. A sheet’s row_dimensions and column_dimensions are dictionary-like values; row_dimensions contains RowDimension objects and column_dimensions contains ColumnDimension objects. In row_dimensions, one can access one of the objects using the number of the row (in this case, 1 or 2). In column_dimensions, one can access one of the objects using the letter of the column (in this case, A or B).

    Code #1 : Program to set the dimensions of the cells.

    import openpyxl

    wb = openpyxl.Workbook()

    sheet = wb.active

    sheet.cell(row = 1, column = 1).value = ' hello '

    sheet.cell(row = 2, column = 2).value = ' everyone '

    sheet.row_dimensions[1].height = 70

    sheet.column_dimensions['B'].width = 20

    wb.save('dimension.xlsx')

    Output:

     

    Merging the cells:

    A rectangular area of cells can be merged into a single cell with the merge_cells() sheet method. The argument to merge_cells() is a single string of the top-left and bottom-right cells of the rectangular area to be merged.

    Code #2 : Program to merge the cells.

    import openpyxl

    wb = openpyxl.Workbook()

    sheet = wb.active

    sheet.merge_cells('A2:D4')

    sheet.cell(row = 2, column = 1).value = 'Twelve cells join together.'

    sheet.merge_cells('C6:D6')

    sheet.cell(row = 6, column = 6).value = 'Two merge cells.'

    wb.save('merge.xlsx')

    Output:

     

    Unmerging the cells:

    To unmerge cells, call the unmerge_cells() sheet method.

    Code #3 : Program to unmerge the cells.

    import openpyxl

    wb = openpyxl.load_workbook('merge.xlsx')

    sheet = wb.active

    sheet.unmerge_cells('A2:D4')

    sheet.unmerge_cells('C6:D6')

    wb.save('merge.xlsx')

    Output:

     

    Setting the font styles of the cells:

    To customize font styles in cells, important, import the Font() function from the openpyxl.styles module.

    Code #4 : Program to set the font of the text.

    import openpyxl

    from openpyxl.styles import Font

    wb = openpyxl.Workbook()

    sheet = wb.active

    sheet.cell(row = 1, column = 1).value = "Ankit Rai"

    sheet.cell(row = 1, column = 1).font = Font(size = 24 )

    sheet.cell(row = 2, column = 2).value = "Ankit Rai"

    sheet.cell(row = 2, column = 2).font = Font(size = 24, italic = True)

    sheet.cell(row = 3, column = 3).value = "Ankit Rai"

    sheet.cell(row = 3, column = 3).font = Font(size = 24, bold = True)

    sheet.cell(row = 4, column = 4).value = "Ankit Rai"

    sheet.cell(row = 4, column = 4).font = Font(size = 24, name = 'Times New Roman')

    wb.save('styles.xlsx')

    Output:

    Like Article

    Save Article

    I have following script which is converting a CSV file to an XLSX file, but my column size is very narrow. Each time I have to drag them with mouse to read data. Does anybody know how to set column width in openpyxl?

    Here is the code I am using.

    #!/usr/bin/python2.6
    import csv
    from openpyxl import Workbook
    from openpyxl.cell import get_column_letter
    
    f = open('users_info_cvs.txt', "rU")
    
    csv.register_dialect('colons', delimiter=':')
    
    reader = csv.reader(f, dialect='colons')
    
    wb = Workbook()
    dest_filename = r"account_info.xlsx"
    
    ws = wb.worksheets[0]
    ws.title = "Users Account Information"
    
    for row_index, row in enumerate(reader):
        for column_index, cell in enumerate(row):
            column_letter = get_column_letter((column_index + 1))
            ws.cell('%s%s'%(column_letter, (row_index + 1))).value = cell
    
    wb.save(filename = dest_filename)
    

    Yaron's user avatar

    Yaron

    9,9568 gold badges45 silver badges63 bronze badges

    asked Nov 2, 2012 at 14:50

    Satish's user avatar

    1

    You could estimate (or use a mono width font) to achieve this. Let’s assume data is a nested array like

    [['a1','a2'],['b1','b2']]
    

    We can get the max characters in each column. Then set the width to that. Width is exactly the width of a monospace font (if not changing other styles at least). Even if you use a variable width font it is a decent estimation. This will not work with formulas.

    from openpyxl.utils import get_column_letter
    
    column_widths = []
    for row in data:
        for i, cell in enumerate(row):
            if len(column_widths) > i:
                if len(cell) > column_widths[i]:
                    column_widths[i] = len(cell)
            else:
                column_widths += [len(cell)]
        
    for i, column_width in enumerate(column_widths,1):  # ,1 to start at 1
        worksheet.column_dimensions[get_column_letter(i)].width = column_width
    

    A bit of a hack but your reports will be more readable.

    Jean-François Fabre's user avatar

    answered Jan 22, 2013 at 2:20

    Bufke's user avatar

    BufkeBufke

    3,0853 gold badges27 silver badges28 bronze badges

    7

    My variation of Bufke’s answer. Avoids a bit of branching with the array and ignores empty cells / columns.

    Now fixed for non-string cell values.

    ws = your current worksheet
    dims = {}
    for row in ws.rows:
        for cell in row:
            if cell.value:
                dims[cell.column] = max((dims.get(cell.column, 0), len(str(cell.value))))    
    for col, value in dims.items():
        ws.column_dimensions[col].width = value
    

    As of openpyxl version 3.0.3 you need to use

     dims[cell.column_letter] = max((dims.get(cell.column_letter, 0), len(str(cell.value))))
    

    as the openpyxl library will raise a TypeError if you pass column_dimensions a number instead of a column letter, everything else can stay the same.

    Community's user avatar

    answered Mar 4, 2016 at 7:33

    velis's user avatar

    velisvelis

    8,3674 gold badges45 silver badges62 bronze badges

    2

    Even more pythonic way to set the width of all columns that works at least in openpyxl version 2.4.0:

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

    The as_text function should be something that converts the value to a proper length string, like for Python 3:

    def as_text(value):
        if value is None:
            return ""
        return str(value)
    

    answered Dec 2, 2016 at 15:03

    User3759685's user avatar

    User3759685User3759685

    6335 silver badges6 bronze badges

    9

    With openpyxl 3.0.3 the best way to modify the columns is with the DimensionHolder object, which is a dictionary that maps each column to a ColumnDimension object.
    ColumnDimension can get parameters as bestFit, auto_size (which is an alias of bestFit) and width.
    Personally, auto_size doesn’t work as expected and I had to use width and figured out that the best width for the column is len(cell_value) * 1.23.

    To get the value of each cell it’s necessary to iterate over each one, but I personally didn’t use it because in my project I just had to write worksheets, so I got the longest string in each column directly on my data.

    The example below just shows how to modify the column dimensions:

    import openpyxl
    from openpyxl.worksheet.dimensions import ColumnDimension, DimensionHolder
    from openpyxl.utils import get_column_letter
    
    wb = openpyxl.load_workbook("Example.xslx")
    ws = wb["Sheet1"]
    
    dim_holder = DimensionHolder(worksheet=ws)
    
    for col in range(ws.min_column, ws.max_column + 1):
        dim_holder[get_column_letter(col)] = ColumnDimension(ws, min=col, max=col, width=20)
    
    ws.column_dimensions = dim_holder
    

    Locane's user avatar

    Locane

    2,8462 gold badges22 silver badges33 bronze badges

    answered Mar 22, 2020 at 16:12

    G.I. Jack's user avatar

    G.I. JackG.I. Jack

    3513 silver badges3 bronze badges

    1

    I have a problem with merged_cells and autosize not work correctly, if you have the same problem, you can solve with the next code:

    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
    

    answered Apr 24, 2017 at 23:26

    Virako's user avatar

    VirakoVirako

    65010 silver badges18 bronze badges

    We can convert numbers to their ASCII values and give it to column_dimension parameter

    import openpyxl as xl
    
    work_book = xl.load_workbook('file_location')
    sheet = work_book['Sheet1']
    column_number = 2
    column = str(chr(64 + column_number))
    sheet.column_dimensions[column].width = 20
    work_book.save('file_location')
    

    answered Jun 20, 2019 at 6:31

    Prashant Tiwari's user avatar

    A slight improvement of the above accepted answer, that I think is more pythonic (asking for forgiveness is better than asking for permission)

    column_widths = []
    for row in workSheet.iter_rows():
        for i, cell in enumerate(row):
            try:
                column_widths[i] = max(column_widths[i], len(str(cell.value)))
            except IndexError:
                column_widths.append(len(str(cell.value)))
    
    for i, column_width in enumerate(column_widths):
        workSheet.column_dimensions[get_column_letter(i + 1)].width = column_width
    

    answered Oct 17, 2016 at 12:50

    shayst's user avatar

    shaystshayst

    2674 silver badges14 bronze badges

    3

    Here is a more general, simplified solution for users new to the topic (Not specified for the question).

    If you want to change the width or the height of cells in openpyxl (Version 3.0.9), you can do it simply by assigning the attributes of the cells with row_dimensions or column_dimensions.

    import openpyxl
    wb = openpyxl.Workbook()
    sheet = wb["Sheet"]
    
    
    sheet["A1"] = "Tall row"
    sheet["B2"] = "Wide column"
    
    # Change height of row A1
    sheet.row_dimensions[1].height = 100
    # Change width of column B
    sheet.column_dimensions["B"].width = 50
    
    wb.save("StackOverflow.xlsx")
    

    answered Mar 23, 2022 at 10:47

    JAdel's user avatar

    JAdelJAdel

    1,2141 gold badge5 silver badges21 bronze badges

    This is my version referring @Virako ‘s code snippet

    def adjust_column_width_from_col(ws, min_row, min_col, max_col):
    
            column_widths = []
    
            for i, col in 
                    enumerate(
                        ws.iter_cols(min_col=min_col, max_col=max_col, min_row=min_row)
                    ):
    
                for cell in col:
                    value = cell.value
                    if value is not None:
    
                        if isinstance(value, str) is False:
                            value = str(value)
    
                        try:
                            column_widths[i] = max(column_widths[i], len(value))
                        except IndexError:
                            column_widths.append(len(value))
    
            for i, width in enumerate(column_widths):
    
                col_name = get_column_letter(min_col + i)
                value = column_widths[i] + 2
                ws.column_dimensions[col_name].width = value
    

    And how to use is as follows,

    adjust_column_width_from_col(ws, 1,1, ws.max_column)
    

    answered May 15, 2019 at 2:48

    alones's user avatar

    alonesalones

    2,8382 gold badges26 silver badges30 bronze badges

    All the above answers are generating an issue which is that col[0].column is returning number while worksheet.column_dimensions[column] accepts only character such as ‘A’, ‘B’, ‘C’ in place of column. I’ve modified @Virako’s code and it is working fine now.

    import re
    import openpyxl
    ..
    for col in _ws.columns:
        max_lenght = 0
        print(col[0])
        col_name = re.findall('wd', str(col[0]))
        col_name = col_name[0]
        col_name = re.findall('w', str(col_name))[0]
        print(col_name)
        for cell in col:
            try:
                if len(str(cell.value)) > max_lenght:
                    max_lenght = len(cell.value)
            except:
                pass
        adjusted_width = (max_lenght+2)
        _ws.column_dimensions[col_name].width = adjusted_width
    

    answered May 29, 2019 at 4:29

    Ssubrat Rrudra's user avatar

    1

    This is a dirty fix. But openpyxl actually supports auto_fit. But there is no method to access the property.

    import openpyxl
    from openpyxl.utils import get_column_letter
    
    wb = openpyxl.load_workbook("Example.xslx")
    ws = wb["Sheet1"]
    for i in range(1, ws.max_column+1):
        ws.column_dimensions[get_column_letter(i)].bestFit = True
        ws.column_dimensions[get_column_letter(i)].auto_size = True
    

    answered Oct 22, 2020 at 16:39

    Han Luo's user avatar

    Han LuoHan Luo

    1973 silver badges4 bronze badges

    0

    Another approach without storing any state could be like this:

    from itertools import chain
    # Using `ws` as the Worksheet
    for cell in chain.from_iterable(ws.iter_cols()):
        if cell.value:
            ws.column_dimensions[cell.column_letter].width = max(
                ws.column_dimensions[cell.column_letter].width,
                len(f"{cell.value}"),
            )
    

    answered Feb 4, 2022 at 12:56

    grafoo's user avatar

    I had to change @User3759685 above answer to this when the openpxyl updated. I was getting an error. Well @phihag reported this in the comments as well

    for column_cells in ws.columns:
        new_column_length = max(len(as_text(cell.value)) for cell in column_cells)
        new_column_letter = (openpyxl.utils.get_column_letter(column_cells[0].column))
        if new_column_length > 0:
            ws.column_dimensions[new_column_letter].width = new_column_length + 1
    

    answered Aug 24, 2019 at 0:44

    Monte Jones's user avatar

    Monte JonesMonte Jones

    1,1097 silver badges3 bronze badges

    Compiling and applying multiple suggestions above, and extending merged cells detection to the horizontally merged cells only, I could offer this code:

    def adjust_width(ws):
        """
        Adjust width of the columns
        @param ws: worksheet
        @return: None
        """
    
        def is_merged_horizontally(cell):
            """
            Checks if cell is merged horizontally with an another cell
            @param cell: cell to check
            @return: True if cell is merged horizontally with an another cell, else False
            """
            cell_coor = cell.coordinate
            if cell_coor not in ws.merged_cells:
                return False
            for rng in ws.merged_cells.ranges:
                if cell_coor in rng and len(list(rng.cols)) > 1:
                    return True
            return False
    
        for col_number, col in enumerate(ws.columns, start=1):
            col_letter = get_column_letter(col_number)
    
            max_length = max(
                len(str(cell.value or "")) for cell in col if not is_merged_horizontally(cell)
            )
            adjusted_width = (max_length + 2) * 0.95
            ws.column_dimensions[col_letter].width = adjusted_width
    

    answered Jul 7, 2021 at 17:01

    Sergey Nudnov's user avatar

    1

    After update from openpyxl2.5.2a to latest 2.6.4 (final version for python 2.x support), I got same issue in configuring the width of a column.

    Basically I always calculate the width for a column (dims is a dict maintaining each column width):

    dims[cell.column] = max((dims.get(cell.column, 0), len(str(cell.value))))
    

    Afterwards I am modifying the scale to something shortly bigger than original size, but now you have to give the «Letter» value of a column and not anymore a int value (col below is the value and is translated to the right letter):

    worksheet.column_dimensions[get_column_letter(col)].width = value +1 
    

    This will fix the visible error and assigning the right width to your column ;)
    Hope this help.

    answered Nov 11, 2019 at 9:38

    Marco smdm's user avatar

    Marco smdmMarco smdm

    1,0101 gold badge15 silver badges25 bronze badges

    I made a function that is very fast with large Excel files because it uses pandas.read_excel

    import pandas as pd
    from openpyxl import load_workbook
    from openpyxl.utils import get_column_letter
    
    def auto_adjust_column_width(file_path, sheet_name=0):
        column_widths = []
    
        df = pd.read_excel(file_path, sheet_name=sheet_name, header=None)
        for col in df.columns:
            max_length = int(df[col].astype(str).str.len().max() * 1.2)
            column_widths.append(max_length)
    
        wb = load_workbook(file_path)
        if isinstance(sheet_name, int):
            sheet_name = wb.sheetnames[sheet_name]
    
        worksheet = wb[sheet_name]
        for i, column_width in enumerate(column_widths):
            column = get_column_letter(i+1)
            worksheet.column_dimensions[column].width = column_width
        wb.save(file_path)
    
    

    answered May 26, 2021 at 17:22

    Angel's user avatar

    AngelAngel

    1,54518 silver badges30 bronze badges

    When this came up for me, I just did everything I wanted to do with openpyxl, saved the workbook, and opened it again with pywin32. Pywin32 has autofit built in without having to make a bunch of rules/conditions.

    Edit: I should note that pywin32 only works with Windows.

    from win32com.client import Dispatch
    
    excel = Dispatch('Excel.Application')
    wb = excel.Workbooks.Open("excelFile.xlsx")
    
    excel.Worksheets(1).Activate()
    excel.ActiveSheet.Columns.AutoFit()
    
    wb.Save()
    wb.Close()
    excel.Quit()
    

    I did add a rule, however, because I had one text column that had some long values I didn’t need to show. I limited any column to 75 characters.

    excel = Dispatch('Excel.Application')
    wb = excel.Workbooks.Open("excelFile.xlsx")
    
    excel.Worksheets(1).Activate()
    excel.ActiveSheet.Columns.AutoFit()
    
    for col in excel.ActiveSheet.Columns:
        if col.ColumnWidth > 75:
            col.ColumnWidth = 75
    
    wb.Save()
    wb.Close()
    excel.Quit()
     
    

    answered Jun 24, 2021 at 15:40

    bpw1009's user avatar

    bpw1009bpw1009

    991 silver badge4 bronze badges

    2

    Just insert the below line of code in your file

    # 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
    

    answered Aug 11, 2022 at 10:03

    Mounesh's user avatar

    Here is an answer for Python 3.8 and OpenPyXL 3.0.0.

    I tried to avoid using the get_column_letter function but failed.

    This solution uses the newly introduced assignment expressions aka «walrus operator»:

    import openpyxl
    from openpyxl.utils import get_column_letter
    
    workbook = openpyxl.load_workbook("myxlfile.xlsx")
    
    worksheet = workbook["Sheet1"]
    
    MIN_WIDTH = 10
    for i, column_cells in enumerate(worksheet.columns, start=1):
        width = (
            length
            if (length := max(len(str(cell_value) if (cell_value := cell.value) is not None else "")
                              for cell in column_cells)) >= MIN_WIDTH
            else MIN_WIDTH
        )
        worksheet.column_dimensions[get_column_letter(i)].width = width
    

    answered Nov 2, 2019 at 2:19

    dmmfll's user avatar

    dmmflldmmfll

    2,6462 gold badges34 silver badges40 bronze badges

    2

    Since in openpyxl 2.6.1, it requires the column letter, not the column number, when setting the width.

     for column in sheet.columns:
        length = max(len(str(cell.value)) for cell in column)
        length = length if length <= 16 else 16
        sheet.column_dimensions[column[0].column_letter].width = length
    

    answered Nov 27, 2020 at 13:31

    DàChún's user avatar

    DàChúnDàChún

    4,6511 gold badge35 silver badges39 bronze badges

    Документ электронной таблицы Excel называется рабочей книгой. Каждая книга может хранить некоторое количество листов. Лист, просматриваемый пользователем в данный момент, называется активным. Лист состоит из из столбцов (адресуемых с помощью букв, начиная с A) и строк (адресуемых с помощью цифр, начиная с 1).

    Модуль OpenPyXL не поставляется вместе с Python, поэтому его предварительно нужно установить:

    > pip install openpyxl

    Чтение файлов Excel

    Начинаем работать:

    >>> import openpyxl
    >>> wb = openpyxl.load_workbook('example.xlsx')
    >>> type(wb)
    <class 'openpyxl.workbook.workbook.Workbook'>
    >>> wb.sheetnames
    ['Лист1', 'Лист2', 'Лист3']
    >>> sheet = wb.active
    >>> sheet
    <Worksheet "Лист1">
    >>> sheet['A1']
    <Cell Лист1.A1>

    А теперь небольшой скрипт:

    import openpyxl
    
    # читаем excel-файл
    wb = openpyxl.load_workbook('example.xlsx')
    
    # печатаем список листов
    sheets = wb.sheetnames
    for sheet in sheets:
        print(sheet)
    
    # получаем активный лист
    sheet = wb.active
    
    # печатаем значение ячейки A1
    print(sheet['A1'].value)
    # печатаем значение ячейки B1
    print(sheet['B1'].value)

    Результат работы:

    Лист1
    Лист2
    Лист3
    
    2015-04-05 13:34:02
    Яблоки

    Как получить другой лист книги:

    # получаем другой лист
    sheet2 = wb['Лист2']
    # печатаем значение ячейки A1
    print(sheet2['A2'].value)

    Как сделать лист книги активным:

    # делаем третий лист активным
    wb.active = 2

    Как задать имя листа:

    sheet.title = 'Третий лист'

    Объект Cell имеет атрибут value, который содержит значение, хранящееся в ячейке. Объект Cell также имеет атрибуты row, column и coordinate, которые предоставляют информацию о расположении данной ячейки в таблице.

    # получаем ячейку листа B2
    cell = sheet['B2']
    print('Строка: ' + str(cell.row))
    print('Столбец: ' + cell.column)
    print('Ячейка: ' + cell.coordinate)
    print('Значение: ' + cell.value)
    Строка: 2
    Столбец: B
    Ячейка: B2
    Значение: Вишни

    К отдельной ячейке можно также обращаться с помощью метода cell() объекта Worksheet, передавая ему именованные аргументы row и column. Первому столбцу или первой строке соответствует число 1, а не 0:

    # получаем ячейку листа B2
    cell = sheet.cell(row = 2, column = 2)
    print(cell.value)
    Вишни

    Размер листа можно получить с помощью атрибутов max_row и max_column объекта Worksheet:

    rows = sheet.max_row
    cols = sheet.max_column
    
    for i in range(1, rows + 1):
        string = ''
        for j in range(1, cols + 1):
            cell = sheet.cell(row = i, column = j)
            string = string + str(cell.value) + ' '
        print(string)
    2015-04-05 13:34:02 Яблоки 73 
    2015-04-05 03:41:23 Вишни 85 
    2015-04-06 12:46:51 Груши 14 
    2015-04-08 08:59:43 Апельсины 52 
    2015-04-10 02:07:00 Яблоки 152 
    2015-04-10 18:10:37 Бананы 23 
    2015-04-10 02:40:46 Земляника 98

    Чтобы преобразовать буквенное обозначение столбца в цифровое, следует вызвать функцию

    openpyxl.utils.column_index_from_string()

    Чтобы преобразовать цифровое обозначение столбуа в буквенное, следует вызвать функцию

    openpyxl.utils.get_column_letter()

    Для вызова этих функций загружать рабочую книгу не обязательно.

    >>> from openpyxl.utils import get_column_letter, column_index_from_string
    >>> get_column_letter(1)
    'A'
    >>> get_column_letter(27)
    'AA'
    >>> column_index_from_string('A')
    1
    >>> column_index_from_string('AA')
    27

    Используя срезы объектов Worksheet, можно получить все объекты Cell, принадлежащие определенной строке, столбцу или прямоугольной области.

    >>> sheet['A1':'C3']
    ((<Cell 'Лист1'.A1>, <Cell 'Лист1'.B1>, <Cell 'Лист1'.C1>),
     (<Cell 'Лист1'.A2>, <Cell 'Лист1'.B2>, <Cell 'Лист1'.C2>),
     (<Cell 'Лист1'.A3>, <Cell 'Лист1'.B3>, <Cell 'Лист1'.C3>))
    for row in sheet['A1':'C3']:
        string = ''
        for cell in row:
            string = string + str(cell.value) + ' '
        print(string)
    2015-04-05 13:34:02 Яблоки 73 
    2015-04-05 03:41:23 Вишни 85 
    2015-04-06 12:46:51 Груши 14 

    Выводим значения второй колонки:

    >>> sheet['B']
    (<Cell 'Лист1'.B1>, <Cell 'Лист1'.B2>, <Cell 'Лист1'.B3>, <Cell 'Лист1'.B4>, ..., <Cell 'Лист1'.B7>)
    for cell in sheet['B']:
        print(cell.value)
    Яблоки
    Вишни
    Груши
    Апельсины
    Яблоки
    Бананы
    Земляника

    Выводим строки с первой по третью:

    >>> sheet[1:3]
    ((<Cell 'Лист1'.A1>, <Cell 'Лист1'.B1>, <Cell 'Лист1'.C1>),
     (<Cell 'Лист1'.A2>, <Cell 'Лист1'.B2>, <Cell 'Лист1'.C2>),
     (<Cell 'Лист1'.A3>, <Cell 'Лист1'.B3>, <Cell 'Лист1'.C3>))
    for row in sheet[1:3]:
        string = ''
        for cell in row:
            string = string + str(cell.value) + ' '
        print(string)
    2015-04-05 13:34:02 Яблоки 73 
    2015-04-05 03:41:23 Вишни 85 
    2015-04-06 12:46:51 Груши 14 

    Для доступа к ячейкам конкретной строки или столбца также можно воспользоваться атрибутами rows и columns объекта Worksheet.

    >>> list(sheet.rows)
    [(<Cell 'Лист1'.A1>, <Cell 'Лист1'.B1>, <Cell 'Лист1'.C1>),
     (<Cell 'Лист1'.A2>, <Cell 'Лист1'.B2>, <Cell 'Лист1'.C2>),
     ..........
     (<Cell 'Лист1'.A6>, <Cell 'Лист1'.B6>, <Cell 'Лист1'.C6>),
     (<Cell 'Лист1'.A7>, <Cell 'Лист1'.B7>, <Cell 'Лист1'.C7>)]
    for row in sheet.rows:
        print(row)
    (<Cell 'Лист1'.A1>, <Cell 'Лист1'.B1>, <Cell 'Лист1'.C1>)
    (<Cell 'Лист1'.A2>, <Cell 'Лист1'.B2>, <Cell 'Лист1'.C2>)
    ..........
    (<Cell 'Лист1'.A6>, <Cell 'Лист1'.B6>, <Cell 'Лист1'.C6>)
    (<Cell 'Лист1'.A7>, <Cell 'Лист1'.B7>, <Cell 'Лист1'.C7>)
    >>> list(sheet.columns)
    [(<Cell 'Лист1'.A1>, <Cell 'Лист1'.A2>, <Cell 'Лист1'.A3>, <Cell 'Лист1'.A4>, ..., <Cell 'Лист1'.A7>),
     (<Cell 'Лист1'.B1>, <Cell 'Лист1'.B2>, <Cell 'Лист1'.B3>, <Cell 'Лист1'.B4>, ..., <Cell 'Лист1'.B7>),
     (<Cell 'Лист1'.C1>, <Cell 'Лист1'.C2>, <Cell 'Лист1'.C3>, <Cell 'Лист1'.C4>, ..., <Cell 'Лист1'.C7>)]
    for column in sheet.columns:
        print(column)
    (<Cell 'Лист1'.A1>, <Cell 'Лист1'.A2>, <Cell 'Лист1'.A3>, <Cell 'Лист1'.A4>, ..., <Cell 'Лист1'.A7>)
    (<Cell 'Лист1'.B1>, <Cell 'Лист1'.B2>, <Cell 'Лист1'.B3>, <Cell 'Лист1'.B4>, ..., <Cell 'Лист1'.B7>)
    (<Cell 'Лист1'.C1>, <Cell 'Лист1'.C2>, <Cell 'Лист1'.C3>, <Cell 'Лист1'.C4>, ..., <Cell 'Лист1'.C7>)

    Выводим значения всех ячеек листа:

    for row in sheet.rows:
        string = ''
        for cell in row:
            string = string + str(cell.value) + ' '
        print(string)
    2015-04-05 13:34:02 Яблоки 73 
    2015-04-05 03:41:23 Вишни 85 
    2015-04-06 12:46:51 Груши 14 
    2015-04-08 08:59:43 Апельсины 52 
    2015-04-10 02:07:00 Яблоки 152 
    2015-04-10 18:10:37 Бананы 23 
    2015-04-10 02:40:46 Земляника 98 

    Выводим значения второй строки (индекс 1):

    for cell in list(sheet.rows)[1]:
        print(str(cell.value))
    2015-04-05 03:41:23
    Вишни
    85

    Выводим значения второй колонки (индекс 1):

    for row in sheet.rows:
        print(str(row[1].value))
    Яблоки
    Вишни
    Груши
    Апельсины
    Яблоки
    Бананы
    Земляника

    Запись файлов Excel

    >>> import openpyxl
    >>> wb = openpyxl.Workbook()
    >>> wb.sheetnames
    ['Sheet']
    >>> wb.create_sheet(title = 'Первый лист', index = 0)
    <Worksheet "Первый лист">
    >>> wb.sheetnames
    ['Первый лист', 'Sheet']
    >>> wb.remove(wb['Первый лист'])
    >>> wb.sheetnames
    ['Sheet']
    >>> wb.save('example.xlsx')

    Метод create_sheet() возвращает новый объект Worksheet, который по умолчанию становится последним листом книги. С помощью именованных аргументов title и index можно задать имя и индекс нового листа.

    Метод remove() принимает в качестве аргумента не строку с именем листа, а объект Worksheet. Если известно только имя листа, который надо удалить, используйте wb[sheetname]. Еще один способ удалить лист — использовать инструкцию del wb[sheetname].

    Не забудьте вызвать метод save(), чтобы сохранить изменения после добавления или удаления листа рабочей книги.

    Запись значений в ячейки напоминает запись значений в ключи словаря:

    >>> import openpyxl
    >>> wb = openpyxl.Workbook()
    >>> wb.create_sheet(title = 'Первый лист', index = 0)
    >>> sheet = wb['Первый лист']
    >>> sheet['A1'] = 'Здравствуй, мир!'
    >>> sheet['A1'].value
    'Здравствуй, мир!'

    Заполняем таблицу 3×3:

    import openpyxl
    
    # создаем новый excel-файл
    wb = openpyxl.Workbook()
    
    # добавляем новый лист
    wb.create_sheet(title = 'Первый лист', index = 0)
    
    # получаем лист, с которым будем работать
    sheet = wb['Первый лист']
    
    for row in range(1, 4):
        for col in range(1, 4):
            value = str(row) + str(col)
            cell = sheet.cell(row = row, column = col)
            cell.value = value
    
    wb.save('example.xlsx')

    Можно добавлять строки целиком:

    sheet.append(['Первый', 'Второй', 'Третий'])
    sheet.append(['Четвертый', 'Пятый', 'Шестой'])
    sheet.append(['Седьмой', 'Восьмой', 'Девятый'])

    Стилевое оформление

    Для настройки шрифтов, используемых в ячейках, необходимо импортировать функцию Font() из модуля openpyxl.styles:

    from openpyxl.styles import Font

    Ниже приведен пример создания новой рабочей книги, в которой для шрифта, используемого в ячейке A1, устанавливается шрифт Arial, красный цвет, курсивное начертание и размер 24 пункта:

    import openpyxl
    from openpyxl.styles import Font
    
    # создаем новый excel-файл
    wb = openpyxl.Workbook()
    # добавляем новый лист
    wb.create_sheet(title = 'Первый лист', index = 0)
    # получаем лист, с которым будем работать
    sheet = wb['Первый лист']
    
    font = Font(name='Arial', size=24, italic=True, color='FF0000')
    sheet['A1'].font = font
    sheet['A1'] = 'Здравствуй мир!'
    
    # записываем файл
    wb.save('example.xlsx')

    Именованные стили применяются, когда надо применить стилевое оформление к большому количеству ячеек.

    import openpyxl
    from openpyxl.styles import NamedStyle, Font, Border, Side
    
    # создаем новый excel-файл
    wb = openpyxl.Workbook()
    # добавляем новый лист
    wb.create_sheet(title = 'Первый лист', index = 0)
    # получаем лист, с которым будем работать
    sheet = wb['Первый лист']
    
    # создаем именованный стиль
    ns = NamedStyle(name='highlight')
    ns.font = Font(bold=True, size=20)
    border = Side(style='thick', color='000000')
    ns.border = Border(left=border, top=border, right=border, bottom=border)
    
    # вновь созданный именованный стиль надо зарегистрировать
    # для дальнейшего использования
    wb.add_named_style(ns)
    
    # теперь можно использовать именованный стиль
    sheet['A1'].style = 'highlight'
    
    # записываем файл
    wb.save('example.xlsx')

    Добавление формул

    Формулы, начинающиеся со знака равенства, позволяют устанавливать для ячеек значения, рассчитанные на основе значений в других ячейках.

    sheet['B9'] = '=SUM(B1:B8)'

    Эта инструкция сохранит =SUM(B1:B8) в качестве значения в ячейке B9. Тем самым для ячейки B9 задается формула, которая суммирует значения, хранящиеся в ячейках от B1 до B8.

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

    Использование ссылок на ячейки позволяет пересчитывать результат по формулам, когда происходят изменения содержимого ячеек, включенных в формулы. Формулы Excel начинаются со знака =. Скобки () могут использоваться для определения порядка математических операции.

    Примеры формул Excel: =27+36, =А1+А2-АЗ, =SUM(А1:А5), =MAX(АЗ:А5), =(А1+А2)/АЗ.

    Хранящуюся в ячейке формулу можно читать, как любое другое значение. Однако, если нужно получить результат расчета по формуле, а не саму формулу, то при вызове функции load_workbook() ей следует передать именованный аргумент data_only со значением True.

    Настройка строк и столбцов

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

    Настройка высоты строк и ширины столбцов

    Объекты Worksheet имеют атрибуты row_dimensions и column_dimensions, которые управляют высотой строк и шириной столбцов.

    sheet['A1'] = 'Высокая строка'
    sheet['B2'] = 'Широкий столбец'
    
    sheet.row_dimensions[1].height = 70
    sheet.column_dimensions['B'].width = 30

    Атрибуты row_dimensions и column_dimensions представляют собой значения, подобные словарю. Атрибут row_dimensions содержит объекты RowDimensions, а атрибут column_dimensions содержит объекты ColumnDimensions. Доступ к объектам в row_dimensions осуществляется с использованием номера строки, а доступ к объектам в column_dimensions — с использованием буквы столбца.

    Для указания высоты строки разрешено использовать целые или вещественные числа в диапазоне от 0 до 409. Для указания ширины столбца можно использовать целые или вещественные числа в диапазоне от 0 до 255. Столбцы с нулевой шириной и строки с нулевой высотой невидимы для пользователя.

    Объединение ячеек

    Ячейки, занимающие прямоугольную область, могут быть объединены в одну ячейку с помощью метода merge_cells() рабочего листа:

    sheet.merge_cells('A1:D3')
    sheet['A1'] = 'Объединены двенадцать ячеек'
    
    sheet.merge_cells('C5:E5')
    sheet['C5'] = 'Объединены три ячейки'

    Чтобы отменить слияние ячеек, надо вызвать метод unmerge_cells():

    sheet.unmerge_cells('A1:D3')
    sheet.unmerge_cells('C5:E5')

    Закрепление областей

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

    У объекта Worksheet имеется атрибут freeze_panes, значением которого может служить объект Cell или строка с координатами ячеек. Все строки и столбцы, расположенные выше и левее, будут заблокированы.

    Значение атрибута freeze_panes Заблокированные строки и столбцы
    sheet.freeze_panes = 'A2' Строка 1
    sheet.freeze_panes = 'B1' Столбец A
    sheet.freeze_panes = 'C1' Столбцы A и B
    sheet.freeze_panes = 'C2' Строка 1 и столбцы A и B
    sheet.freeze_panes = None Закрепленные области отсутствуют

    Диаграммы

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

    1. создать объект Reference на основе ячеек в пределах выделенной прямоугольной области;
    2. создать объект Series, передав функции Series() объект Reference;
    3. создать объект Chart;
    4. дополнительно можно установить значения переменных drawing.top, drawing.left, drawing.width, drawing.height объекта Chart, определяющих положение и размеры диаграммы;
    5. добавить объект Chart в объект Worksheet.

    Объекты Reference создаются путем вызова функции openpyxl.charts.Reference(), принимающей пять аргуменов:

    1. Объект Worksheet, содержащий данные диаграммы.
    2. Два целых числа, представляющих верхнюю левую ячейку выделенной прямоугольной области, в которых содержатся данные диаграммы: первое число задает строку, второе — столбец; первой строке соответствует 1, а не 0.
    3. Два целых числа, представляющих нижнюю правую ячейку выделенной прямоугольной области, в которых содержатся данные диаграммы: первое число задает строку, второе — столбец.
    from openpyxl import Workbook
    from openpyxl.chart import BarChart, Reference
    
    # создаем новый excel-файл
    wb = Workbook()
    # добавляем новый лист
    wb.create_sheet(title = 'Первый лист', index = 0)
    # получаем лист, с которым будем работать
    sheet = wb['Первый лист']
    
    sheet['A1'] = 'Серия 1'
    # это колонка с данными
    for i in range(1, 11):
        cell = sheet.cell(row = i + 1, column = 1)
        cell.value = i * i
    
    # создаем диаграмму
    chart = BarChart()
    chart.title = 'Первая серия данных'
    data = Reference(sheet, min_col = 1, min_row = 1, max_col = 1, max_row = 11)
    chart.add_data(data, titles_from_data = True)
    
    # добавляем диаграмму на лист
    sheet.add_chart(chart, 'C2')
    
    # записываем файл
    wb.save('example.xlsx')

    Аналогично можно создавать графики, точечные и круговые диаграммы, вызывая методы:

    • openpyxl.chart.LineChart()
    • openpyxl.chart.ScatterChart()
    • openpyxl.chart.PieChart()

    Поиск:
    Excel • MS • Python • Web-разработка • Модуль

    Microsoft Excel is one of the most widely used tools today. Most software projects intend to use it for organizing data. Thus it becomes necessary to have easy ways to access Excel sheets without opening the application every time. Python provides you ways to operate on excel without directly opening the software, through the openpyxl library.
    By now, you may be familiar with the various operations you can perform using openpyxl. ( iter_rows, fill cells with colors using openpyxl)
    This tutorial will teach you how to modify column width size in openpyxl.

    Installing openpyxl

    First of all, you must make sure to install the openpyxl library. You can do the same by running the below command on your terminal.

    pip install openpyxl

    How to install openpyxl in Python

    To change or modify column width size

    In order to change the column width size, you can make use of the column_dimesnsions method of the worksheet class.
    Syntax: worksheet.column_dimensions[column name].width=size

    Let us look into the same with example below.

    Consider an existing excel file codespeedy.xlsx as shown below;

    How to change or modify column width size in Openpyxl

    So, now let us change the column size of column A;

    import openpyxl
    worksheet = openpyxl.load_workbook("codespeedy.xlsx")
    sheet = worksheet.active
    sheet.column_dimensions['A'].width = 20
    worksheet.save("codespeedy1.xlsx")

    As you can see, we have modified the column size of A to 20 and saved the file after modification as codespeedy1.xlsx.

    How to change or modify column width size in Openpyxl

    Similarly, you can also modify the column width of many rows as shown;

    import openpyxl
    worksheet = openpyxl.load_workbook("codespeedy.xlsx")
    sheet = worksheet.active
    sheet.column_dimensions['A'].width = 20
    sheet.column_dimensions['C'].width = 20
    sheet.column_dimensions['E'].width = 30
    worksheet.save("codespeedy1.xlsx")

    openpyxl

    Well, isn’t it amazing how you can manage such significant changes with such simple, small lines of code? Well, that in itself is the beauty of Python.

    Also, check out Python Program to Merge Excel Cells using openpyxl.

    Понравилась статья? Поделить с друзьями:
  • Python excel чтение столбца
  • Python excel чтение запись
  • Python excel цвет ячейки
  • Python excel форматирование ячейки
  • Python excel формат ячеек