当我通过OLE自动化Microsoft Excel时,如何保证不会出现弹出对话框?我正在使用Perl模块(Win32 :: OLE)。我可以使用以下代码避免大多数对话框弹出窗口:
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中保存文件 以兼容的格式,例如 作为文本格式。
- 如果您怀疑文件已损坏,请单击“帮助”以获取更多信息 解决问题。
- 如果您仍想查看文件中包含的文本,请单击“确定”。 然后在文本导入中单击“完成” 向导。
确定取消
有时会出现类似的对话框,其中包含“确定”,“取消”和“帮助”按钮。
我无法控制提供给脚本的文件的质量。
答案 0 :(得分:3)
您可以考虑使用Spreadsheet::ParseExcel(尽管它可能缺少您需要的功能)或Apache POI(虽然它需要在Perl脚本中使用一些包装)而不是通过OLE调用Excel引擎。这样你就不会得到任何Excel生成的对话框。
答案 1 :(得分:2)
我重新审视了这个问题并找到了解决方案。
在处理之前将文件复制到临时位置。然后保存文件,然后在Excel中关闭它:
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中创建的文档中的公式。此外,可以在打开文档时调用宏。所有这些都意味着可能会对文档进行更改,即使您的脚本不执行任何此类操作。
通过在关闭之前保存文档,可以避免请求保存文件的对话框。使用临时文件可确保在验证操作期间不会更改原始文件。如果您不关心这一点,可以考虑就地验证。
答案 2 :(得分:0)
Here是Open方法的完整文档。我想知道CorruptLoad参数是否是你需要的。
答案 3 :(得分:-2)
如果您正在尝试处理树中的所有xl文件,其中一些可能由其他用户打开并具有〜前缀。