在Perl中自动处理Excel文件并避免对话框/用户界面交互。

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中打开文件,请将其保存为兼容格式,例如文本格式。
如果您怀疑文件已损坏,请单击“帮助”以获取有关解决问题的更多信息。
如果您仍想查看文件中包含的文本,请单击“确定”。然后在文本导入向导中单击“完成”。
有时会出现类似的对话框,其中包含“确定”、“取消”和“帮助”按钮。
我无法控制提供给脚本的文件的质量。

自上次对话框事件以来已经过去了3到4天。我不得不相信我的原始陈述中有些地方是不正确的。也许Excel实例已经损坏了? 如果发生新的事件,我会重新审视这个问题。 - schwerwolf
4个回答

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

这里有两个原因我没有去做这个:
  1. Spreadsheet::ParseExcel 功能不如 MS Excel 完善。
  2. 对于非常大的 Excel 表格,Spreadsheet::ParseExcel 的速度非常慢。
- schwerwolf
我不使用Apache POI,因为我们目前在开发中不使用Java。 - schwerwolf

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中创建的文档中的公式。此外,宏可能在打开文档时被调用。所有这些意味着即使您的脚本不执行任何此类操作,文件也可能发生更改。

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


0

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


CorruptLoad根据尝试加载文件的次数而表现出不同的行为。默认行为似乎适用于我的情况。 - schwerwolf

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接