Setting styles in Openpyxl

匿名 (未验证) 提交于 2019-12-03 01:51:02

问题:

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). There is a style.py class but it seems I can't set the style attribute of a cell, and I don't really want to start tinkering with the openpyxl source code.

Has anyone found a solution to this?

回答1:

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' 


回答2:

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.



回答3:

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) 


回答4:

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.



回答5:

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_ ;_ * "-"??_ ;_ @_ ' 


回答6:

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



标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!