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

我已经尝试使用下面的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):

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

尽pipe你的Office版本可能有一个更基本的问题。 底层的OLE体系结构已经被我们(我相信)Office 2007彻底改变了。当我与Office 2007共同开发的脚本拒绝与Office 2000一起运行时,我遇到了这个问题。

我可以build议的最佳做法是在VBA模式下,通过按F2键来使用Excel(相当混乱)的OLE浏览器。


Perl + OLE + Excel的“Hello,World” (适用于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"; 

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