这类似于A copy of Excel Addin is created in My Documents after saving,除了我正在使用Perl而不是VBA,而xls文件而不是xlsm,并且行为的负面影响是不同的。
我继承了一个在Windows 2003 Server上作为SYSTEM运行的Perl脚本(Perl 5.8.8)。将Excel 2003模板文件复制到唯一的,完全定义的路径位置后,它将使用OLE在Excel中打开唯一文件,编辑文件,保存文件并关闭文件。结果是编辑后的文件既保存在正确的,完全定义的路径位置,也保存在默认用户配置文件的Documents文件夹中。
这导致数千个这些文件在C:盘上累积,因为每个要雇用的新管理员都会在他的Documents文件夹中获得一个副本。
添加设置$ 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的任何其他反馈也欢迎。
谢谢!
答案 0 :(得分:2)
更新误读问题的一部分 - 打开现有文件,而不是创建新文件。
我没有看到导致这种行为的原因,但这里有几件事要尝试。
模板及其复制的文件名称为
$infiles = $OUT."/".$infiles;
$reportfile = "$OUT"."\\".$uniquefile;
使用相同的分隔符。
尝试抑制一些可能的设置,指示另一个副本。 Perhaphs
$Excel->Application->{CreateBackup} = 0;
但是,这可能不是正确的属性 - 在VB或Excel文档中搜索可能导致Excel保存额外副本的属性。 (它不一定是“备份”。)
尝试创建新文件并使用SaveAs
作为测试,以查看是否再次获得两个文件。模板复制可能会将其设置为Save
一个额外的副本(即使我没有看到如何)。我要说它要么是,要么需要关闭一些常规设置。
其余的是关于使用SaveAs
您可以使用SaveAs
编写新文件。见saveas in MSDN library
将更改保存到另一个文件中的工作簿。
使用save method
可能会因某种原因导致保存两个文件,如Borodin
的答案中所述。此页面还建议将SaveAs
用于新文件
首次保存工作簿时,请使用SaveAs方法指定文件的名称。
更改为使用SaveAs
后,应该会有一个确认对话框来处理。如果你想抑制你可以用一个(或任何一个?)
$Excel->Application->{DisplayAlerts} = 0;
# or
$Excel->{DisplayAlerts} = 0;
对于许多选项,例如备份,请参阅OLE automation in PERL in a Nutshell
一章。
关于其他一些资源的说明。在this post on perlmonks
中有一本各种食谱。 this SO post
中列出了各种操作的列表。
最后,我不知道使用OLE的原因有多深,但如果仅仅是写一些Excel文件还有其他模块。例如,备受好评的Spreadsheet::WriteExcel
和Excel-Writer-XLSX
。
答案 1 :(得分:0)
那个非常奇怪的Perl代码。 eval
之后没有检查$@
是错误的 - 你需要知道你的代码的一个步骤是否失败,以便以下步骤有意义
问题出在copy($infiles, $reportfile)
的调用中。这将保存文件的一个副本,而$Book->Save
和$Book->Close
将保存另一个