详细版:https://www.jianshu.com/p/84bda53827c8正则表达式
第一种方法:编程
读写excel2007文档的perl模块:windows
Spreadsheet::XLSX(读)和Spreadsheet::WriteExcel(写)数组
1、首先安装包并发
这两个依赖包安装完毕以后,就用到主要的包:Spreadsheet::XLSXless
解析的时候,一样遇到中文的问题。这时须要用use Encode 实现从 utf8 -> gbk(gb2312) 的转换。socket
第二种方法:ide
2、用法(翻译官方文档)函数
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对象
一、使用"new()"方法建立一个新的Excel 工做簿
二、使用"add_worksheet()"方法向新工做簿增长一个工做表
三、使用"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