2009-03-26 16 views
5

El siguiente código genera una excepción en Powershell V1 (Excel 2007):la automatización de Excel 2007 con Powershell al llamar Workbooks.Add()

$E = New-Object -COM "Excel.Application" 
$E.Visible = $True 
$wb = $E.Workbooks.Add() #<<<Exception here 

El error dice que el formato podría ser viejo o que el tipo la biblioteca no es válida (traducido del español). Un script similar para Word funciona bien.

+0

¿El método Agregar es uno de los que toma una gran cantidad de parámetros opcionales? Si ese es el caso, es posible que deba proporcionar Type.EmptyType o lo que sea. Busque cómo llamar desde C# (que no tiene soporte de parámetros opcional hasta v4.0). –

+0

En mi experiencia, dependiendo de la versión de Office no es necesario utilizar el tipo Falta para parámetros opcionales, pero por ejemplo Word 2007 requiere que los argumentos se pasen como [ref] en PS, a diferencia de Office XP, por ejemplo. – guillermooo

Respuesta

3

adaptado para Powershell de una de las soluciones propuestas en MS Help and Support Article 320369.

$ci = new-object system.globalization.cultureinfo "en-US" 

$e = New-Object -COM "Excel.Application" 
$e.Visible = $True 
$e.UserControl= $True 
$books = $e.Workbooks 
$books.PSBase.GetType().InvokeMember(` 
     "Add", ` 
     [system.reflection.bindingflags]::InvokeMethod, ` 
     $null, $books, $null, $ci) 

Desde el mismo artículo:

Cuando se utiliza una de estas soluciones para un equipo en la configuración regional no coinciden con la versión en el idioma actual de Office, debe estar familiarizado con cómo Excel se comporta y cómo Excel interpretará los datos que pueden formatearse para una configuración regional específica.

9

Los ensamblados de interoperabilidad de Office parecen tener este problema cuando la referencia cultural actual no es en-US. La solución obvia es establecer la cultura.

Es importante ejecutar todo esto como un solo comando en la consola interactiva, ya que PowerShell V1 siempre crea un nuevo hilo para cada invocación de comando.

PS C:\Users\jachymko> $e = new-object -com excel.application 
PS C:\Users\jachymko> $e.workbooks.add() 
Exception calling "Add" with "0" argument(s): "Old format or invalid type library. (Exception from HRESULT: 0x80028018 (TYPE_E_INVDATAREAD))" 
At line:1 char:17 
+ $e.workbooks.add <<<<() 
    + CategoryInfo   : NotSpecified: (:) [], MethodInvocationException 
    + FullyQualifiedErrorId : ComMethodTargetInvocation 

PS C:\Users\jachymko> & { 
>> [threading.thread]::CurrentThread.CurrentCulture = 'en-US' 
>> $e = new-object -com excel.application 
>> $e.workbooks.add() 
>> $e.visible=1 
>> } 
>> 
+0

Voy a intentarlo más tarde, pero pensé que PSV1 usaba un solo proceso y un solo subproceso? ... – guillermooo

+0

PowerShell usa un solo subproceso de ejecución por espacio de ejecución a la vez, pero el subproceso sale después de cada comando y se inicia de nuevo el siguiente. Creo que esto se puede controlar en V2 usando las API de alojamiento (puede hacer que use el hilo de llamada o reciclar el hilo dedicado entre comandos) –

+0

Su solución no parece funcionar para mí ... Sigo recibiendo el mismo error. – guillermooo

2

Tuve este problema al intentar abrir un libro de trabajo. Agregué esta línea:

[threading.thread]::CurrentThread.CurrentCulture = 'en-US' 
Cuestiones relacionadas