автоматизировать обработку файлов Excel в Perl и избегать диалоговых / пользовательских взаимодействий

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

ОК Отменить

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

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


person schwerwolf    schedule 20.01.2009    source источник
comment
Прошло 3 или 4 дня с момента последнего инцидента, связанного с диалоговым окном. Я должен поверить, что в моих первоначальных утверждениях что-то было неправильно. Возможно, экземпляр Excel был поврежден? Если произойдет новый инцидент, я вернусь к теме.   -  person schwerwolf    schedule 21.04.2009


Ответы (4)


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

person moonshadow    schedule 20.01.2009
comment
Я не сделал этого по двум причинам: 1. Spreadsheet :: ParseExcel не так полно функционален, как MS Excel. 2. Таблица :: ParseExcel работает очень медленно для очень больших таблиц Excel. - person schwerwolf; 20.01.2009
comment
Я не использую Apache POI, потому что в настоящее время мы не используем java в нашей разработке. - person schwerwolf; 20.01.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. Кроме того, макросы могут быть вызваны при открытии документа. Все это означает, что в документ могут быть внесены изменения, даже если ваш скрипт не выполняет никаких таких операций.

Сохраняя документ перед закрытием, вы избегаете диалогового окна с просьбой сохранить файл. Использование временного файла гарантирует, что исходный файл не будет изменен во время операции проверки. Если вас это не беспокоит, вы можете рассмотреть возможность проверки на месте.

person schwerwolf    schedule 07.08.2009

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

person Community    schedule 21.01.2009
comment
CorruptLoad показывает различное поведение в зависимости от того, сколько попыток загрузить файл. В моем случае поведение по умолчанию кажется применимым. - person schwerwolf; 23.01.2009

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

person ZGort513_    schedule 26.03.2015