Hsin 發問時間: 電腦與網際網路程式設計 · 1 0 年前

程式碼哪裡有錯誤呢?

1.若我需要從一個excel檔中的每個sheet裡,search出某各字,

應該也可以,讓使用者自行輸入sheet名稱和字,對嗎?

print "Please enter sheet name:";

$sheet=<STDIN>;

$worksheet = $workbook->Worksheets("$sheet");

這樣寫錯在哪呢?

2.在一個sheet裡有很多的cell,若我需要search的範圍是整個sheet,

那我該如何設定範圍,並且拿它和使用者欲search的字做比較呢?

$cellA1 = $worksheet->Range('該如何設')->{'Value'};

if($cellA1 =~ "10")

{

print "$cellA1";

}

這麼寫一定是錯誤的,那可以用for(each)或while去設定範圍嗎?

已更新項目:

$worksheet = $workbook->Worksheets("Sheet1");

我把這段程式碼改成

print "Please enter sheet name:";

$sheet=<STDIN>;

$worksheet = $workbook->Worksheets($sheet);

程式就無法順利執行,這是為什麼呢?

2 個已更新項目:

另外再請問一下,像這類excel的應用,有什麼書可以參考嗎?

3 個已更新項目:

$xlfile ='C:\test.xls'; #一定要絕對路徑

那就不能使用

print "Please enter file name:";

$xlfile=<STDIN>;

chomp($xlfile);

$workbook = $xl_app->Workbooks->Open($xlfile) or die "Open $xlfile fail" . $!;

這種方法是嗎?

4 個已更新項目:
5 個已更新項目:

真抱歉,因為以為是這些語法和perl的oop有關,所以想說了解一下

。是否會誤解也有同樣問題的人阿?

1 個解答

評分
  • 匿名使用者
    1 0 年前
    最佳解答

    因為你只有貼部份的程式碼上來,

    所以不是很清楚原因。

    1、有可能根本沒有成功開啟 Excel 檔案。

    2、$worksheet->Cells 可以得到整個工作表的儲存格。

    附上簡單程式碼,use OLE;

    $xlfile ='C:\test.xls'; #一定要絕對路徑

    ##### OLE - Excel Connection

    # Create OLE object - Excel Application Pointer

    $xl_app = CreateObject OLE 'Excel.Application' or die $!;

    # Set Application Visibility

    # 0 = Not Visible

    # 1 = Visible

    $xl_app->{'Visible'} = 0;

    # Open Excel File

    $workbook = $xl_app->Workbooks->Open($xlfile) or die "Open $xlfile fail" . $!;

    # setup active worksheet

    $worksheet = $workbook->Worksheets("Sheet1");

    if($worksheet){

    eval{

    $search = 'findSomething';

    $cells = $worksheet->Cells;

    $cell = $cells->Find($search);

    if($cell){

    $firstFoundAddr = $cell->Address;

    do{

    printf "Found $search in %s=%s\n", $cell->Address, $cell->Value;

    $cell = $cells->FindNext($cell);

    }while($cell && $cell->Address ne $firstFoundAddr);

    }

    };

    print $@ if $@;

    }

    # Close It Up

    $xl_app->ActiveWorkbook->Close(0);

    $xl_app->Quit();

    2007-04-11 11:02:22 補充:

    print "Please enter sheet name:";

    $sheet=<STDIN>;

    chomp($sheet); #要去掉換行字元

    $worksheet = $workbook->Worksheets($sheet);

    2007-04-11 20:44:59 補充:

    換個方式就可以用了。

    加到最前面,即可。

    use Cwd 'abs_path';

    print "Please enter Excel file name:";

    $xlfile = <STDIN>;

    $xlfile =~ s/^\s+|\s+$//;

    $xlfile = abs_path($xlfile);

    die "$xlfile does not exist!" unless -e $xlfile;

    2007-04-11 20:56:14 補充:

    強制轉成絕對路徑就 OK 了。

    另外其實參表資料就已經在你的電腦之中了,

    我的 Excel 版本是 Excel 2002,

    參考的 chm 檔是 "C:\Program Files\Microsoft Office\Office10\1028\VBAXL10.CHM"

    其他的版本應該不難找到。

    不過這個 chm 檔是為 Visual Basic for Application 寫的,

    不是很適用 Perl 就是了。

    2007-04-12 16:23:34 補充:

    不瞭解為何你最後貼上一個 perl oop 的網址?

    有什麼用途嗎?

    2007-04-14 10:10:31 補充:

    我想 perl oop 當然是使用 perl 進階 module 的基礎,

    不是三言兩語可以說完的,

    而且在不瞭解 perl oop 的情況下,

    造著別人的 code 改一改就可以使用了,

    我想大部份的人都是邊學邊用。

    2007-04-14 10:10:37 補充:

    我覺得 OLE module 的說明,

    可能會對你比較有幫助。

    http://search.cpan.org/~jdb/libwin32-0.26/OLE/lib/...

    http://search.cpan.org/~jdb/libwin32-0.26/OLE/lib/...

    http://search.cpan.org/~jdb/libwin32-0.26/OLE/lib/...

還有問題?馬上發問,尋求解答。