2012-06-21 18 views
5

Estoy tratando de agregar formato condicional en mi hoja de Excel. Lamentablemente, los ejemplos en la página de hoja de cálculo :: WriteExcel son demasiado simples y no sé cómo hacerlo.Hoja de cálculo :: WriteExcel formateo condicional basado en otro valor de celda

Quería cambiar el color del fondo de fila por el valor de celda RC10. en Excel que se sumará fórmula de formato

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

He tratado de hacer algo así en hoja de cálculo :: 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)"); 

pero withouts ningún efecto.

Respuesta

3

La mala noticia es que creo que difícilmente se puede hacer con Spreadsheet :: WriteExcel.

La buena noticia es que se puede hacer fácilmente con Excel :: Writer :: XLSX. Lo que resulta ser un tipo de descendiente de Spreadsheet :: WriteExcel. Por favor leer el artículo: Spreadsheet::WriteExcel is dead. Long live Excel::Writer::XLSX

El código siguiente no exactamente el formato que desee (sólo sobre la base de la celda A1 en lugar de RC10, esto se puede cambiar, por supuesto):

#!/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, es correcta. El formato condicional no es realmente compatible con Spreadsheet::WriteExcel.

Sin embargo, el más nuevo, reemplazo compatible con API, Excel::Writer::XLSX ofrece un amplio conjunto de funciones de formato condicional.

Consulte los documentos actualizados Conditional Formatting en Excel :: Writer :: XLSX y este example.

+0

API de WriteExcel es compatible con XLSX? – patseb

+0

Sí. Consulte [Excel :: Writer :: XLSX y Spreadsheet :: WriteExcel] (http://search.cpan.org/~jmcnamara/Excel-Writer-XLSX/lib/Excel/Writer/XLSX.pm#Excel::Writer :: XLSX_and_Spreadsheet :: WriteExcel) sección de la documentación. – jmcnamara

1

El comportamiento de conditional_formatting es muy extraño. que tiene algo así:

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 
      }); 
    } 
} 

Cuando uso $ yyy que dosen't trabajo (en Excel no se ajusta relleno de patrón en lugar de color de fondo de color) Cuando uso $ xxxx funciona bien. $ aaa y $ xxxx son lo mismo, entonces, ¿por qué no funciona?

+0

Parece que no puedo usar el formato $ antes, tiene que ser nuevo "nuevo" ... no tiene sentido. – patseb

0

Para su segunda pregunta:

Es posible que ocurra un problema por el que los formatos están recibiendo basura recogida antes de llegar a utilizarlas debido a problemas de alcance.

Si se trata de un problema de alcance intente agregar un $workbook->close() al final de su programa para ver si lo soluciona.

De lo contrario, necesitaríamos un programa de ejemplo más completo para depurarlo.

Cuestiones relacionadas