6

Excel シートに条件付き書式を追加しようとしています。残念ながら、Spreadsheet::WriteExcel ページの例は単純すぎて、その方法がわかりません。

RC10セルの値で行の背景色を変えたいと思っていました。Excelでは、書式設定式を追加します

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

私は 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)"); 

しかし、何の効果もありません。

4

4 に答える 4

4

悪いニュースは、Spreadsheet::WriteExcel ではほとんどできないことです。

良いニュースは、Excel::Writer::XLSX で簡単に実行できることです。これは、Spreadsheet::WriteExcel の子孫の一種です。記事を読んでください: Spreadsheet::WriteExcel は死んでいます。Excel::Writer::XLSX万歳

次のコードは、必要な書式設定を正確に行います (RC10 ではなくセル A1 にのみ基づいています。これはもちろん変更できます)。

#!/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] || '');
        }
    }
}
于 2012-06-21T09:40:30.447 に答える
1

アントン、そうですね。Spreadsheet::WriteExcel では、条件付き書式は実際にはサポートされていません。

ただし、新しい API 互換の代替品であるExcel::Writer::XLSXは、条件付き書式設定機能の豊富なセットを提供します。

Excel::Writer::XLSXの更新された条件付き書式に関するドキュメントと、このを参照してください。

于 2012-06-21T11:31:52.593 に答える
1

2 番目の質問:

スコープの問題が原因で、フォーマットを使用する前にガベージ コレクションが行われるという問題が発生する場合があります。

スコープの問題である場合は$workbook->close()、プログラムの最後に a を追加して、修正されるかどうかを確認してください。

それ以外の場合は、それをデバッグするためのより完全なサンプル プログラムが必要になります。

于 2012-06-28T09:59:31.130 に答える
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 は同じなのに、なぜ機能しないのですか?

于 2012-06-28T09:36:23.407 に答える