在perl中自动执行excel文件处理,并避免对话/ UI交互

我如何保证当我通过OLE自动化Microsoft Excel时不会出现popup对话框? 我正在使用Perl模块(Win32 :: OLE)。 我可以使用下面的代码避免大多数对话popup窗口:

use Win32::OLE; use Win32::OLE::Variant; use Win32::OLE::Const; my $excel_symbols = Win32::OLE::Const->Load('Microsoft Excel'); my $excel = Win32::OLE->new('Excel.Application', sub { $_[0]->Quit();} ); $excel->{'Visible'} = 0; $excel->{'DisplayAlerts'} = 0; $excel->Workbooks->Open('c:\some_excel_file.xls', { 'UpdateLinks' => $excel_symbols->{'xlUpdateLinksNever'}, 'ReadOnly' => 1, 'IgnoreReadOnlyRecommended' => 1 }); 

但是对于某些文件,我继续使用以下文本进行对话:

这个文件不是一个可识别的格式。

  • 如果您知道该文件来自与Microsoft Excel不兼容的其他程序,请单击“取消”,然后在其原始应用程序中打开该文件。 如果您希望以后在Microsoft Excel中打开该文件,请以兼容的格式(如文本格式)将其保存。
  • 如果您怀疑文件已损坏,请单击“帮助”以获取有关解决问题的更多信息。
  • 如果您仍想查看文件中包含哪些文本,请单击确定。 然后在文本导入向导中单击完成。

确定取消

有时会出现一个类似的对话框,其中包含“确定”,“取消”和“帮助”button。

我无法控制提供给脚本的文件的质量。

你可以考虑使用Spreadsheet :: ParseExcel (尽pipe它可能缺less你需要的function)或者Apache POI (尽pipe它需要一些在Perl脚本中使用的包装),而不是通过OLE调用Excel引擎。 这样你将不会得到任何Excel生成的对话框。

我重新审视了这个问题,并find了解决办法。

在处理之前将文件复制到临时位置。 然后在closuresExcel之前保存该文件:

 File::Copy::copy('c:\some_excel_file.xls', 'c:\temp\SFO3jfd.xls'); my $book = $excel->Workbooks->Open('c:\temp\SFO3jfd.xls', { 'UpdateLinks' => $excel_symbols->{'xlUpdateLinksNever'}, 'ReadOnly' => 1, 'IgnoreReadOnlyRecommended' => 1 }); $book->Save(); $book->Close(); 

为什么这个工作:

Excel 2003会自动重新计算在较早版本的Excel中创build的文档中的公式。 而且,打开文档时可以调用macros。 所有这些都意味着即使您的脚本不执行任何此类操作,也可能会对文档进行更改。

通过在closures前保存文档,可避免请求保存文件的对话框。 使用临时文件可确保原始文件在validation操作期间不会被更改。 如果你不关心这个,你可以考虑就地validation。

这里是Open方法的完整文档。 我想知道如果CorruptLoad参数是你需要的。

如果您正在尝试处理树中的所有xl文件,其中一些文件可能由其他用户打开,并且具有〜前缀。