我是個好奇的人,對於比較陌生的東西也喜歡去嘗試下。有一次看GF在對財務報表,這些報表數據全在Excel裏面,數據量還比較多,但是並不複雜。只是對比下兩個報表的數據項是否一致。這個工作難道還要人來做嗎?難道不可以用Perl來實現嗎,我想到了Perl語言的名稱定義:實用報表提取語言。真是恰到好處。
但說實在,本人水平還沒有達到這種解決實際問題的地步,但是安裝下,還是不成問題的。至少我想看下ActivePerl 是如何讀寫Excel文件的。看看它使用什麼模塊,再看看這個模塊文檔,似乎就可以解決實際問題了。
在Windows上安裝ActivePerl所需要的讀取Excel文件一般用Win32::OLE之類的,但對於跨平臺來說,還是選擇另外的Spreadsheet::ParseExcel及Spreadsheet::WriteExcel最好。從名字來看,前者是讀Excel文件用的。
安裝:
- ppm install OLE::Storage_Lite #如果不安裝這個,後面兩個安裝不了
- ppm install Spreadsheet::ParseExcel
- ppm install Spreadsheet::WriteExcel
這時在你的./site/lib/目錄下,多了一些模塊。
爲了滿足自己的好奇心,趕緊查看了pod文檔:
- perldoc Spreadsheet::ParseExcel
通過文檔的描述部分,瞭解到Spreadsheet::ParseExcel只能讀95-2003格式的Excel文檔,對於office 2007 Excel則要安裝Spreadsheet::XLSX。運行下文檔中的示例,先睹爲快:
- use strict;
- use Spreadsheet::ParseExcel;
- my $parser = Spreadsheet::ParseExcel->new();
- my $workbook = $parser->parse('Book1.xls');
- if ( !defined $workbook ) {
- die $parser->error(), ".\n";
- }
- for my $worksheet ( $workbook->worksheets() ) {
- my ( $row_min, $row_max ) = $worksheet->row_range();
- my ( $col_min, $col_max ) = $worksheet->col_range();
- for my $row ( $row_min .. $row_max ) {
- for my $col ( $col_min .. $col_max ) {
- my $cell = $worksheet->get_cell( $row, $col );
- next unless $cell;
- print "Row, Col = ($row, $col)\n";
- print "Value = ", $cell->value(), "\n";
- print "\n";
- }
- }
- }
如果只是簡單的讀取數據,相對比較的簡單,但是如果要格式化表裏面的數據,那真不是幾分鐘能搞定的事。想想GF那些財務數據還真是有點難度的。留着以後研究吧。畢竟現在只是好奇而已。