詳細版: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