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