如何在Win32 :: OLE中的工作目录中保存Excel文件

时间:2016-02-19 09:33:13

标签: excel perl win32ole

我正在尝试解析perl中的Excel文件。从中提取所需信息后,我关闭Excel文件。最后,我试图在同一目录中保存一个具有不同名称的新Excel文件。但是这个Excel存储在“我的文档”文件夹中。

use Storable ;
use Cwd;

use Win32::OLE ;
use Win32::OLE qw(in with) ;
use Win32::OLE in ;
use Win32::OLE::Const 'Microsoft Excel';

use Excel::Writer::XLSX;

my $Excel = Win32::OLE->new("Excel.Application");
my $excel = $Excel->Workbooks->Add();

my $sheet = $excel->Worksheets(1);
$sheet->Activate();

my $new_file = "Temp_file.xlsm";
my $new_excel = cwd.'\\'.$new_file;
$new_excel =~ s/\//\\/g;

$excel->SaveAs($new_excel);

$Excel->{DisplayAlerts} = 0;
$excel->{Saved} = 1;
$excel->Close;

1 个答案:

答案 0 :(得分:1)

以下是基于您的代码的更新。首先,您要忽略Win32::OLE个错误。相反,设置:$Win32::OLE::Warn = 3所以每当出现问题时它都会发出声响。其次,您尝试获取Excel.Application实例的方式不正确。首先,如果出现问题,您将有Excel的实例仍然存在。

您还会混淆Excel实例,工作簿及其包含的工作表。如果你确实有$Win32::OLE::Warn = 3,那么你会收到一个关于出错的通知。

您的脚本中也应始终包含use strictuse warnings。如果他们知道你的问题不是由一些微不足道的错误引起的,那么其他人会更倾向于尝试帮助。

您也不需要三个单独的use Win32::OLE语句。

下面的代码“有效”。与你的比较。

最后,如果您通过Win32::OLE操纵工作表,则没有理由在代码中使用Excel::Writer::XLSX

use feature 'say';
use strict;
use warnings;

use File::Spec::Functions qw( rel2abs );
use Win32::OLE qw(in with) ;
use Win32::OLE::Const 'Microsoft Excel';
$Win32::OLE::Warn = 3;

my $excel = eval {
        Win32::OLE->GetActiveObject('Excel.Application');
    } || Win32::OLE->new('Excel.Application', sub { $_[0]->Quit });

my $wb = $excel->Workbooks->Add;
my $sheet = $wb->Worksheets->Add;

$wb->SaveAs( rel2abs('temp_file.xlsm') );

$excel->{DisplayAlerts} = 0;
$wb->{Saved} = 1;
$wb->Close;