2010-09-02 13 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

相关问题