xlswriter formatting a range
Asked Answered
G

5

12

In xlswriter, once a format is defined, how can you apply it to a range and not to the whole column or the whole row?

for example:

perc_fmt = workbook.add_format({'num_format': '0.00%','align': 'center'})
worksheet.set_column('B:B', 10.00, perc_fmt)

this gets applied it to the whole "B" column, but how can this "perc_fmt" applied to a range, for example, if I do:

range2 = "B2:C15"
worksheet2.write(range2, perc_fmt)

it says:

TypeError: Unsupported type <class 'xlsxwriter.format.Format'> in write()
Garlinda answered 1/12, 2015 at 17:27 Comment(0)
G
14

Actually I found a workaround that avoids doing the loop. You just need to use the conditional formatting (that takes a range as an input) and just format all cases. For example:

worksheet2.conditional_format(color_range2, {'type': 'cell',
                                     'criteria': '>=',
                                     'value': 0, 'format': perc_fmt})
worksheet2.conditional_format(color_range2, {'type': 'cell',
                                     'criteria': '<',
                                     'value': 0, 'format': perc_fmt})  
Garlinda answered 1/12, 2015 at 17:57 Comment(2)
Could you explain why you used conditional_format twice? It works perfectly fine if I use only the first line. Is this an either or? Thanks for your solution!Gazzo
You probably don't have negative values, which the second conditional format would coverLamentation
W
2

In xlswriter, once a format is defined, how can you apply it to a range and not to the whole column or the whole row?

There isn't a helper function to do this. You will need to loop over the range and apply the data and formatting to each cell.

Windfall answered 1/12, 2015 at 17:38 Comment(0)
T
2

It took me quite a time to find this answer, so thank you. I would offer up the additional solution with just one block when your range includes blanks and text fields. This turns the range A2:N5 to my format of peach coloring I defined earlier in my code. Of course you have to make the number more negative if you actually have large negative numbers in your dataset.

    worksheet.conditional_format('A2:N5', {'type': 'cell',
                                           'criteria' : '>', 
                                           'value' : -99999999999,
                                           'format' : peach_format})

I originally tried 'criteria' : '<>', 'value' : 0 but that did not catch the blank cells. If you use the < 99999999999 it would code the text fields as False and would not code them.

Tetrapod answered 30/4, 2021 at 20:57 Comment(0)
G
0

you can use:

{
    'type': 'cell',
    'criteria': 'between',
    'minimum': -10000,
    'maximum': 10000,
    'format': perc_fmt
}

This will save you one line of code

Greenaway answered 6/5, 2021 at 18:3 Comment(0)
O
0

Rather than using {'type': 'cell',... would be better to use a type such as no_errors which doesn't need criteria or value. e.g:

worksheet.conditional_format('A2:N5', {'type': 'no_errors',    
                                       'format' : peach_format})

See https://xlsxwriter.readthedocs.io/working_with_conditional_formats.html#conditional-format-options

Octuple answered 23/7 at 19:51 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.