python docx set table cell background and text color

前端 未结 6 759
故里飘歌
故里飘歌 2021-01-12 20:51

I am using python 2.7 with docx and I would like to change the background and text color of cells in my table based on condition.

I could not find any usefull resour

相关标签:
6条回答
  • 2021-01-12 21:19

    If you want to loop through the cells in a row use:

    def color_row(row=0):
        'make row of cells background colored, defaults to column header row'
        row = t.rows[row]
        for cell in row.cells:
            shading_elm_2 = parse_xml(r'<w:shd {} w:fill="1F5C8B"/>'.format(nsdecls('w')))
            cell._tc.get_or_add_tcPr().append(shading_elm_2)
    

    run the function to color cells in the second row

    color_row(2)

    0 讨论(0)
  • 2021-01-12 21:23

    If you want to color fill a specific cell in a table you can use the code below. For example let's say you need to fill the first cell in the first row of your table with the RGB color 1F5C8B:

    from docx.oxml.ns import nsdecls
    from docx.oxml import parse_xml
    
    shading_elm_1 = parse_xml(r'<w:shd {} w:fill="1F5C8B"/>'.format(nsdecls('w')))
    table.rows[0].cells[0]._tc.get_or_add_tcPr().append(shading_elm_1)
    

    Now if you want to also fill the second cell in the first row with the same color, you should create a new element otherwise if you use the same element as above the fill will move on and will disappear from the first cell...

    shading_elm_2 = parse_xml(r'<w:shd {} w:fill="1F5C8B"/>'.format(nsdecls('w')))
    table.rows[0].cells[1]._tc.get_or_add_tcPr().append(shading_elm_2)
    

    ...and so on for other cells.

    Source: https://groups.google.com/forum/#!topic/python-docx/-c3OrRHA3qo

    0 讨论(0)
  • 2021-01-12 21:28

    What we found is that, if you do cell.add_paragraph('sometext', style_object), it will keep the existing empty paragraph and add an additional paragraph with the style, which is not ideal.

    What you will want to do is something like:

    # replace the entire content of cell with new text paragraph
    cell.text = 'some text'
    # assign new style to the first paragraph
    cell.paragraphs[0].style = style_object 
    

    Note that the style is applied to the paragraph not the cell, which isn't ideal for background colors (since it won't fill the enter cell if you have some padding. I haven't found a way around that (except in the case where you want EVERY cell to have a background color, you can apply a style to table.style).

    Also, make sure that your styles are defined. You can check

    styles = documents.styles
    for s in styles:
      print s.name
    

    to see all the styles you have. You can define new styles and also load a template document with pre-defined styles already.

    0 讨论(0)
  • 2021-01-12 21:30

    Taking from Nikos Tavoularis answer I would just change the shading_elm_1 declaration, as if you include the cell color in a loop for instance things might get messy.

    As such, my suggestion would be:

    from docx.oxml.ns import nsdecls
    from docx.oxml import parse_xml
    
    table.rows[0].cells[0]._tc.get_or_add_tcPr().append(parse_xml(r'<w:shd {} w:fill="1F5C8B"/>'.format(nsdecls('w'))))
    
    0 讨论(0)
  • 2021-01-12 21:33

    It looks like instead of using the cell.text = "Something" method you need to use the cell.add_paragraph("SomeText", a_style) with a defined style - probably one of:

    • ColorfulGrid
    • ColorfulGrid-Accent1
    • ColorfulGrid-Accent2
    • ColorfulGrid-Accent3
    • ColorfulGrid-Accent4
    • ColorfulGrid-Accent5
    • ColorfulGrid-Accent6

    Full list here.

    If you use the “default” template document - otherwise you will have to create your own.

    0 讨论(0)
  • 2021-01-12 21:33

    With Nikos Tavoularis' solution, we have to create a new element for every cell. I have created a function that achieves this. Works in Python revision 3.5.6 and python-docx revision 0.8.10

    from docx.oxml import OxmlElement
    from docx.oxml.ns import qn
    
    def set_table_header_bg_color(table.rows[row_ix].cell):
        """
        set background shading for Header Rows
        """
        tblCell = cell._tc
        tblCellProperties = tc.get_or_add_tcPr()
        clShading = OxmlElement('w:shd')
        clShading.set(qn('w:fill'), "00519E") #Hex of Dark Blue Shade {R:0x00, G:0x51, B:0x9E}
        tblCellProperties.append(clShading)
        return cell
    """
    End of set_table_header_bg_color Function
    """
    # main function
    """
    ..
    ..
    ..
    1. Load Document
    ..
    2. Access the required section
    ..
    3. Load the required Table
    ..
    4. Traverse to the cell by accessing the rows object
    ..
    """
    for each_row in table.rows :
        for each_cell in each_row.cells:
            if each_cell.value satisfies a condition:
                set_table_header_bg_color(each_cell)
    """
    5. Continue execution
    """
    
    0 讨论(0)
提交回复
热议问题