Excel-Dateiverarbeitung in Perl automatisiert und Dialog / UI-Interaktionen vermeiden
-
19-08-2019 - |
Frage
Wie kann eine I Garantie, dass keine Pop-up-Dialoge angezeigt, wenn ich Microsoft Excel durch OLE-Automatisierung? Ich bin mit einer Perl-Modul (Win32 :: OLE). Ich kann die meisten Dialog Pop-ups mit dem folgenden Code vermeiden:
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
});
Doch für einige Dateien, ich weiterhin einen Dialog mit dem folgenden Text bekommen:
Diese Datei ist keine erkennbare Format.
- Wenn Sie wissen, dass die Datei von einem anderen Programm, das mit nicht kompatibel ist Microsoft Excel, klicken Sie auf Abbrechen, dann Öffnen Sie diese Datei in seiner ursprünglichen Anwendung. Wenn Sie wollen, dass die öffnen Datei später in Microsoft Excel, speichern in einem Format, das kompatibel ist, wie beispiel als Textformat an.
- Wenn Sie die Datei vermuten beschädigt ist, klicken Sie auf Hilfe, um weitere Informationen zu Lösung des Problems.
- Wenn Sie immer noch sehen wollen, welcher Text in der Datei enthalten ist, Klicken Sie auf OK. Dann klicken Sie auf Fertig in dem Textimport Wizard.
OK Abbrechen
Manchmal ist ein ähnliches Dialogfeld erscheint, dass enthält ‚OK‘, ‚Abbrechen‘ und ‚Hilfe‘ Tasten.
Ich kann die Qualität der Dateien steuern, die zu den Skripten zur Verfügung gestellt werden.
Lösung 2
ich dieses Problem revisited und fand eine Lösung.
Kopieren Sie die Datei vor der Verarbeitung in einem temporären Speicherort. Dann speichern Sie die Datei, bevor es in Excel endet:
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();
Warum dies funktioniert:
Excel 2003 neu berechnet automatisch die Formeln in Dokumenten, die in einer älteren Version von Excel erstellt wurden. Darüber hinaus könnten Makros aufgerufen werden, wenn das Dokument geöffnet wird. All dies bedeutet, dass es Änderungen an einem Dokument vorgenommen werden könnte, auch wenn Ihr Skript keine solche Operationen nicht durchführen.
das Dokument Durch das Speichern vor dem Schließen, vermeiden Sie den Dialog fordern, dass Sie die Datei speichern. eine temporäre Datei wird sichergestellt, dass die ursprüngliche Datei erhält nicht während des Validierungsvorganges geändert. Wenn Sie nicht über diese betroffen sind, könnten Sie an Ort und Stelle zu validieren.
Andere Tipps
Sie könnte in Erwägung ziehen mit Kalkulationstabelle :: ParseExcel (wenn auch kann es Funktionen fehlen Sie benötigen) oder Apache POI (wenn auch es etwas Verpackung benötigen zu verwenden, in ein Perl-Skript), statt das Excel-Engine über OLE aufzurufen. Auf diese Weise können keine Excel-generierten Dialoge bekommen.
Hier ist eine vollständige Dokumentation für Open Methode. Ich frage mich, ob CorruptLoad Parameter ist, was Sie brauchen.
Wenn Sie derzeit alle xl Dateien im Baum versuchen, können einige von ihnen von anderen Benutzern geöffnet sein und den ~ Präfix.