Как использовать Perl и Excel OLE для копирования листа в новую или существующую книгу? - PullRequest
2 голосов
/ 02 сентября 2010

Я попытался использовать следующий код 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();

Ответы [ 2 ]

1 голос
/ 03 сентября 2010

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

Если вам нужно умереть от ошибок в Excel, вам нужно установить соответствующий флаг на 3 (работает с Office 2000):

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

Более фундаментальная проблема может иметь отношение к вашей версии Office, хотя. Базовая архитектура 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";
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...