usar sistema libro español ejecutar como comandos comando perl excel automation dialog ole

sistema - automatice el procesamiento de archivos de Excel en Perl y evite interacciones de diálogo/UI



perl ejecutar comando del sistema (4)

¿Cómo puedo garantizar que no aparecerán cuadros de diálogo emergentes cuando automatizo Microsoft Excel a través de OLE? Estoy usando un módulo Perl (Win32 :: OLE). Puedo evitar la mayoría de las ventanas emergentes de diálogo usando el siguiente código:

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 });

Sin embargo, para algunos archivos, sigo obteniendo un diálogo con el siguiente texto:

Este archivo no es un formato reconocible.

  • Si sabe que el archivo es de otro programa que no es compatible con Microsoft Excel, haga clic en Cancelar, luego abra este archivo en su aplicación original. Si desea abrir el archivo más tarde en Microsoft Excel, guárdelo en un formato que sea compatible, como el formato de texto.
  • Si sospecha que el archivo está dañado, haga clic en Ayuda para obtener más información sobre cómo resolver el problema.
  • Si aún desea ver qué texto contiene el archivo, haga clic en Aceptar. A continuación, haga clic en Finalizar en el Asistente de importación de texto.

Aceptar Cancelar

A veces aparece un cuadro de diálogo similar que contiene los botones ''Aceptar'', ''Cancelar'' y ''Ayuda''.

No puedo controlar la calidad de los archivos que se proporcionan a los scripts.


Podría considerar usar Spreadsheet :: ParseExcel (aunque puede carecer de las características que necesita) o POI de Apache (aunque necesitará un poco de envoltura para usar en un script de Perl) en lugar de llamar al motor de Excel en lugar de OLE. De esta forma, no obtendrá ningún cuadro de diálogo generado por Excel.


Aquí hay documentación completa para el método Open. Me pregunto si el parámetro CorruptLoad es lo que necesita.


Volví a visitar este tema y encontré una solución.

Copie el archivo antes de procesarlo en una ubicación temporal. A continuación, guarde el archivo antes de cerrarlo en 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();

Por qué esto funciona:

Excel 2003 vuelve a calcular automáticamente las fórmulas en los documentos que se crearon en una versión anterior de Excel. Además, las macros podrían invocarse cuando se abre el documento. Todo esto significa que podría haber cambios realizados en un documento, aunque su secuencia de comandos no realice ninguna operación de este tipo.

Al guardar el documento antes de cerrarlo, evita el diálogo solicitando que guarde el archivo. El uso de un archivo temporal garantiza que el archivo original no se modifique durante la operación de validación. Si no está preocupado por esto, podría considerar la validación en el lugar.


Si intenta procesar todos los archivos xl en el árbol, algunos de ellos pueden ser abiertos por otros usuarios y tienen el ~ prefijo.