如何使用Perl和Excel OLE将工作表复制到新工作簿或现有工作簿?

如何使用Perl和Excel OLE将工作表复制到新工作簿或现有工作簿?,perl,excel,Perl,Excel,我尝试过使用以下Perl代码,但工作表不会复制(或移动),也不会返回错误消息。提前感谢你的想法 #!/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 =

我尝试过使用以下Perl代码,但工作表不会复制(或移动),也不会返回错误消息。提前感谢你的想法

#!/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();

如果需要因Excel中的错误而死亡,则需要将相关标志设置为3(适用于Office 2000):

不过,一个更基本的问题可能与您的Office版本有关。自(我相信)Office2007以来,底层的OLE体系结构已被彻底检修。不久前,当我与Office2007一起开发的脚本拒绝与Office2000一起运行时,我遇到了这个问题

我建议的最佳操作方法是在VBA模式下通过按F2键使用Excel的OLE浏览器(相当混乱)


Perl+OLE+Excel的“Hello,World”(与Excel 2000配合使用):


我在这里找到了一种解决方法,可以在较大的单元格范围内使用复制/粘贴。这种方法可以通过编程识别活动单元格范围而不是硬编码来改进,这也可能导致在不同版本的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();

我发现很难相信这段代码不会抛出错误或警告;
createobjectole“Excel.Application”语法写得很麻烦。这很有帮助。在将其添加到上面的代码中之后,脚本现在会在Move命令中抛出一个错误,但不幸的是,返回代码(0)没有提供太多的细节。如果如您所建议的,我改为使用$Excel=Win32::OLE->GetActiveObject('Excel.Application')或Win32::OLE->new('Excel.Application','Quit');在原始脚本中,我现在可以在my$Book2=$Excel->Workbooks->Add()行上捕获一个错误(无法在未经许可的引用上调用方法“Workbooks”)。正在此处进行。如果我将“或”改为| |,未经lessed的ref错误将消失,现在我得到了更有意义的结果:2010年9月2日星期四14:32:33-来自“Microsoft Office Excel”的OLE异常:无法获取工作表类Win32::OLE(0.1709)的Copy属性方法/属性设置“Copy”中的错误0x800a03ec仍然不确定如何解决此问题,但是我认为在Perl中使用OLE复制工作表是不可能的。顺便说一句,我正在使用Excel2007。@user338714:我很有信心Perl可以复制。。。我在这里遗漏了什么,因为我看不出你原来帖子中的哪一行会导致这个错误。对不起,我相信我已经更改了$Sheet3->Move(“Before”=>$Book2->Worksheets(1));到$Sheet3->复制(“在”=>$Book2->工作表(1)之前);当我进行测试时。如果使用原始的Move命令,我会收到错误消息:“Microsoft Office Excel”中的OLE异常:无法获取工作表类Win32::OLE(0.1709)的Move属性错误0x800a03ec,在C:\Temp\test.pl第14行的方法/PROPERTYGET“Move”中。
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";
#!/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();