2012-06-21 171 views
5

我試圖在我的Excel表格中添加條件格式。 不幸的是Spreadsheet :: WriteExcel頁面上的例子太簡單了,我不知道該怎麼做。電子表格:: WriteExcel基於其他單元格值的條件格式化

我希望通過RC10單元格的值更改行研究背景顏色。 在Excel中,我會添加格式公式

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

我試圖做這樣的事情,在電子表格:: 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)"); 

但withouts任何影響。

回答

3

,壞消息是我認爲它幾乎不能完成的電子表格:: WriteExcel。

好消息是,它可以很容易地使用Excel ::作家:: XLSX完成。這恰好是Spreadsheet :: WriteExcel的一種後裔。請閱讀文章:Spreadsheet::WriteExcel is dead. Long live Excel::Writer::XLSX

下面的代碼不正是你想要的格式(僅基於單元格A1,而不是RC10,這是可以改變的,當然):

#!/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

安東,是正確的。條件格式在Spreadsheet::WriteExcel中不受支持。

然而,較新的,API兼容的替代品,Excel::Writer::XLSX提供了一套豐富的條件格式功能。

查看已更新的Conditional Formatting docs in Excel :: Writer :: XLSX和example

+0

WriteExcel的API與XLSX完全兼容? – patseb

+0

是的。參見[Excel :: Writer :: XLSX和Spreadsheet :: WriteExcel](http://search.cpan.org/~jmcnamara/Excel-Writer-XLSX/lib/Excel/Writer/XLSX.pm#Excel::Writer :: XLSX_and_Spreadsheet :: WriteExcel)部分的文檔。 – jmcnamara

1

conditional_formatting的行爲很奇怪。 我有類似的東西:

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

當我使用$ YYY忽略了最低工作(在Excel中設定圖案填充,而不是研究背景顏色) 當我使用$ XXXX它工作正常。 $ yyy和$ xxxx是一樣的,爲什麼它不起作用?

+0

這似乎是我以前不能使用$格式,它必須是「新鮮」的新格式......它沒有意義。 – patseb

0

關於第二個問題:

您可能會遇到其中的格式越來越垃圾收集你使用它們由於範圍的問題之前的問題。

如果它是一個範圍問題,嘗試添加$workbook->close()到你的程序的結束,看看是否能解決它。

不然的話,我們就需要一個更完整的示例程序進行調試。

相關問題