- 论坛徽章:
- 3
|
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
|
|