【问题标题】:How do I use Perl and Excel OLE to copy a worksheet to a new or existing workbook?如何使用 Perl 和 Excel OLE 将工作表复制到新的或现有的工作簿?
【发布时间】:2013-07-24 18:01:47
【问题描述】:

我已尝试使用以下 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();

【问题讨论】:

  • 我很难相信这段代码不会引发错误或警告; CreateObject OLE "Excel.Application"; 语法有问题。

标签: perl excel


【解决方案1】:

如果您需要在 Excel 中出现错误,则需要将相关标志设置为 3(适用于 Office 2000):

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

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

我可以建议的最佳操作方式是在 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";

【讨论】:

  • 这很有帮助。将其添加到上面的代码后,脚本现在会使用 Move 命令引发错误,但不幸的是,返回代码 (0) 并不能提供太多信息。
  • 如果按照您的建议,我改用我的 $Excel = Win32::OLE->GetActiveObject('Excel.Application') 或 Win32::OLE->new('Excel.Application', '退出');在原始脚本中,我现在可以在我的 $Book2 = $Excel->Workbooks->Add() 行上捕获一个错误(Can't call method "Workbooks on unblessed reference)。
  • 在这里取得进展。如果我将“或”更改为 ||,unblessed ref 错误就会消失,我现在会得到更有意义的东西:Thu Sep 2 14:32:33 2010 - “Microsoft Office Excel”的 OLE 异常:无法获取的 Copy 属性工作表类 Win32::OLE(0.1709) 错误 0x800a03ec in METHOD/PROPERTYGET "Copy" 仍然不确定如何解决这个问题,但我认为在使用 OLE 的 Perl 中可能无法复制工作表。顺便说一句,我正在使用 Excel 2007。
  • @user338714 :我非常有信心 Perl 可以复制...我在这里遗漏了什么是因为我看不到您原始帖子中的哪一行会导致该错误。
  • 对不起,我相信我已经改变了 $Sheet3->Move("Before" => $Book2->Worksheets(1));到 $Sheet3->Copy("之前" => $Book2->Worksheets(1));当我进行该测试时。如果我使用原始的移动命令,我会收到错误消息:“Microsoft Office Excel”中的 OLE 异常:无法在 METHOD/PROPERTYGET“移动”中获取工作表类 Win32::OLE(0.1709) 错误 0x800a03ec 的移动属性C:\Temp\test.pl 第 14 行。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-09-18
    • 1970-01-01
    • 2013-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多