Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Spreadsheet::WriteExcel conditional formatting based on other cell value

Tags:

excel

perl

I'm trying to add conditional formatting in my excel sheet. Unfortunately examples on Spreadsheet::WriteExcel page are too simple and I don't know how to do it.

I wanted to change row backgroud color by RC10 cell value. In excel I will add formatting formula

=IF(RC10="xxxx";1;0)

I've tried to do something like that in Spreadsheet::WriteExcel:

my $detail_rest_fmt = $excel->add_format(font => "Calibri", size => 11, valign  => "vcenter", align => "right", border => 1);
$detail_rest_fmt->set_num_format("[Green]=IF(RC10=\"xxxx\";1;0);[Red]=IF(RC10=\"yyyyyy\";1;0)"); 

but withouts any effect.

like image 524
patseb Avatar asked Jun 21 '12 07:06

patseb


People also ask

Can you use conditional formatting to format a cell based on its value?

Select one or more cells in a range, table, or PivotTable report. On the Home tab, in the Style group, click the arrow next to Conditional Formatting, and then click Top/Bottom Rules. Select the command you want, such as Top 10 items or Bottom 10 %. Enter the values you want to use, and then select a format.

Can you conditional format a cell based on another cell color?

Usually, you will use the current value in applying conditional formatting. However, you can actually use conditional formatting based on another cell within the sheet.


2 Answers

The bad news is I think it can hardly be done with Spreadsheet::WriteExcel.

The good news is it can easily be done with Excel::Writer::XLSX. Which happens to be a kind of descendant of Spreadsheet::WriteExcel. Please read the article: Spreadsheet::WriteExcel is dead. Long live Excel::Writer::XLSX

The following code does exactly the formatting you want (only based on cell A1 instead of RC10, this can be changed of course):

#!/usr/bin/perl -w
use strict;
use Excel::Writer::XLSX;

my @matrix = (
    ['xxxx', '<-- Change the value in cell A1 to change the colour of row 4'],
    [qw(Redyard Kipling)],
    [qw(If--)],
    [qw(If you can keep your head when all about you)],
    [qw(Are losing theirs and blaming it on you;)],
);

writeSpreadsheet('conditional.formatting.xlsx', \@matrix);

sub writeSpreadsheet {
    my ($outFile, $matrix) = @_;
    my $MIN_COL_WIDTH = 5;
    my $MAX_COL_WIDTH = 35;
    my $workbook = Excel::Writer::XLSX->new($outFile);
    my $worksheet = $workbook->add_worksheet();
    my $redFormat = $workbook->add_format(font => 'Arial', color => 'red');
    my $greenFormat = $workbook->add_format(font => 'Arial', color => 'green', bold => 1);
    $worksheet->set_row(0, undef,
        $workbook->add_format(font => 'Arial', align => 'center', bold => 1));
    $worksheet->conditional_formatting('A4:Z4',
        {
            type => 'formula',
            criteria => '=$A$1 = "xxxx"',
            format => $greenFormat
        }
    );
    $worksheet->conditional_formatting('A4:Z4',
        {
            type => 'formula',
            criteria => '=$A$1 = "yyyyyy"',
            format => $redFormat
        }
    );
    foreach my $row (0 .. $#$matrix) {
        foreach my $col (0 .. $#{$matrix->[$row]}) {
            $worksheet->write($row, $col, $matrix->[$row][$col] || '');
        }
    }
}
like image 157
Anton Shcherbinin Avatar answered Oct 15 '22 00:10

Anton Shcherbinin


Anton, is correct. Conditional formatting isn't really supported in Spreadsheet::WriteExcel.

However, the newer, API compatible replacement, Excel::Writer::XLSX offers a rich set of conditional formatting features.

See the updated Conditional Formatting docs in Excel::Writer::XLSX and this example.

like image 1
jmcnamara Avatar answered Oct 15 '22 00:10

jmcnamara