excel - 为什么 Perl 保存两份 Excel 电子表格副本?

标签 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 中打开该唯一文件,编辑该文件,保存该文件,然后关闭该文件。结果是将编辑的文件保存在正确的、完全定义的路径位置以及默认用户配置文件的文档文件夹中。

这会导致 C: 驱动器上积累数千个此类文件,因为每个要雇用的新管理员都会在其文档文件夹中获得一份副本。

添加设置 $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 的任何其他反馈。

谢谢!

最佳答案

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

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

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

使用相同的分隔符。

  • 尝试抑制某些可能要求制作另一个副本的设置。也许

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

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

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

其余部分是原始帖子,关于使用SaveAs,我认为创建了一个新文件

您可以使用SaveAs来写入一个新文件。请参阅saveas in MSDN library

Saves changes to the workbook in a different file.

使用save method可能会由于某种原因导致保存两个文件,如 answer by Borodin 中所述。 。此页面还建议使用SaveAs创建新文件

The first time you save a workbook, use the SaveAs method to specify a name for the file.

一旦您更改为使用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 .

关于excel - 为什么 Perl 保存两份 Excel 电子表格副本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37819913/

相关文章:

c# - 如何以编程方式将 Excel Power 查询中的连接字符串更改为 SQL Server?

java - 动态读取Excel并存储在 map 中

perl - Perl 中的排序函数

ios - 仅当它们由相机拍摄而不是从照片库中选择时才将图像保存到照片库

excel - lastcol =范围 ("a7").End(xlRight).Column

c# - 迭代 Excel 引用范围的最快方法 ("C20:F22")

python - 忙框、Run C、python 或 Perl 程序

正则表达式捕获特定单词之间的单词

python - 如何保存棋盘游戏? Python

Django - save() 更新重复键