我正在尝试在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)");
但没有任何影响。
答案 0 :(得分:3)
坏消息是我认为使用Spreadsheet :: WriteExcel很难做到。
好消息是可以使用Excel :: Writer :: 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 :(得分:1)
安东,是对的。 Spreadsheet::WriteExcel中不支持条件格式。
但是,较新的API兼容替代品Excel::Writer::XLSX提供了丰富的条件格式设置功能。</ p>
请参阅Excel :: Writer :: XLSX和此Conditional Formatting中更新的example文档。
答案 2 :(得分: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是一样的,为什么它不起作用?
答案 3 :(得分:1)
关于你的第二个问题:
由于范围问题,您可能会遇到格式在使用之前收集垃圾的问题。
如果是范围问题,请尝试在程序末尾添加$workbook->close()
以查看是否修复了该问题。
否则我们需要一个更完整的示例程序来调试它。