2010-09-02 28 views
2

我已經嘗試使用下面的Perl代碼,但工作表不會複製(也不會移動),也不會返回錯誤消息。預先感謝您的想法。如何使用Perl和Excel OLE將工作表複製到新的或現有的工作簿?

#!/usr/bin/perl -w 
use strict; 
use warnings; 
use OLE; 
use Win32::OLE::Const 'Microsoft Excel'; 

my $Excel = CreateObject OLE "Excel.Application"; 
my $Book2 = $Excel->Workbooks->Add(); 
my $Book3 = $Excel->Workbooks->Open("C:\\temp\\test.xlsm"); 
my $Sheet3 = $Book3->Worksheets(1); 
$Sheet3->Select; 
$Sheet3->Move("Before" => $Book2->Worksheets(1)); 
$Book3->Close(0); 
$Book2->SaveAs({Filename =>"C:\\temp\\new.xlsm",FileFormat => xlOpenXMLWorkbookMacroEnabled}); 
$Book2->Close(); 
$Excel -> Quit(); 
+1

我覺得很難相信這段代碼不會引發任何錯誤或警告; 'CreateObject OLE「Excel.Application」''語法遇到了麻煩。 – Zaid 2010-09-02 19:02:07

回答

1

我找到了一個解決方法這裏使用複製/粘貼在一個大的單元格區域。這種方法可能通過編程識別活動單元格範圍而不是硬編碼來改進,這也可能導致在不同版本的Excel之間出現問題。

#!/usr/bin/perl -w 
use strict; 
use warnings; 
use Win32::OLE qw/in with/; 
use Win32::OLE::Const 'Microsoft Excel'; 
$Win32::OLE::Warn = 3; # Die on errors in Excel 

my $Excel = Win32::OLE->GetActiveObject('Excel.Application') 
    || Win32::OLE->new('Excel.Application', 'Quit'); 
$Excel -> {"Visible"} = 0; 
$Excel -> {"DisplayAlerts"} = 0; 
my $Book2 = $Excel->Workbooks->Add(); 
my $Book3 = $Excel->Workbooks->Open("C:\\temp\\test.xlsm"); 
$Book3->Worksheets(1)->Range("A:AM")->Copy; 
$Book2->Worksheets(1)->Range("A:AM")->PasteSpecial; 
$Book3->Close(0); 
$Book2->SaveAs({Filename =>"C:\\temp\\new.xlsm",FileFormat => xlOpenXMLWorkbookMacroEnabled}); 
$Book2->Close(); 
$Excel->Quit(); 
1

如果您需要在Excel中的錯誤死了,你需要將相關標誌設置爲3(與Office 2000工程):

$Win32::OLE::Warn = 3; # Die on errors in Excel 

一個更根本的問題可能與做你的Office版本。底層的OLE體系結構自我(相信)Office 2007以來一直在進行徹底改革。當我與Office 2007一起開發的腳本拒絕與Office 2000一起運行時,我遇到了此問題。

我可以建議的最佳做法在VBA模式下使用Excel的(相當混亂的)OLE瀏覽器,通過點擊鍵來操作。


'你好,世界' 的Perl + OLE + Excel中(用Excel 2000工作):

use strict; 
use warnings; 
use Win32::OLE qw/in with/; 
use Win32::OLE::Const 'Microsoft Excel'; 
$Win32::OLE::Warn = 3; # Die on errors in Excel 

my $excel = Win32::OLE->GetActiveObject('Excel.Application') 
    || Win32::OLE->new('Excel.Application', 'Quit'); 
my $workbook = $excel->Workbooks->Add || warn "Couldn't add a workbook"; 
my $sheet = $excel->Worksheets->Add || warn "Couldn't add a worksheet"; 
$sheet->{Name} = "Hello World"; 
+0

這非常有幫助。將它添加到上面的代碼後,該腳本現在會使用Move命令拋出一個錯誤,但不幸的是,返回碼(0)不能提供很多信息。 – user338714 2010-09-02 19:15:45

+0

如果您建議使用我的$ Excel = Win32 :: OLE-> GetActiveObject('Excel.Application')或Win32 :: OLE-> new('Excel.Application','Quit');在原始腳本中,我現在可以在my $ Book2 = $ Excel-> Workbooks-> Add()行中捕獲錯誤(無法在未引用的引用上調用方法「Workbooks」)。 – user338714 2010-09-02 19:28:15

+0

在這裏取得進展。如果我將「或」更改爲||,那麼錯誤的引用錯誤消失,現在我得到更有意義的內容: Thu Sep 2 14:32:33 2010 - OLE來自「Microsoft Office Excel」的異常: 無法獲取工作表類的複製屬性 方法/ PROPERTYGET中的Win32 :: OLE(0.1709)錯誤0x800a03ec 「複製」 仍然不確定如何解決此問題,使用OLE。我用Excel 2007,順便說一句。 – user338714 2010-09-02 19:35:09

相關問題