Setting styles in Openpyxl

后端 未结 7 898
遇见更好的自我
遇见更好的自我 2020-12-01 03:17

I need advice on setting styles in Openpyxl.

I see that the NumberFormat of a cell can be set, but I also require setting of font colors and attributes (bold etc). T

相关标签:
7条回答
  • 2020-12-01 03:55

    Like openpyxl doc said:

    This is an open source project, maintained by volunteers in their spare time. This may well mean that particular features or functions that you would like are missing.

    I checked openpyxl source code, found that:

    Till openpyxl 1.8.x, styles are mutable. Their attribute can be assigned directly like this:

    from openpyxl.workbook import Workbook
    from openpyxl.style import Color
    
    wb = Workbook()
    ws = wb.active
    ws['A1'].style.font.color.index = Color.RED
    

    However from of openpyxl 1.9, styles are immutable.

    Styles are shared between objects and once they have been assigned they cannot be changed. This stops unwanted side-effects such as changing the style for lots of cells when instead of only one.

    To create a new style object, you can assign it directly, or copy one from an existing cell's style with new attributes, answer to the question as an example(forgive my Chinese English):

    from openpyxl.styles import colors
    from openpyxl.styles import Font, Color
    from openpyxl import Workbook
    wb = Workbook()
    ws = wb.active
    
    a1 = ws['A1']
    d4 = ws['D4']
    
    # create a new style with required attributes
    ft_red = Font(color=colors.RED) 
    a1.font = ft_red
    
    # you can also do it with function copy
    ft_red_bold = ft_red.copy(bold=True)
    
    # you can copy from a cell's style with required attributes
    ft_red_sigle_underline = a1.font.copy(underline="single")
    
    d4.font = ft_red_bold
    
    # apply style to column E
    col_e = ws.column_dimensions['E']
    col_e.font = ft_red_sigle_underline
    

    A cell' style contains these attributes: font, fill, border, alignment, protection and number_format. Check openpyxl.styles.

    They are similar and should be created as an object, except number_format, its value is string type.

    Some pre-defined number formats are available, number formats can also be defined in string type. Check openpyxl.styles.numbers.

    from openpyxl.styles import numbers
    
    # use pre-defined values
    ws.cell['T49'].number_format = numbers.FORMAT_GENERAL
    ws.cell(row=2, column=4).number_format = numbers.FORMAT_DATE_XLSX15
    
    # use strings
    ws.cell['T57'].number_format = 'General'
    ws.cell(row=3, column=5).number_format = 'd-mmm-yy'
    ws.cell['E5'].number_format = '0.00'
    ws.cell['E50'].number_format = '0.00%'
    ws.cell['E100'].number_format = '_ * #,##0_ ;_ * -#,##0_ ;_ * "-"??_ ;_ @_ '
    
    0 讨论(0)
  • 2020-12-01 03:56

    As of openpyxl 2.0, setting cell styles is done by creating new style objects and by assigning them to properties of a cell.

    There are several style objects: Font, PatternFill, Border, and Alignment. See the doc.

    To change a style property of a cell, first you either have to copy the existing style object from the cell and change the value of the property or you have to create a new style object with the desired settings. Then, assign the new style object to the cell.

    Example of setting the font to bold and italic of cell A1:

    from openpyxl import Workbook
    from openpyxl.styles import Font
    # Create workbook
    wb = Workbook()
    # Select active sheet
    ws = wb.active()
    # Select cell A1
    cell = ws['A1']
    # Make the text of the cell bold and italic
    cell.font = cell.font.copy(bold=True, italic=True)
    
    0 讨论(0)
  • 2020-12-01 04:02

    For openpyxl version 2.4.1 and above use below code to set font color:

    from openpyxl.styles import Font
    from openpyxl.styles.colors import Color
    
    ws1['A1'].font = Font(color = "FF0000")
    

    hex codes for various colors can be found at: http://dmcritchie.mvps.org/excel/colors.htm

    0 讨论(0)
  • 2020-12-01 04:04

    As of openpyxl-1.7.0 you can do this too:

    cell.style.fill.start_color.index = "FF124191"
    

    I've got a couple of helper functions which set a style on a given cell - things like headers, footers etc.

    0 讨论(0)
  • 2020-12-01 04:08

    As of openpyxl version 1.5.7, I have successfully applied the following worksheet style options...

    from openpyxl.reader.excel import load_workbook
    from openpyxl.workbook import Workbook
    from openpyxl.styles import Color, Fill
    from openpyxl.cell import Cell
    
    # Load the workbook...
    book = load_workbook('foo.xlsx')
    
    # define ws here, in this case I pick the first worksheet in the workbook...
    #    NOTE: openpyxl has other ways to select a specific worksheet (i.e. by name
    #    via book.get_sheet_by_name('someWorksheetName'))
    ws = book.worksheets[0]
    
    ## ws is a openpypxl worksheet object
    _cell = ws.cell('C1')
    
    # Font properties
    _cell.style.font.color.index = Color.GREEN
    _cell.style.font.name = 'Arial'
    _cell.style.font.size = 8
    _cell.style.font.bold = True
    _cell.style.alignment.wrap_text = True
    
    # Cell background color
    _cell.style.fill.fill_type = Fill.FILL_SOLID
    _cell.style.fill.start_color.index = Color.DARKRED
    
    # You should only modify column dimensions after you have written a cell in 
    #     the column. Perfect world: write column dimensions once per column
    # 
    ws.column_dimensions["C"].width = 60.0
    

    FYI, you can find the names of the colors in openpyxl/style.py... I sometimes I patch in extra colors from the X11 color names

    class Color(HashableObject):
        """Named colors for use in styles."""
        BLACK = 'FF000000'
        WHITE = 'FFFFFFFF'
        RED = 'FFFF0000'
        DARKRED = 'FF800000'
        BLUE = 'FF0000FF'
        DARKBLUE = 'FF000080'
        GREEN = 'FF00FF00'
        DARKGREEN = 'FF008000'
        YELLOW = 'FFFFFF00'
        DARKYELLOW = 'FF808000'
    
    0 讨论(0)
  • 2020-12-01 04:14

    As of openpyxl 2.0, styles are immutable.

    If you have a cell, you can (e.g.) set bold text by:

    cell.style = cell.style.copy(font=cell.style.font.copy(bold=True))

    Yes, this is annoying.

    0 讨论(0)
提交回复
热议问题