2009年1月5日

用Perl讀寫Excel文件(1)

基本上是參考IBM網站上的說明文件
不過這篇有種濃厚的機器翻譯感, 稍微擷取一下需要的部分來談談吧!
Windows下通常我們會使用Win32::OLE裡的方法來處理,

use Win32::OLE::Const 'Microsoft Excel';
my $Excel = Win32::OLE->GetActiveObject('Excel.Application')
|| Win32::OLE->new('Excel.Application', 'Quit');

上面為設定參數, 嘗試尋找已存在的Excel, 否則開啟一個新的Excel Instance.

# open Excel file
my $Book = $Excel->Workbooks->Open("c:/komodo projects/test.xls");

開啟一個指定路徑下的Excel檔案, 回傳一個Win32::OLE->Excel->Workbooks的物件; 有了這個handle就可以使用Excel檔案了.

my $Sheet = $Book->Worksheets(1);

指定調用第幾個工作表. 上面指定了第一個. 可以利用worksheet的名字來調用.

$data= $Sheet->Cells($row,$col)->{'Value'};

$data將得到(row,col)的值. 事實上, 相反的也可以這樣修改(row,col)的內容.
調用Formula則是把Value改為Formula即可. ex: $Sheet->Cells($row,$col)->{'Formula'} ;row,col也可以用Range("[alphabet][number]")的方式直接取值.

不過實際上我是看到另外一個作法, 所以才看到這篇文章的. 據該文表示, 這可能不適用於Windows系統. 不過對於一篇2001年的文章, 有足夠理由相信作者已經作了許多改變. 這個perl module的名字叫做 Spreadsheet::WriteExcel 和 Spreadsheet::ParseExcel. 光聽名字就感覺很強大....錯覺?

如果需要cpan上的manual與若干code請點這個連結

正體中文愛好者可以看這篇, 簡介了最基礎的調用方法. 引用裡面的code:

use Spreadsheet::WriteExcel;
my $workbook = Spreadsheet::WriteExcel->new("-");
my $worksheet = $workbook->add_worksheet("MySheet");

建Wworkbooks, worksheet的方法.

$worksheet->write(5, 0, "Division Number:", $bold);
$worksheet->write(5, 1, $division_number);

填值的方法, 大同小異.

字體格式可以另外加上, 例如:

my $bold = $workbook->add_format();
$bold->set_bold();


基本上還有許多參數可以下, 以及許多函式可調用. 可以參照上面的cpan連結.

2008年12月30日

Intel的Virtualization Technology

參考這篇Intel網站上的介紹

Virtualization Technology的技術主要是要解決在同一台電腦上面share給許多不同的使用者時, 同時存在著各自獨立的OS時運作上的問題. 而這主要提供給有虛擬系統需求的使用者. 舉個例子, 當你有以前的win95 or 98的程式要執行, 在現在的XP上往往是不相容. 這個時候就需要有虛擬OS來運作他. Virtual OS就是提供一個環境, 讓這些舊版程式以為他在原本的OS上面跑. 當然這種方式有許多的限制. 就速度來說一定會打折扣(不過電腦速度可是今非昔比), 因為程式經過多層的function call. 就新聞稿上看來, Intel宣稱VT技術可以讓虛擬的系統跑得像真的一樣(科).

其實是要解決最近遇到的問題, 如何在VMWare上面執行64-bit的OS?
更精確一點的說, 如果我電腦灌32-bit的XP, 有沒有辦法在上面跑64-bit的VMWare(虛擬OS的產品)?
一般來說產品是向下相容容易, 向上相容難; 但就實際測試的結果而言, VT可以克服這個問題. 首先CPU要有支援VT, 可以下載Intel 處理器辨識公用程式 看看你的處理器支不支援. 再者要看看VMWare的版本, 一般來說最新版的應該都有支援 (6.5以上?).

很久沒貼文, 順便貼歌..

山崎まさよし很酷的翻唱歌 "M", 之前有在Plurk上貼過~

2008年12月4日

find the colors of your rainbow

Your rainbow is shaded violet.

 
 
 
 
 
 
 

What is says about you: You are a creative person. You appreciate beauty and craftsmanship. You are patient and will keep trying to understand something until you've mastered it.

Find the colors of your rainbow at spacefem.com.

心理測試之類的東西...可以玩玩

2008年12月3日

Perl的XML Parser XML::Simple (2)

