Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么perl要保存两份Excel电子表格?_Excel_Perl_Save_Windows Server 2003_Ole - Fatal编程技术网

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

为什么perl要保存两份Excel电子表格?,excel,perl,save,windows-server-2003,ole,Excel,Perl,Save,Windows Server 2003,Ole,这与类似,只是我使用Perl而不是VBA,使用xls文件而不是xlsm,这种行为的负面影响是不同的 我继承了一个在Windows2003Server上作为系统运行的Perl脚本(Perl5.8.8)。将Excel 2003模板文件复制到唯一的、完全定义的路径位置后,将使用OLE在Excel中打开该唯一文件,编辑该文件,保存该文件,然后关闭该文件。结果是编辑后的文件保存在正确、完全定义的路径位置,以及默认用户配置文件的“文档”文件夹中 这导致数千个这样的文件累积在C:drive上,因为每一个新雇用

这与类似,只是我使用Perl而不是VBA,使用xls文件而不是xlsm,这种行为的负面影响是不同的

我继承了一个在Windows2003Server上作为系统运行的Perl脚本(Perl5.8.8)。将Excel 2003模板文件复制到唯一的、完全定义的路径位置后,将使用OLE在Excel中打开该唯一文件,编辑该文件,保存该文件,然后关闭该文件。结果是编辑后的文件保存在正确、完全定义的路径位置,以及默认用户配置文件的“文档”文件夹中

这导致数千个这样的文件累积在C:drive上,因为每一个新雇用的管理员都会在他的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如何使用的任何其他反馈也欢迎


谢谢

这是非常奇怪的Perl代码
eval
之后不检查
$@
是错误的——您需要知道代码中的某个步骤是否失败,以使下面的步骤有意义


问题似乎出在您对
copy($infles,$reportfile)
的调用中。这将保存文件的一个副本,而
$Book->save
$Book->Close
将保存另一个

Update误读问题的一部分--打开一个现有文件,而不是创建一个新文件


我不知道是什么导致了这种行为,但这里有一些事情可以尝试

  • 模板及其复制文件的名称

    $infiles = $OUT."/".$infiles;
    $reportfile = "$OUT"."\\".$uniquefile;
    
    使用相同的分隔符

  • 尝试抑制某些可能的设置,以指示制作另一份副本。也许

    $Excel->Application->{CreateBackup} = 0;
    
    但是,这可能不是正确的属性--在VB或Excel文档中搜索可能导致Excel保存额外副本的属性。(不必是“备份”。)

  • 尝试创建一个新文件,并使用
    SaveAs
    ,以测试是否再次获得两个文件。模板复制可能会将其设置为
    保存
    额外的副本(即使我不知道如何)。我要说的是,要么就是这个,要么就是一些需要关闭的常规设置


其余部分是关于使用
SaveAs

您可以使用
SaveAs
编写新文件。看

将对工作簿的更改保存到其他文件中

使用可能导致出于某种原因保存两个文件,如的回答中所述。本页还建议对新文件使用
SaveAs

第一次保存工作簿时,请使用SaveAs方法指定文件名

一旦更改为使用
SaveAs
,应该会有一个确认对话框来处理。如果要取消显示,可以使用以下选项之一(或其中一个?)设置属性:

有关包括备份等在内的许多选项,请参阅上的章节


关于其他一些资源的说明。里面有一本烹饪书。中给出了各种操作的列表


最后,我不知道使用OLE的原因有多深,但如果只是为了编写一些Excel文件,还有其他模块。例如,备受推崇的和。

有一件事我仍然没有注意到——默认用户的Documents文件夹中有哪个副本$在复制和在Excel中打开文件时,reportfile应该是E:驱动器上.xls文件的完整路径名。关于eval的使用,我认为这是在Internet上发现的一些技巧,可以防止脚本在Excel已打开时退出,从而导致使用现有的Excel实例。我认为这是一个坏主意,还有其他原因。这个脚本的下一个版本将根本不使用OLE和Excel。但现在,我只想了解为什么会这样。@Rebeccah:请在你原来的问题中添加任何相关信息,不要删除已经存在的内容。我们可能会接受更改,但您可以留下评论,提醒我们您已做出更改change@Rebeccah:请同时删除不再存在的任何注释relevant@Rebeccah:编辑链接位于问题下方,标签下方@Rebeccah我在意识到您发布的代码打开了一个现有文件,而不是创建一个新文件后,对答案进行了实质性的更新。请告诉我进展如何。谢谢你,@zdim。模板文件中包含所有格式。我今天要做一个测试部署,所以我将有机会尝试其中的一些东西。新版本将使用电子表格::WriteExcel或可能使用电子表格::ParseExcel::SaveParser(我有两个版本要试用),但当前的这种行为一直困扰着我,因此我希望我能找到问题的症结所在。我更新了我的问题,以纠正Excel正在创建新文件的错误印象,而事实上,它正在打开一个现有的。@Rebeccah当然是对的。所以你需要这个。我相应地改变了我的职位。使用一个新文件仍然值得一试,只是看看您是否得到了相同的行为。除此之外,我猜这是某种Excel设置。我认为所有的项目符号都值得一试,但是如果你只是编写Excel文件,那么就使用其他模块,特别是第一个推荐的模块。OLE是其他钱包所需要的,您不需要它来编写一个或几个文件(除非有非常奇特的元素)。对。我认为脚本最初是以这种方式编写的,因为当时,作者不知道其他模块——我不确定Perl 5.8是否存在这些模块。。。。为什么这个界面会从我给你的评论中删除@zdim?
$Excel->Application->{DisplayAlerts} = 0;
# or
$Excel->{DisplayAlerts} = 0;