2010-09-07 28 views
6

J'utilise JACOB pour effectuer des appels COM vers PowerPoint et d'autres applications Office à partir de Java. Sur une boîte de Windows 7 particulier, je reçois le message suivant assez souvent, mais pas toujours:Office 2007 ne parvient pas à ouvrir les fichiers lorsqu'il est appelé via JACOB à partir d'un service

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

ExCelet je reçois:

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. 

L'erreur mot est juste:

VariantChangeType failed 

Ce qui suit est ce que je cours, l'erreur vient de la dernière ligne.

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

J'ai essayé de mettre un point d'arrêt juste avant de faire l'appel ouvert et le fichier est là, et je peux effectivement l'ouvrir avec PowerPoint dans l'interface graphique, mais quand je fais un pas l'exception est levée. Ce qui est ennuyeux à propos de ce problème, c'est qu'il semble arriver de façon continue au début, mais après l'avoir piqué pendant un certain temps (réexécutant le même code), il finit par aboutir avec succès, et ne se reproduit plus jamais. Recherche supplémentaire J'ai trouvé que cela n'arrive qu'aux fichiers .ppt, .doc et .xls, pas .pptx, .docx et .xlsx. Et autant que je sache, ce n'est pas lié au système de fichiers (j'ai échangé le mécanisme qui copie les fichiers et j'ai essayé de placer les fichiers sur un autre système de fichiers).

Je viens de remarquer que cela se produit uniquement lorsque l'application Java s'exécute en tant que service, et non lorsque j'exécute catalina.bat start à partir de la ligne de commande.

Répondre

2

Est-ce que cela fonctionne pour vous?

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

Mise à jour: Si cela fonctionne, le client et il est tout simplement l'automatisation qui est à l'origine des problèmes, vous pouvez voir http://support.microsoft.com/kb/257757 pour examiner les questions possibles. Les codes d'erreur sont évidemment différents, mais cela peut vous aider à résoudre les problèmes.

+0

je reçois la même erreur en utilisant cela. Aussi, cela fonctionne comme un service, donc l'avoir sans tête était délibérée. –

+0

Est-ce que votre Win 7 box x64 ou x86? Si c'est x64, avez-vous déployé la JVM 64 bits? –

+0

Oui, c'est x64, avec une JVM 64 bits et la version x64 de jacob.dll. –

2

J'ai eu le même problème (jacob en service ne fonctionne pas), et cette annonce utile (changer le dcomcnfg) a fait l'affaire:

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

+2

Voici une solution encore plus facile. En tant qu'administrateur, créez les deux dossiers suivants: "C: \ Windows \ SysWOW64 \ config \ systemprofile \ Desktop" et "C: \ Windows \ System32 \ config \ systemprofile \ Desktop". Vous n'avez probablement besoin que de l'un ou de l'autre, mais cela couvre les deux cas sur un système d'exploitation 64 bits. D'ici: [link] (http://bytes.com/topic/c-sharp/answers/819740-c-service-excel-application-workbooks-open-fails-when-called-service#post3514712) –