我正在尝试解析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;
答案 0 :(得分:1)
以下是基于您的代码的更新。首先,您要忽略Win32::OLE
个错误。相反,设置:$Win32::OLE::Warn = 3
所以每当出现问题时它都会发出声响。其次,您尝试获取Excel.Application
实例的方式不正确。首先,如果出现问题,您将有Excel的实例仍然存在。
您还会混淆Excel实例,工作簿及其包含的工作表。如果你确实有$Win32::OLE::Warn = 3
,那么你会收到一个关于出错的通知。
您的脚本中也应始终包含use strict
和use 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;