为什么perl保存两份Excel电子表格?

这与保存后在“我的文档”中创buildExcel Addin的副本类似,只不过我正在使用Perl而不是VBA,而使用xls文件而不使用xlsm,并且行为的负面影响是不同的。

我已经inheritance了作为SYSTEM在Windows 2003 Server上运行的Perl脚本(Perl 5.8.8)。 将Excel 2003模板文件复制到唯一的完全定义的path位置后,它将使用OLE在Excel中打开唯一文件,编辑文件,保存文件并closures文件。 编辑文件的结果是保存在正确的,完全定义的path位置以及默认用户configuration文件的“文档”文件夹中。

这导致数以千计的这些文件积累在C:驱动器上,因为每个要雇用的新pipe理员都会在他的“文档”文件夹中获取副本。

添加设置$ OUT的值的代码:

if (!$db->Sql("EXEC GetDetails 'name'")) { while ($db->FetchRow()>0) { @DataIn = $db->Data(); $name = $DataIn[0]; $IN = $DataIn[1]; $OUT = $DataIn[2]; opendir(DIR,"$OUT") || die "$OUT directory does not exist $!\n"; #... loop of proprietary code #... @Completed = $db1->Data(); #... &formatExcelReport #The code that I previously posted #... # more proprietary code # end of loop } #end of while }#end of if 

我最初发布的代码:

 # Initialize Excel object eval {Win32::OLE->new('Excel.Application', 'Quit')}; eval {$Excel = Win32::OLE->GetActiveObject('Excel.Application')}; unless (defined $Excel) { $Excel = Win32::OLE->GetActiveObject('Excel.Application') || Win32::OLE->new('Excel.Application', 'Quit'); } $infiles = "Report_Template.xls"; $infiles = $OUT."/".$infiles; $db6->Sql("EXEC FormatResults '".$Completed[0]."','".$Completed[1]."'"); $row = 2; $fileName = $Completed[0]."_".$Completed[1]; $uniquefile = $fileName.$printdate.".xls"; # $OUT is a fully defined path on the E: drive $reportfile = "$OUT"."\\".$uniquefile; copy($infiles,$reportfile); $Book = $Excel->Workbooks->Open("$reportfile"); $sheetnum = 1; my $Sheet = $Book->Worksheets($sheetnum); # Set Headers $Header = $Sheet->PageSetup->{'CenterHeader'}; $Header = $Header." Results Test Code: ".$Completed[0]." Worksheet: ".$Completed[1]." Date: ".$headerdate; $Sheet->PageSetup->{'CenterHeader'}= $Header; # More file editing # ... $Book->Save(); $Book->Close(0); Win32::OLE->new('Excel.Application', 'Quit'); 

这个问题的根源是Save()命令吗? 我应该使用SaveAs()吗?

有关如何使用Excel的任何其他反馈也欢迎。

谢谢!

更新误读部分问题 – 打开一个现有文件,而不是创build一个新文件。


我不明白是什么导致了这种行为,但这里有一些事情要尝试。

  • 模板和它被复制到的文件具有名称

     $infiles = $OUT."/".$infiles; $reportfile = "$OUT"."\\".$uniquefile; 

    使用相同的分隔符。

  • 尽量压制一些可能的设置,规定另一个副本。 Perhaphs

     $Excel->Application->{CreateBackup} = 0; 

    但是,这可能不是正确的属性 – 在VB或Excel文档中search可能导致Excel保存额外副本的属性。 (它不需要“备份”。)

  • 尝试创build一个新文件并使用SaveAs ,作为一个testing,看看你是否再次获得两个文件。 模板复制可能会将其设置为Save一个额外的副本(即使我不知道如何)。 我会说这是要么,或者一些一般的设置,需要closures。


其余的是原来的post,关于使用SaveAs

您将使用SaveAs为编写一个新的文件。 请参阅saveas in MSDN library

将更改保存到另一个文件中的工作簿。

Borodin的回答指出,使用save method可能会导致保存两个文件。 此页面还build议使用SaveAs作为新文件

首次保存工作簿时,使用SaveAs方法为文件指定一个名称。

一旦你改变使用SaveAs应该有一个确认对话框来处理。 如果你想压制,你可以设置一个属性,用一个(或者?)的

 $Excel->Application->{DisplayAlerts} = 0; # or $Excel->{DisplayAlerts} = 0; 

对于许多选项,包括备份,例如,请参阅“ OLE automation in PERL in a Nutshell关于OLE automation in PERL in a Nutshell的章节。


关于其他一些资源的说明。 this post on perlmonksthis post on perlmonks有一个食谱。 this SO post列出了各种操作。

最后,我不知道使用OLE的原因有多深,但是如果只是写一些Excel文件还有其他模块。 例如备受好评的Spreadsheet::WriteExcelExcel-Writer-XLSX

这是非常奇怪的Perl代码。 eval没有检查$@是错误的 – 你需要知道你的代码的一个步骤失败了以下步骤才有意义

看起来问题是在你的调用中copy($infiles, $reportfile) 。 这将保存文件的一个副本,而$Book->Save$Book->Close将保存另一个