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

时间:2016-06-14 18:49:58

标签: excel perl save windows-server-2003 ole

这类似于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的任何其他反馈也欢迎。

谢谢!

2 个答案:

答案 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::WriteExcelExcel-Writer-XLSX

答案 1 :(得分:0)

那个非常奇怪的Perl代码。 eval之后没有检查$@是错误的 - 你需要知道你的代码的一个步骤是否失败,以便以下步骤有意义

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