【问题标题】:automate excel file processing in perl and avoid dialog/UI interactions在 perl 中自动处理 excel 文件并避免对话框/UI 交互
【发布时间】:2010-10-02 11:45:40
【问题描述】:

当我通过 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 实例已损坏?如果有新的事件发生,我会重新讨论这个话题。

标签: perl excel automation dialog ole


【解决方案1】:

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

【讨论】:

  • 我没有这样做的原因有两个: 1. Spreadsheet::ParseExcel 的功能不如 MS Excel。 2. Spreadsheet::ParseExcel 对于非常大的 Excel 电子表格非常慢。
  • 我不使用 Apache POI,因为我们目前在开发中不使用 java。
【解决方案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 中创建的文档中的公式。此外,可以在打开文档时调用宏。所有这一切都意味着可能会对文档进行更改,即使您的脚本没有执行任何此类操作。

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

    • CorruptLoad 指示不同的行为,具体取决于加载文件的尝试次数。默认行为似乎适用于我的情况。
    【解决方案4】:

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

    【讨论】:

      猜你喜欢
      • 2012-11-17
      • 2020-08-10
      • 1970-01-01
      • 1970-01-01
      • 2010-09-14
      • 2012-09-18
      • 2012-03-07
      • 2021-12-21
      • 1970-01-01
      相关资源
      最近更新 更多