详细版:https://www.jianshu.com/p/84bda53827c8
第一种方法:
读写excel2007文档的perl模块:
Spreadsheet::XLSX(读)和Spreadsheet::WriteExcel(写)
一、首先安装包
- Archive::Zip -- 1.30
- Compress-Raw-Zlib-2.026
这两个依赖包安装完毕之后,就用到主要的包:Spreadsheet::XLSX
解析的时候,同样遇到中文的问题。这时需要用use Encode 实现从 utf8 -> gbk(gb2312) 的转换。
第二种方法:
二、用法(翻译官方文档)
NAME 名称
Excel::Writer::XLSX - 以Excel2007+XLSX格式创建一个新文件(兼容2003).
VERSION 版本
该文档是在2011年4月发布的Excel::Writer::XLSX 0.34版本。
SYNOPSIS 概要
在perl.xlsx的第一个工作表中写入字符串、格式化的字符串、数字和公式:
use Excel::Writer::XLSX;
# 新建excel工作簿
my $workbook = Excel::Writer::XLSX->new( \'perl.xlsx\' );
# 增加一个工作表
$worksheet = $workbook->add_worksheet();
# 添加并定义一个格式
$format = $workbook->add_format();#增加一种格式
$format->set_bold(); #设置粗体
$format->set_color( \'red\' ); #设置颜色
$format->set_align( \'center\' ); #设置对齐方式(此处为居中)
#写入一个格式化和非格式化的字符串,使用行列表示法。
$col = $row = 0; #设置行和列的位置
$worksheet->write( $row, $col, \'Hi Excel!\', $format );
$worksheet->write( 1, $col, \'Hi Excel!\' );
#使用A1表示法写入一个数字和公式
$worksheet->write( \'A3\', 1.2345 ); #在第三行第一列写入一个数字
$worksheet->write( \'A4\', \'=SIN(PI()/4)\' ); #在第四行第一列写入一个公式
DESCRIPTION 说明
The "Excel::Writer::XLSX" 模块可以被用做建立Excel2007+ XLSX格式的文件。
XLSX格式是Excel 2007 和以后版本使用的官方开放XML(OOXML)格式
可在工作簿中添加多张工作表,格式可以被应用到单元格中。可以把文字,数字,和公式写入单元格。
此模块目前还不能被用于向一个已经存在的EXCEl XLSX文件中写入数据。
Excel::Writer::XLSX and Spreadsheet::WriteExcel
Excel::Writer::XLSX使用和Spreadsheet::WriteExcel模块相同的接口来生成二进制XLS格式的Excel文件
Excel::Writer::XLSX 支持所有Spreadsheet::WriteExcel中的特性,并且某些情况下功能更强。请查看 "Compatibility with Spreadsheet::WriteExcel".获取更多细节。
XLSL格式相比XLS格式主要的优势是它允许在一个工作表中容纳更大数量的行和列。
QUICK START 快速入门
Excel::Writer::XLSX试图尽可能的提供Excel的功能接口。因此,有很多与接口有关的文档,第一眼很难看出哪些重要,哪些不重要。所以对于你们这些更喜欢先组装宜家设备,再读说明书的人,此处有三种简单的方式:
0、新建一个Excel对象
1、使用"new()"方法创建一个新的Excel 工作簿
2、使用"add_worksheet()"方法向新工作簿增加一个工作表
3、使用"write()"方法向工作表中写入数据
就象这样:
use Excel::Writer::XLSX; # Step 0
my $workbook = Excel::Writer::XLSX->new( \'perl.xlsx\' ); # Step 1
$worksheet = $workbook->add_worksheet(); # Step 2
$worksheet->write( \'A1\', \'Hi Excel!\' ); # Step 3
这会创建一个叫做perl.xlsx的Excel文件,里面只有一张工作表并在相关单元格里面有\'Hi Excel\'文本。
工作簿方法
Excel::Writer::XLSX模块为新建的Excel工作簿提供了面向对象的接口。下面的方法可以通过一个新建的工作簿对象访问.
new() #新建
add_worksheet() #添加工作表
add_format() #添加格式
add_chart() #添加图表
close() #关闭工作簿
set_properties() #设置属性
define_name() #定义名称
set_tempdir() #设置临时文件夹
set_custom_color() #设置自定义颜色
sheets() #工作表
set_1904() #设置纪元开始年
set_optimization() #设置优化
new()
使用"new()"构造方法创建一个新的Excel工作簿,该方法接受一个文件名或文件句柄作为参数。下面的例子根据一个文件名来创建一个新的Excel文件:
my $workbook = Excel::Writer::XLSX->new( \'filename.xlsx\' );
my $worksheet = $workbook->add_worksheet();
$worksheet->write( 0, 0, \'Hi Excel!\' );
下面是使用文件名作为new()方法参数的其他例子:
my $workbook1 = Excel::Writer::XLSX->new( $filename );
my $workbook2 = Excel::Writer::XLSX->new( \'/tmp/filename.xlsx\' );
my $workbook3 = Excel::Writer::XLSX->new( "c:\\tmp\\filename.xlsx" );#Windows
my $workbook4 = Excel::Writer::XLSX->new( \'c:\tmp\filename.xlsx\' );
最后两个例子说明了怎样通过转义目录分隔符"\"或使用单引号保证值不被内插来在DOS上或Windows上建立Excel文件。
我们推荐文件名使用".xlsx"而不是".xls"后缀,因为后者在使用XLSX格式的文件时会发生警告。
"new()"构造函数方法返回一个Excel::Writer::XLSX对象,你可以使用这个对象来添加工作表并存储数据。 应该注意的是,尽管没有特别要求使用"my",但是它定义了新工作簿变量的作用域,并且,在大多数情况下,它保证了工作簿不用显式地调用"close()方法"就能被正确地关闭。
如果文件不能被创建,由于文件权限或其他一些原因,"new"会返回"undef"。因此,在继续之前检查"new"的返回值是个好习惯。通常,如果存在文件创建错误,Perl变量$!就会被设置:
my $workbook = Excel::Writer::XLSX->new( \'protected.xlsx\' );
die "Problems creating new Excel file: $!" unless defined $workbook;
你也可以传递一个合法的文件句柄给"new()"构造函数。例如在一个CGI程序中你可以这样做:
binmode( STDOUT );
my $workbook = Excel::Writer::XLSX->new( \*STDOUT );
对于CGI程序,你也可以使用特别的Perl文件名 \'-\',它会把输出重定向到标准输出:
my $workbook = Excel::Writer::XLSX->new( \'-\' );
可以查看例子中的cgi.pl
然而,这种特殊的情况在"mod_perl"程序中不起作用,你必须做一些下面的事情:
# mod_perl 1
...
tie *XLS, \'Apache\';
binmode( XLSX );
my $workbook = Excel::Writer::XLSX->new( \*XLSX );
...
# mod_perl 2
...
tie *XLSX => $r; # Tie to the Apache::RequestRec object
binmode( *XLSX );
my $workbook = Excel::Writer::XLSX->new( \*XLSX );
...
请查看mod_perl1.pl" 和 "mod_perl2.pl"
如果你想通过socket 去 stream一个Excel文件或者你想把一个Excel文件存进一个标量,
那么文件句柄会很有用。
例如,下面是把Excel文件写入标量的一种方法:
#!/usr/bin/perl -w
use strict;
use Excel::Writer::XLSX;
open my $fh, \'>\', \my $str or die "Failed to open filehandle: $!";
my $workbook = Excel::Writer::XLSX->new( $fh );
my $worksheet = $workbook->add_worksheet();
$worksheet->write( 0, 0, \'Hi Excel!\' );
$workbook->close();
# Excel文件现在在$str中。记得在打印$str之前binmode()输出文件句柄
binmode STDOUT;
print $str;
请查看"write_to_scalar.pl" 和 "filehandle.pl"
注意binmode()的要求。一个Excel文件由二进制数据组成。因此,如果你使用一个文件句柄你应该保证在传递给"new()"方法之前将它binmode().不管你使用Windows或其他何种平台,你都应该这样做。
如果你使用文件名而非文件句柄,你不用担心"binmode()".当Excel::Writer::XLSX将文件名转换为文件句柄时,它会在内部执行binmode().
---------------------------------------------------------------------------------------------------------
add_worksheet( $sheetname ) #参数为工作表名
至少一个工作表应该被添加到工作簿中。工作表被用于将数据写入单元格:
$worksheet1 = $workbook->add_worksheet(); # Sheet1
$worksheet2 = $workbook->add_worksheet( \'Foglio2\' ); # Foglio2
$worksheet3 = $workbook->add_worksheet( \'Data\' ); # Data
$worksheet4 = $workbook->add_worksheet(); # Sheet4
如果没有指定$sheetname,默认会使用Sheet1,Sheet2....
工作表名必须是合法的Excel工作表名。它不能包含以下字符,"[ ] : * ? / \" ,并且长度必须小于32个字符。此外,你不能在一个以上的工作表中使用同一个文件名,或大小写敏感的文件名。
----------------------------------------------------------------------------------------------
add_format( %properties ) #添加格式
"add_format()"方法可以被用作创建新的格式对象,它可以被用于将格式应用到单元格中。你可以在创建时通过含有属性值的哈希定义属性或之后通过方法调用定义属性:
$format1 = $workbook->add_format( %props ); # 在创建时定义属性
$format2 = $workbook->add_format(); # 创建后再定义属性
请查看“单元格格式化”章节获取详细信息
---------------------------------------------------------------------------------------------------------
add_chart( %properties ) #添加图表
该方法用于新建一个图表作为一个独立的工作表(默认),或作为一个可嵌入的对象,通过"insert_chart()"工作表方法插入到工作表中。
my $chart = $workbook->add_chart( type => \'column\' );
属性可以设置为:
type (required)#必须的选项
subtype (optional)#图表子类型(可选)
name (optional)
embedded (optional)
* "type" 类型
这是必须的参数。它定义了将被创建的图表的类型。
my $chart = $workbook->add_chart( type => \'line\' );
可用的类型如下:
area #区域图
bar #条形图
column #柱形图
line #线图
pie #饼图
scatter #散点图
stock #存量图
* "subtype" #图表类型(子类型)
用于在需要时定义一个图表的子类型
my $chart = $workbook->add_chart( type => \'bar\', subtype => \'stacked\' );
目前只有条形图和柱形图支持子类型(stacked and percent_stacked)
* "name"
为图表设置名字。名字属性是可选的,如果它不被支持,它会默认为"Chart1,Chart2....Chartn".
图表名必须是合法的表名,与"add_worksheet()"规则一样。"name"属性可以在嵌套的图表中省略。
my $chart = $workbook->add_chart( type => \'line\', name => \'Results Chart\' );
* "embedded"
指定图表对象会通过"insert_chart()"工作表方法插入到工作表中。如果没有设置这个标志就尝试插入图表,会出现错误。
my $chart = $workbook->add_chart( type => \'line\', embedded => 1 );
# Configure the chart.
...
# 将图表插入到工作表中
$worksheet->insert_chart( \'E2\', $chart );
查看Excel::Writer::XLSX::Chart获取更详细的关于在创建后如何配置图表对象的信息。也可查看chart_*.pl程序。
close()
一般地,当你的程序结束或工作簿对象超出作用域时,你的Excel文件会被自动关闭。然而,你可以使用close()方法显式地关闭Excel文件。
$workbook->close();#显示地关闭Excel
如果Excel文件必须在对其执行一些外部动作诸如复制、读取大小或者把它作为电子邮件的附件之前关闭,需要显式地用close()声明
此外,"close()"被用于阻止Perl的垃圾回收器以错误的顺序处理工作簿、工作表和格式对象。这种情况出现在下面:
如果"my()"没有被用于声明使用"new()"创建的工作簿变量作用域
如果在子例程中调用"new()", "add_worksheet()" 或者 "add_format()"方法。
原因是Excel::Writer::XLSX依赖Perl的"DESTROY"机制依特定顺序触发destructor析构方法。当工作簿、工作表和格式变量不是词法作用域或它们拥有不同的词法作用域时,前面这种情况不会发生。
一般地,如果你创建一个0字节的文件或者你不能建立一个文件,你需要调用"close()"方法。
"close()"的返回值与perl关闭使用"new()"方法建立的文件的返回值一样。这允许你以常规方式处理错误
$workbook->close() or die "Error closing file: $!";
set_properties()
"set_properties" 方法可被用于设置通过"Excel::Writer::XLSX"模块创建的Excel文件的文档属性。
当你使用Excel中的"办公按钮" ->"准备"->"属性"选项时,可以看到这些属性。
属性值应该以哈希格式传递,如下:
$workbook->set_properties(
title => \'This is an example spreadsheet\',
author => \'John McNamara\',
comments => \'Created with Perl and Excel::Writer::XLSX\',
);
可以被设置的属性是:
title #标题
subject #主题
author #作者
manager #经理
company #公司
category #类别
keywords #关键字
comments #注释
status #状态
请查看"properties.pl" 程序。
define_name()
该方法被用于定义一个名字,它能被用于表示工作簿中的一个值,一个单独的单元格,或一定范围内的单元格
例如:设置一个 global/workbook 名:
# Global/workbook names.
$workbook->define_name( \'Exchange_rate\', \'=0.96\' );
$workbook->define_name( \'Sales\', \'=Sheet1!$G$1H$10\' );
也可以使用语法"sheetname!definedname"在名字之前加上表名来定义一个 local/worksheet:
# Local/worksheet name.
$workbook->define_name( \'Sheet2!Sales\', \'=Sheet2!$G$1G$10\' );
如果工作表名含有空格或特殊字符,你必须像在Excel中一样,用单引号将名字括起来:
$workbook->define_name( "\'New Data\'!Sales", \'=Sheet2!$G$1G$10\' );
查看 defined_name.pl 程序。
set_tempdir()
"Excel::Writer::XLSX"在组装成最后的工作簿之前,把数据存储在临时文件中
"File::Temp"模块用于创建这些临时文件。File::Temp模块使用"File::Spec"为这些临时文件指定一个合适的位置,例如"/tmp"或"c:\windows\temp".你可以按下面的方法找出你系统上哪个目录被使用了:
perl -MFile::Spec -le "print File::Spec->tmpdir()
如果默认的临时文件目录不能使用,你可以使用"set_tempdir()"方法指定一个可供选择的位置:
$workbook->set_tempdir( \'/tmp/writeexcel\' );
$workbook->set_tempdir( \'c:\windows\temp\writeexcel\' );
用于存放临时文件的目录必须先存在,“set_temp()”方法不会新建一个目录。
一个潜在问题是一些Windows系统将并发临时文件的数量限制为大约800个。这意味着,一个在该种系统上运行的单个程序将会被限制创建总共800个工作簿和工作表对象。如果必要,你可以运行多个非并发程序来避免这种情况。
set_custom_color( $index, $red, $green, $blue )
#设置自定义颜色值
"set_custom_color()"方法能用于使用更合适的颜色重载其中之一的内建颜色值。
$index的值应该在8..63之间,查看see "COLOURS IN EXCEL".
默认的命名颜色使用如下索引:
8 => black
9 => white
10 => red
11 => lime #绿黄色
12 => blue
13 => yellow
14 => magenta #洋红色
15 => cyan #蓝绿色
16 => brown
17 => green
18 => navy #淡蓝色
20 => purple #紫色
22 => silver #银色
23 => gray #灰色
33 => pink #粉红色
53 => orange
使用它的RGB(red green blue)成分设置新颜色。 $red,$green 和 $blue的值范围必须在0..255之间。
你可以在Excel中使用"工具"->选项->颜色->修改"对话框决定需要的颜色。
"set_custom_color()"工作簿方法可以使用HTML风格的十六进制值:
$workbook->set_custom_color( 40, 255, 102, 0 ); # Orange
$workbook->set_custom_color( 40, 0xFF, 0x66, 0x00 ); # Same thing
$workbook->set_custom_color( 40, \'#FF6600\' ); # Same thing
my $font = $workbook->add_format( color => 40 ); # Modified colour
"set_custom_color()"方法的返回值是被修改的颜色的索引:
my $ferrari = $workbook->set_custom_color( 40, 216, 12, 12 );
my $format = $workbook->add_format(
bg_color => $ferrari,
pattern => 1,
border => 1
);
注意,在XLSX格式中,颜色调色板不确切局限为53种纯色。Excel::Writer::XLSX模块会在以后的阶段扩展以支持新的,半无限的调色板。
sheets( 0, 1, ... )
"sheets()"方法返回一个工作簿中工作表的列表或者列表切片
如果没有传递参数给sheet()方法,则返回工作簿中的所有工作表。如果你想对一个工作表进行重复操作,这将很有用。
for $worksheet ( $workbook->sheets() ) {
print $worksheet->get_name();
}
你可以指定一个列表切片返回一个或多个工作表对象:
$worksheet = $workbook->sheets( 0 );
$worksheet->write( \'A1\', \'Hello\' );
或者因为"sheets()"的返回值是一个对工作表对象的引用,你可以将上面的例子写为:
$workbook->sheets( 0 )->write( \'A1\', \'Hello\' );
下面的例子返回一个工作簿中的第一个和最后一个工作表:
for $worksheet ( $workbook->sheets( 0, -1 ) ) {
# Do something
}
set_1904()
Excel将数据存储为实数,其整数部分存储自新纪元以来的天数,其小数部分存储一天的百分比。新纪元可以是1900或1904。Windows上的Excel使用1900,Mac上的Excel使用1904.然而,任何平台上的Excel都会在系统之间自动转换。
Excel::Writer::XLSX默认使用1900格式存储数据。如果你想改变它,你可以调用"set_1904()"工作簿方法。对于1900它返回0,对于1904它返回1.
set_optimization()
"set_optimization()" 方法用于打开Excel::Writer::XLSX模块中的优化方案。目前只有一条减少内存使用的优化方案。
$workbook->set_optimization();
注意,打开此优化方案后,当通过"write_*()"方法中的其中之一在新行中添加一个单元格后,一列数据被写入然后被删除。因为一旦优化开启后,这样的数据应该以连续的行顺序写入。?
该方法必须在任何调用"add_worksheet()"方法之前被调用。
WORKSHEET METHODS 工作表方法
通过调用工作簿对象中的"add_worksheet()"方法创建一个新的工作表:
$worksheet1 = $workbook->add_worksheet();
$worksheet2 = $workbook->add_worksheet();
下面的方法对于一个新的worksheet是可用的:
write()
write_number()
write_string()
write_rich_string()
keep_leading_zeros() #保留前导0
write_blank()
write_row()
write_col()
write_date_time()
write_url() #写入url
write_url_range()
write_formula()#写入公式
write_comment()#写入注释
show_comments()#显式注释
set_comments_author()
add_write_handler()
insert_image()#插入图像
insert_chart()#插入图表
data_validation()#数据检验
conditional_format()
get_name()
activate()#激活
select()
hide()
set_first_sheet()
protect()
set_selection()
set_row()
set_column()
outline_settings()
freeze_panes() #冻结窗格
split_panes() #分割窗格
merge_range() #合并值域
merge_range_type()
set_zoom()
right_to_left()
hide_zero() #隐藏0
set_tab_color() #设置标记颜色
autofilter() #自动筛选
filter_column()
filter_column_list()
Cell notation 单元格表示法(先列-后行)
Excel::Writer::XLSX支持两种形式的表示法来指定单元格的位置:行-列表示法和A1表示法。
Row-column notation uses a zero based index for both row and column
while A1 notation uses the standard Excel alphanumeric sequence of
column letter and 1-based row. 例如,:
行列表示法对行-列都使用以0为基础的索引
而A1表示法使用标准的Excel字母数字序列为列,以1为基础作为行。例如:
(0, 0) # 最左最顶部的单元格(使用行-列表示法)
(\'A1\') # The top left cell in A1 notation.
(1999, 29) # 行-列表示法.
(\'AD2000\') # 使用A1表示法的同一单元格
# 单元格列的范围在Excel2003中是A..IV
如果你提及单元格编程,行-列表示法很有用:
for my $i ( 0 .. 9 ) {
$worksheet->write( $i, 0, \'Hello\' ); # Cells A1 to A10
}
A1表示法对于手动设置工作表和使用公式工作很有帮助:
$worksheet->write( \'H1\', 200 );
$worksheet->write( \'H2\', \'=H1+1\' ); #使用公式
Ecxel形如:
ABCDEFGHIJKLMN
1
2
3
4
5
6
在公式和可用的方法中你也可以使用"A:A"的列表示法:
$worksheet->write( \'A1\', \'=SUM(B:B)\' );
包含在套件中的Excel::Writer::XLSL::Utility 模块含有A1表示法的帮助函数,例如:
use Excel::Writer::XLSX::Utility;
( $row, $col ) = xl_cell_to_rowcol( \'C2\' ); # (1, 2)
$str = xl_rowcol_to_cell( 1, 2 ); # C2
简单地,在下面给出的章节中工作表方法调用的参数列表依据行-列表示法,任何情况下,都可以使用A1表示法
注意:在Excel中也可以使用R1C1表示法。但Excel::Writer::XLSX不支持这。
write( $row, $column, $token, $format )
Excel的数据类型之间有区别,比如字符串,数字,空格,公式和超链接。为了简化写入数据的处理,write()方法为更多的特定方法指定一种普遍的别名:
write_string()
write_number()
write_blank()
write_formula()
write_url()
write_row()
write_col()
一般规则就是:如果数据看起来像什么那就写入什么。下面是用 行-列表示法和A1表示法写的例子:
# Same as:
$worksheet->write( 0, 0, \'Hello\' ); # write_string()
$worksheet->write( 1, 0, \'One\' ); # write_string()
$worksheet->write( 2, 0, 2 ); # write_number()
$worksheet->write( 3, 0, 3.00001 ); # write_number()
$worksheet->write( 4, 0, "" ); # write_blank()
$worksheet->write( 5, 0, \'\' ); # write_blank()
$worksheet->write( 6, 0, undef ); # write_blank()
$worksheet->write( 7, 0 ); # write_blank()
$worksheet->write( 8, 0, \'http://www.perl.com/\' ); # write_url()
$worksheet->write( \'A9\', \'ftp://ftp.cpan.org/\' ); # write_url()
$worksheet->write( \'A10\', \'internal:Sheet1!A1\' ); # write_url()
$worksheet->write( \'A11\', \'external:c:\foo.xlsx\' ); # write_url()
$worksheet->write( \'A12\', \'=A3 + 3*A4\' ); # write_formula()
$worksheet->write( \'A13\', \'=SIN(PI()/4)\' ); # write_formula()
$worksheet->write( \'A14\', \@array ); # write_row()
$worksheet->write( \'A15\', [\@array] ); # write_col()
#如果设置了保留前置0属性:
$worksheet->write( \'A16\', 2 ); # write_number()
$worksheet->write( \'A17\', 02 ); # write_string()
$worksheet->write( \'A18\', 00002 ); # write_string()
# Write an array formula. Not available in Spreadsheet::WriteExcel.
$worksheet->write( \'A19\', \'{=SUM(A1:B1*A2:B2)}\' ); # write_formula()
"看起来像"的规则由正则表达式定义:
"write_number()" 如果 $token 是一个基于如下正则的数字:
"$token =~ /^([+-]?)(?=\d|\.\d)\d*(\.\d*)?([Ee]([+-]?\d+))?$/".
"write_string()" 如果设置了"保留前导0"("keep_leading_zeros()"并且 $token 是一个基于如下正则的带有前导0的整数:"$token =~/^0\d+$/".
"write_blank()" 如果 $token 未定义或是一个空字符串: "undef", "" 或 \'\'.
"write_url()" 如果 $token 是一个基于如下正则的 http, https, ftp 或者 mailto URL
"$token =~ m|^[fh]tt?ps?://|" or "$token =~m|^mailto".
"write_url()" 如果 $token 是一个基于如下正则的内部的或外部的引用:
"$token =~ m[^(in|ex)ternal:]".
"write_formula()" 如果$token的第一个字符是"=".
"write_array_formula()" 如果 $token 匹配 "/^{=.*}$/".
"write_row()" 如果 $token 是一个数组引用.
"write_col()" 如果 $token 是数组引用中的数组引用。
"write_string()" 如果前面任一情况都不适用.
$format 参数是可选的。它应该是个合法的格式对象。查看 "CELL FORMATTING":
my $format = $workbook->add_format();
$format->set_bold();
$format->set_color( \'red\' );
$format->set_align( \'center\' );
$worksheet->write( 4, 0, \'Hello\', $format ); # Formatted string
write()方法会忽略空字符串或"undef",除非提供了格式。就这点而论,你不必担心对空值或未定义值的处理。查看"write_blank()" 方法。
"write()"方法的一个问题是,偶尔,数据看起来像一个数但是你不想把它看作一个数字。例如,邮政编码或ID号常以前导0开头。如果将该数据作为数字写入,则前导0会被删除。你可以使用"keep_leading_zeros()"方法改变该默认行为。当这个特性起作用时,任何带有前导0的整数会被当作字符串并且前导0被保留。查看"keep_leading_zeros()"章节获取该问题的详细信息。
你也可以使用"add_write_handler()"把你自己的数据处理器添加到"write()"方法。
"write()"方法也会处理UTF-8格式的Unicode字符串。
"write" 方法返回:
0 成功.
-1 参数个数不足
-2 行或列超限
-3 字符串过长
write_number( $row, $column, $number, $format )
向行和列指定($row and $column)的单元格中写入整数或浮点数。
$worksheet->write_number( 0, 0, 123456 );
$worksheet->write_number( \'A2\', 2.3451 );
$format 参数可选.
一般地,使用"write()"方法就足够了。
注意:有些版本的Excel2007不显示由Excel::Writer::XLSX写入的公式计算值。求助于Excel的所有可用服务包来修复该问题。
write_string( $row, $column, $string, $format )
向行和列指定的单元格中写入字符串:
$worksheet->write_string( 0, 0, \'Your text here\' );
$worksheet->write_string( \'A2\', \'or here\' );
最大的字符串长度为32767个字符。然而,Excel单元格中能显示的最大字段是1000个。所有的32767个字符可以显示在一个公式栏中。
$format参数是可选的.
"write()" 方法也会处理UTF-8格式的字符串。请查看"unicode_*.pl"程序
一般地,使用"write()" 方法就足够了。 然而,你有时候可能会使用"write_string()"方法去写入看起来像数字但你又不想把它看作数字的数据。例如,邮政编码或电话号码:
# 作为普通的字符串写入
$worksheet->write_string( \'A1\', \'01209\' );
然而,如果用户编辑该字符串,Excel可能会把字符串转换回数字。你可以使用Excel的文本格式"@"来避免它:
# 格式化为字符串.编辑时不转换为数字。
my $format1 = $workbook->add_format( num_format => \'@\' );
$worksheet->write_string( \'A2\', \'01209\', $format1 );
write_rich_string( $row, $column, $format, $string, ..., $cell_format )
"write_rich_string()"方法用于写入带有多种格式的字符串。例如,写入字符串"This is bold and this is italic" 你可以使用下面的方法:
my $bold = $workbook->add_format( bold => 1 );
my $italic = $workbook->add_format( italic => 1 );
$worksheet->write_rich_string( \'A1\',
\'This is \', $bold, \'bold\', \' and this is \', $italic, \'italic\' );
基本规则是把字符串分段并把$format格式对象放在你想格式化的片段之前。例如:
# 未格式化的字符串
\'This is an example string\'
# 分割
\'This is an \', \'example\', \' string\'
# 在你想格式化的片段前添加格式
\'This is an \', $format, \'example\', \' string\'
# In Excel::Writer::XLSX.
$worksheet->write_rich_string( \'A1\',
\'This is an \', $format, \'example\', \' string\' );
没有格式的字符串片段使用默认的格式。例如,当写入字符串"Some bold text"你会使用下面的第一个例子,但是它与第二个例子等价。
# 使用默认格式:
my $bold = $workbook->add_format( bold => 1 );
$worksheet->write_rich_string( \'A1\',
\'Some \', $bold, \'bold\', \' text\' );
# 或更明确地:
my $bold = $workbook->add_format( bold => 1 );
my $default = $workbook->add_format();
$worksheet->write_rich_string( \'A1\',
$default, \'Some \', $bold, \'bold\', $default, \' text\' );
对于Excel,只有格式的字体属性诸如字体名,风格,大小,下划线,颜色和效果被应用到字符串片段上。其他属性诸如边框,背景,对齐方式必须被应用于单元格。
"write_rich_string()"方法允许你把最后一个参数作为单元格格式使用(如果它是一个格式对象的话)来完成以上功能。下面的例子是使单元格中的rich string 居中对齐。
my $bold = $workbook->add_format( bold => 1 );
my $center = $workbook->add_format( align => \'center\' );
$worksheet->write_rich_string( \'A5\',
\'Some \', $bold, \'bold text\', \' centered\', $center );
查看"rich_strings.pl" 获取详细信息
my $bold = $workbook->add_format( bold => 1 );
my $italic = $workbook->add_format( italic => 1 );
my $red = $workbook->add_format( color => \'red\' );
my $blue = $workbook->add_format( color => \'blue\' );
my $center = $workbook->add_format( align => \'center\' );
my $super = $workbook->add_format( font_script => 1 );
# 使用多种格式写入一些字符串
$worksheet->write_rich_string( \'A1\',
\'This is \', $bold, \'bold\', \' and this is \', $italic, \'italic\' );
$worksheet->write_rich_string( \'A3\',
\'This is \', $red, \'red\', \' and this is \', $blue, \'blue\' );
$worksheet->write_rich_string( \'A5\',
\'Some \', $bold, \'bold text\', \' centered\', $center );
$worksheet->write_rich_string( \'A7\',
$italic, \'j = k\', $super, \'(n-1)\', $center );
正如 "write_sting()" 一样,它可写入的最大字符数是 32767个.
keep_leading_zeros()
当使用"write()"方法时, keep_leading_zeros()方法改变了带有前导0整数的默认处理方式。
"write()"方法使用正则表达式来决定写入什么样的数据到Excel工作表中。如果数据看起来像数字它就使用"write_number()"方法写入数字。该方法的一个问题是偶尔数据看起来像数字但你不想将它看作一个数字。
例如邮政编码和ID号,常以前导0开头。如果你把这样的数据当作数字写入,则前导0被删除。当你手动在Excel中输入数据时,这也是默认行为。
为了避免此问题,你可以使用三选项之一。写入一个格式化后的数字、将数字当作字符串写入或使用"keep_leading_zeros()"方法来改变"write()"方法的默认行为:
# 隐式地写入一个数字,前导0被删除: 1209
$worksheet->write( \'A1\', \'01209\' );
#使用格式写入以0填充的数字: 01209
my $format1 = $workbook->add_format( num_format => \'00000\' );
$worksheet->write( \'A2\', \'01209\', $format1 );
# 显式地当作字符串写入: 01209
$worksheet->write_string( \'A3\', \'01209\' );
# 隐式地当作字符串写入: 01209
$worksheet->keep_leading_zeros();
$worksheet->write( \'A4\', \'01209\' );
上面的代码会生成一个如下所示的工作表:
-----------------------------------------------------------
| | A | B | C | D | ...
-----------------------------------------------------------
| 1 | 1209 | | | | ...
| 2 | 01209 | | | | ...
| 3 | 01209 | | | | ...
| 4 | 01209 | | | | ...
例子里单元格在不同的边上是因为Excel默认以左对齐方式显式字符串,以右对齐方式显式数字。
应该注意的是如果用户编辑例子中的"A3"和"A4"数据,字符串会恢复为数字。这还是Excel的默认行为。使用文本格式"@"可以避免该行为:
# Format as a string (01209)
my $format2 = $workbook->add_format( num_format => \'@\' );
$worksheet->write_string( \'A5\', \'01209\', $format2 );
"keep_leading_zeros()"特性默认是关闭的,它以0或1为参数。如果没有给它指定参数,默认为1:
$worksheet->keep_leading_zeros( ) # Set on
$worksheet->keep_leading_zeros( 1 ); # Set on
$worksheet->keep_leading_zeros( 0 ); # Set off
from:https://blog.csdn.net/herokoking/article/details/67023789
请发表评论