來寫XML::Simple 裡面 XMLout跟一些Option的設定. 最後面附的example寫的到的話再說...
照樣附上原文 <--直接reference到XMLout
假設已經有一個data structure的hashref了, XMLout可以將它寫出成XML格式.
寫出的時候有一些事情必須注意; 1. Hash Key會被encode成element name or Attribute name.
2. 這些name必須由字母開頭. 剩下的必須為字母, 數字, -, 底線, '.', 或者分號(這個只能出現一次, 而且必須被用於namespaces). hash value部分就可以隨便用符號, 除了binary data以外.
如果違反這些規則, XMLout還是可以寫出, 只是不能再被讀取而已.
另外資料還是不要有產生迴圈的關係, 會讓他掛掉.

Options:
每一版他都會release一些新的option, 所以其實這個XML::Simple已經變得不是很簡單了:) 作者建議兩個Option一定要看一下: ForceArray, KeyAttr

挑一些簡單, 作者建議的Option來看:
AttrIndent=>1: 輸出的時候請斷行.
ForceArray=>: 設成1的時候將會將巢狀結構的第二層開始都強制存成array, 不管他是不是只有一項. 若把KeyAttr打開的時候, 將會偷偷把ForceArray設為1.
或者可以給一個hashname, 這樣遇到該hashname的時候會自動強制存成array. 2.05版開始可以用regular expression.
KeepRoot=>1: 有時候讀入或讀出會遺失root, 這個option設為1會避免這個狀況.
KeyAttr=>[list]: 還滿難講的....附上原文的例子比較清楚.
NoAttr=>1: 把所有Attribute去掉.
OutputFile=>: 可以指定output file.

Optional OO Interface; 就是專門給OO使用的.
要先有一個new出來的XML::Simple的instance.
parse_string(text)
parse_file(filename)
parse_fh(file_handle)

看完了, 其實很多option都是幫忙整理XML讀進來的format, 讓找值的時候code不會太難看....
似乎有進階用法, 之後再看看好了.

Perl的XML Parser XML::Simple (1)

工作上會用到有關XML的東西, 講到資料處理當然是Perl啦, 馬上來survey一下.

cpan提供了一些好用的module, XML::Simple基本上灌完ActivePerl就有內建. 此Module的作者首頁
下面大量翻譯網頁裡的東西, 有興趣可以看看原文.
XML::Simple是一個Perl Module, 主要為了提供一個容易讀寫XML文件的界面. 本來作者是想做一個讀寫XML格式的config檔案. 不過很多人拿去做其他用途(kerker.

Installation:
上面提到很多安裝的方法, 包括用cpan提供的shell啊, 安裝檔啊..不過作者說只要把Simple.pm解壓縮出來放到perl/lib/XML/底下就可以了:)

用法: (原文)

主要使用的function: XMLin; XMLout

一般 format:
use XML::Simple;

my $ref = XMLin([] [, ]);

my $xml = XMLout($hashref [, ]);
用物件導向讓你看不懂的話:
require XML::Simple;

my $xs = XML::Simple->new(options);

my $ref = $xs->XMLin([] [, ]);

my $xml = $xs->XMLout($hashref [, ]);
如果要得到error message, 只要作一些修改
use XML::Simple qw(:strict);

一個簡單的範例:
file name :foo.xml
XML包法:

裡面項目可大量.

perl 程式裡:
use XML::Simple;

my $config = XMLin();

這會產生一個名叫$config的hashref, 因為他沒有設定初值, $config會預設對應到該Script的name跟location.

接下來要將資料吃進來, 使用Data::Dumper把資料弄進去:
use Data::Dumper;

print Dumper($config);
印出來會有如下效果:
{
'logdir' => '/var/log/foo/',
'debugfile' => '/tmp/foo.debug',
'server' => {
'sahara' => {
'osversion' => '2.6',
'osname' => 'solaris',
'address' => [ '10.0.0.101', '10.0.1.101' ]
},
'gobi' => {
'osversion' => '6.5',
'osname' => 'irix',
'address' => '10.0.0.102'
},
'kalahari' => {
'osversion' => '2.0.34',
'osname' => 'linux',
'address' => [ '10.0.0.103', '10.0.1.103' ]
}
}
}
這是hashref裡面包的內容, 記得他是一個物件.
那要怎麼拿裡面的元素呢? 假設我要拿log directory的name
print $config->{logdir};
如果要拿特定的元素, 例如 kalahari Server的第二個Address
print $config->{server}->{kalahari}->{address}->[1];

但程式不會只寫的這麼簡單. 下回待續?