2010-09-07 17 views
6

Estoy usando JACOB para hacer llamadas COM a PowerPoint y otras aplicaciones de Office desde Java. En particular, una caja de Windows 7 que estoy recibiendo el siguiente mensaje muy a menudo, pero no siempre:Office 2007 no puede abrir archivos cuando se llama a través de JACOB desde un servicio

Source: Microsoft Office PowerPoint 2007 
Description: PowerPoint could not open the file. 

desde Excel me sale:

ERROR - Invoke of: Open 
Source: Microsoft Office Excel 
Description: Microsoft Office Excel cannot access the file 'c:\marchena\marchena10\work\marchena\batch_58288\input\content_1.xlsx'. There are several possible reasons: 

? The file name or path does not exist. 
? The file is being used by another program. 
? The workbook you are trying to save has the same name as a currently open workbook. 

El error Palabra es simplemente:

VariantChangeType failed 

Lo siguiente es lo que estoy ejecutando, el error proviene de la última línea.

 ComThread.InitSTA(); 

     slideApp = new ActiveXComponent("PowerPoint.Application"); 

     Dispatch presentations = slideApp.getProperty("Presentations").toDispatch(); 

     Dispatch presentation = Dispatch.call(presentations, "Open", inputFile.getAbsolutePath(), 
       MsoTriState.msoTrue.getInteger(), // ReadOnly 
       MsoTriState.msoFalse.getInteger(), // Untitled The Untitled parameter is used to create a copy of the presentation. 
       MsoTriState.msoFalse.getInteger() // WithWindow 
     ).toDispatch(); 

he intentado poner un punto de interrupción justo antes de hacer la llamada a Open y el archivo está allí, y que en realidad puede abrirlo con PowerPoint en la GUI, pero cuando me paso se produce la excepción.

Lo molesto de este problema es que parece suceder de forma continua, pero después de hurgar en él durante un tiempo (volver a ejecutar el mismo código), finalmente se completa con éxito y después de eso nunca vuelve a producirse.

Investigación adicional He encontrado que esto solo ocurre con archivos .ppt, .doc y .xls, no con .pptx, .docx y .xlsx. Y hasta donde sé, no está relacionado con el sistema de archivos (he cambiado el mecanismo que copia los archivos e intenté poner los archivos en un sistema de archivos diferente).

Acabo de notar que esto solo ocurre cuando la aplicación Java se ejecuta como un servicio, no cuando ejecuto catalina.bat start desde la línea de comandos.

Respuesta

2

¿Esto funciona para usted?

import com.jacob.activeX.ActiveXComponent; 
import com.jacob.com.ComThread; 
import com.jacob.com.Dispatch; 
import com.jacob.com.Variant; 

public class PPT { 
    private static final String inputFile = "c:\\learning.ppt"; 
    public static void main(String[] args) { 
     ActiveXComponent slideApp = new ActiveXComponent("PowerPoint.Application"); 
     slideApp.setProperty("Visible", new Variant(true)); 
     ActiveXComponent presentations = slideApp.getPropertyAsComponent("Presentations"); 
     ActiveXComponent presentation = presentations.invokeGetComponent("Open",new Variant(inputFile), new Variant(true)); 
     ComThread.Release(); 
      } 
     } 

Actualización: Si esto está funcionando el cliente y que es sólo la automatización que está causando los problemas, puede ver http://support.microsoft.com/kb/257757 mirar a los posibles problemas. Es obvio que los códigos de error son diferentes, pero puede ayudarlo a resolver los problemas de todos modos.

+0

me sale el mismo error que el uso. También esto funciona como un servicio así que tenerlo sin cabeza fue deliberado. –

+0

¿Es su Win 7 box x64 o x86? Si es x64, ¿ha implementado la JVM de 64 bits? –

+0

Sí, es x64, con una JVM de 64 bits y la versión x64 de jacob.dll. –

2

que tenían el mismo problema (Jacob en el servicio no funciona), y este anuncio útiles (cambiando el dcomcnfg) resolvieron el problema:

http://bytes.com/topic/c-sharp/answers/819740-c-service-excel-application-workbooks-open-fails-when-called-service#post3466746

+2

Aquí hay una solución aún más fácil. Como administrador, cree las siguientes dos carpetas: "C: \ Windows \ SysWOW64 \ config \ systemprofile \ Desktop" y "C: \ Windows \ System32 \ config \ systemprofile \ Desktop". Probablemente solo necesites uno o el otro, pero esto cubre ambos casos en un sistema operativo de 64 bits. Desde aquí: [enlace] (http://bytes.com/topic/c-sharp/answers/819740-c-service-excel-application-workbooks-open-fails-when-called-service#post3514712) –

Cuestiones relacionadas