автоматизировать обработку файлов Excel в Perl и избежать диалоговых / пользовательского интерфейса - PullRequest
5 голосов
/ 20 января 2009

Как я могу гарантировать, что при автоматизации Microsoft Excel через OLE не появятся всплывающие диалоговые окна? Я использую модуль 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, сохраните его в формате, который совместим, такой в текстовом формате.
  • Если вы подозреваете, что файл поврежден, нажмите «Справка» для получения дополнительной информации о решение проблемы.
  • Если вы все еще хотите увидеть, какой текст содержится в файле, нажмите OK. Затем нажмите Готово в текстовом импорте Мастер.

OK Отмена

Иногда появляется похожее диалоговое окно с кнопками «ОК», «Отмена» и «Справка».

Я не могу контролировать качество файлов, предоставляемых сценариям.

Ответы [ 4 ]

3 голосов
/ 20 января 2009

Вы можете рассмотреть возможность использования Spreadsheet :: ParseExcel (хотя в нем могут отсутствовать нужные вам функции) или Apache POI (хотя для использования в скрипте Perl потребуется некоторая упаковка) вызова движка Excel через OLE. Таким образом, вы не получите никаких сгенерированных Excel диалогов.

2 голосов
/ 07 августа 2009

Я вернулся к этой проблеме и нашел решение.

Скопируйте файл перед обработкой во временную папку. Затем сохраните файл перед тем, как закрыть его в 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 голосов
/ 26 марта 2015

Если вы пытаетесь обработать все xl-файлы в дереве, некоторые из них могут быть открыты другими пользователями и иметь префикс ~.

0 голосов
/ 21 января 2009

Здесь - полная документация для метода Open. Интересно, вам нужен параметр CorruptLoad?

...