如何使用Excel :: Writer :: XLSX设置工作簿范围的默认格式?

时间:2016-06-20 08:29:27

标签: perl xlsx

是否可以使用Excel::Writer::XLSX更改或声明默认字体? 我每次创建或添加图表和单元格时都可以设置它。但我认为应该有一个更简单的方法。

1 个答案:

答案 0 :(得分:3)

<强>也许

免责声明: Excel :: Writer :: XLSX的作者解释说这不是一个好主意,并且无法保证herehere正常工作。

创建Format对象时,可以将属性xf_index设置为0。这会将Format设置为默认值。

use Excel::Writer::XLSX;

my $workbook  = Excel::Writer::XLSX->new( 'filename.xlsx' );

# set the default format
$workbook->add_format(xf_index => 0, font => 'Comic Sans MS' ); # I'm on Linux

my $worksheet = $workbook->add_worksheet();
$worksheet->write( 0, 0, 'Hi Excel!' );      # will be in Comic Sans

my $format = $workbook->add_format(font => 'Arial' );
$worksheet->write( 1, 1, 'In Arial!', $format );

文档中未对此进行描述,但reading the code对其进行了解释。

即使您稍后添加更多格式,它仍然有效。您不需要保留该初始调用的Format对象。它将在整个工作簿中使用(可能也在不同的工作表上,但我没有对其进行测试)。

我建议您在代码注释中解释您正在做的事情,因为它真的不是很明显。

经过一些额外的研究后,我在the PDF document OpenOffice.org's Documentation of the Microsoft Excel File Format,第89页底部的第4.6.2章(强调我的)中找到了它。

  

默认的单元格格式   始终存在于Excel文件中,由具有固定索引15(从0开始)的XF记录描述。 默认情况下,它使用   工作表/工作簿默认单元格样式,由第一个XF记录(索引0)描述。

所以现在我们也知道为什么它是xf_index => 0

一般建议的老答案:

一般情况下,不支持。您需要使用格式。 The docs say有一个大小为11的Calibri默认格式。

  

默认格式为Calibri 11,关闭所有其他属性。

您需要为格式,字体系列,字体大小等特定组合创建格式对象,然后您可以在每个单元格或图表中的整个文档中重复使用该格式对象。如果其中一个选项在特定单元格中不同,则需要为其创建一个额外的Format对象。

my $default_format = $workbook->add_format( font => 'Comic Sans' );

# ...

$worksheet->write( 'A1', 'Cell A1', $default_format );

# later ...

$worksheet->write( 'Z3', 'Cell Z3', $default_format );

如果您需要大量不同的格式,但总是希望使用相同的字体,那么将字体字符串设置为格式哈希并使用它可能会很有用。

my %default_formatting = ( font => 'Comic Sans' );
my $bold_format = $workbook->add_format( %default_formatting, bold => 1 );

甚至可以创建一个有助于创建Format对象的sub,并且已经知道默认字体。

sub create_format {
    my ($workbook, %formats) = @_;
    return $workbook->add_format( font => 'Comic Sans', %formats );
}

# somewhere
my $bold_format = create_format( $workbook, bold => 1 );
$worksheet->write( 'A1', 'Cell A1', $bold_format );

这也允许抛弃格式,如下所示:

$worksheet->write( 'D1', 'Weird stuff', create_format( 
    $workbook, 
    bold      => 1,
    strikeout => 1, 
    shadow    => 1,
    bg_color  => 'pink',
));