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

ответ

1

Я нашел обходной путь здесь с помощью Copy/Paste на большой диапазон ячеек. Этот подход, вероятно, может быть уточнен путем программной идентификации диапазона активных ячеек вместо жесткого кодирования, что также может привести к некоторым проблемам при переходе между различными версиями 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 

Более фундаментальный вопрос, возможно, придется делать с вашим Офисная версия. Основополагающая архитектура OLE была пересмотрена с тех пор, как я полагаю, Office 2007. Я столкнулся с этим вопросом некоторое время назад, когда сценарий, который я разработал в тандеме с Office 2007, отказался работать в Office 2000.

Лучший способ работы, который я могу предложить заключается в работе с браузером OLE Excel (довольно запутанным), нажав клавишу F2, когда находится в режиме VBA.


'Hello, World' из 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

+0

Если, как вы полагаете, я вместо этого использую мой $ Excel = Win32 :: OLE-> GetActiveObject ('Excel.Application') или Win32 :: OLE-> new ('Excel.Application', 'Quit'); в исходном скрипте я могу теперь поймать ошибку (не могу вызвать метод «Рабочие книги» по беспредметной ссылке) в моей книге $ Book2 = $ Excel-> Workbooks-> Add(). – user338714

+0

Прогресс здесь. Если я изменил «или» на «||», ошибка без исправления ошибки исчезнет, ​​и теперь я получу что-то более значимое: Чт 2 сентября 14:32:33 2010 - исключение OLE из «Microsoft Office Excel»: Невозможно получить свойство Копия рабочего листа класса Win32 :: OLE (0,1709) ошибки 0x800a03ec в МЕТОД/PROPERTYGET «Копировать» до сих пор не знаю, как решить эту проблему, но я имею в виду, что копирование рабочего листа не может быть возможно в Perl используя OLE. Я использую Excel 2007, кстати. – user338714

Смежные вопросы