5

我如何保证通过 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 中打开该文件,请将其保存为兼容的格式,例如文本格式。
  • 如果您怀疑文件已损坏,请单击帮助以获取有关解决问题的详细信息。
  • 如果您仍想查看文件中包含的文本,请单击“确定”。然后在文本导入向导中单击完成。

确定 取消

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

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

4

4 回答 4

3

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

于 2009-01-20T16:39:57.633 回答
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 中创建的文档中的公式。此外,可以在打开文档时调用宏。所有这些都意味着可能会对文档进行更改,即使您的脚本没有执行任何此类操作。

通过在关闭之前保存文档,您可以避免出现要求您保存文件的对话框。使用临时文件可确保在验证操作期间不会更改原始文件。如果您不关心这一点,您可以考虑就地验证。

于 2009-08-07T16:07:26.980 回答
0

是 Open 方法的完整文档。我想知道 CorruptLoad 参数是否是您所需要的。

于 2009-01-21T17:58:13.357 回答
-2

如果您尝试处理树中的所有 xl 文件,其中一些可能已被其他用户打开并带有 ~ 前缀。

于 2015-03-26T15:01:15.733 回答