2012-06-21 13 views
5

Sto cercando di aggiungere la formattazione condizionale nel mio foglio Excel. Purtroppo gli esempi nella pagina Spreadsheet :: WriteExcel sono troppo semplici e non so come farlo.Foglio di calcolo :: WriteExcel formattazione condizionale basata su altro valore cella

Volevo cambiare il colore del backgroud di riga con il valore di cella RC10. In Excel aggiungerò formula di formattazione

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

Ho cercato di fare qualcosa di simile nel foglio :: 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)"); 

ma withouts alcun effetto.

risposta

3

La cattiva notizia è che penso che possa difficilmente essere fatto con Spreadsheet :: WriteExcel.

La buona notizia è che può essere facilmente eseguita con Excel :: Writer :: XLSX. Che sembra essere una sorta di discendente di Spreadsheet :: WriteExcel. Si prega di leggere l'articolo: Spreadsheet::WriteExcel is dead. Long live Excel::Writer::XLSX

Il seguente codice fa esattamente la formattazione desiderata (solo sulla base di cella A1 al posto di RC10, questo può essere cambiato, naturalmente):

#!/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] || ''); 
     } 
    } 
} 
1

Anton, è corretto. La formattazione condizionale non è realmente supportata in Spreadsheet::WriteExcel.

Tuttavia, la più recente sostituzione compatibile API, Excel::Writer::XLSX offre un ricco set di funzionalità di formattazione condizionale.

Vedere i documenti aggiornati Conditional Formatting in Excel :: Writer :: XLSX e questo example.

+0

API of WriteExcel è compatibile con XLSX? – patseb

+0

Sì. Vedere [Excel :: Writer :: XLSX e Spreadsheet :: WriteExcel] (http://search.cpan.org/~jmcnamara/Excel-Writer-XLSX/lib/Excel/Writer/XLSX.pm#Excel::Writer :: XLSX_and_Spreadsheet :: WriteExcel) sezione della documentazione. – jmcnamara

1

Il comportamento della formattazione condizionale è molto strano. Ho qualcosa di simile:

my $yyy = $excel->add_format(font => "Calibri", size => 11, valign => "vcenter", align => "right", border => 1, border_color => "black", bg_color => $green); 

for my $section (@sections) { 
    for my $sector (@sectors) { 
     my $xxxx = $excel->add_format(font => "Calibri", size => 11, valign => "vcenter", align => "right", border => 1, border_color => "black", bg_color => $green); 
      $sheet->conditional_formatting("A1", 
      { 
       type => "formula", 
       criteria => '=J4="T1"', 
       format => $yyy 
      }); 
    } 
} 

Quando uso $ yyy doesnt lavoro (in Excel non è impostato modello di riempimento invece di colore backgroud) Quando uso $ xxxx funziona benissimo. $ yyy e $ xxxx sono uguali, quindi perché non funziona?

+0

Sembra che non possa usare $ format prima, deve essere "nuovo" nuovo ... non ha senso. – patseb

0

riguarda la seconda domanda:

potrebbe essere rilevato un problema in cui i formati sono sempre garbage collection prima di arrivare a usarli a causa di problemi di portata.

Se si tratta di un problema di ambito, provare a aggiungere un $workbook->close() alla fine del programma per vedere se lo risolve.

Altrimenti avremmo bisogno di un programma di esempio più completo per eseguirne il debug.

Problemi correlati