2010-09-03 8 views
5

Sto tentando di salvare una cartella di lavoro che è stata modificata automaticamente. Ecco un esempio:Come salvare la cartella di lavoro Excel utilizzando l'API com4j senza che venga richiesto

import excel.*; 
import com4j.Variant; 
import static com4j.Variant.MISSING; 


public class ExcelDemo { 
    public static void main(String[] args) { 
    _Application app = excel.ClassFactory.createApplication(); 
    app.visible(0,false); 

    //Variant readOnly = new Variant(Variant.Type.VT_BOOL); 
    //readOnly.set(0); 
    //Variant ignoreReadOnly = new Variant(Variant.Type.VT_BOOL); 
    //ignoreReadOnly.set(1); 
    //Variant saveBeforeExit = new Variant(Variant.Type.VT_BOOL); 
    //saveBeforeExit.set(1); 

    app.workbooks().open(
     "C:/dev/test.xlsx", 
     MISSING, 
     MISSING, 
     MISSING, 
     MISSING,  
     MISSING,  
     MISSING,  
     MISSING, 
     MISSING,  
     MISSING,  
     MISSING,  
     MISSING, 
     MISSING,  
     MISSING,  
     MISSING,  
     0); 
    app.calculate(0); 
    app.save(MISSING,0); 
    app.workbooks().close(0); 
    //app.workbooks().close(saveBeforeExit,MISSING,MISSING); 
} 

}

Il codice di cui sopra è stato eseguito da un file formica e prodotto il seguente errore:

run: 
[java] Exception in thread "main" com4j.ComException: 800a03ec (Unknown error) : The file could not be accessed. Try one of the following: 
[java] 
[java] ò Make sure the specified folder exists. 
[java] ò Make sure the folder that contains the file is not read-only. 
[java] ò Make sure the file name does not contain any of the following characters: < > ? [ ] : | or * 
[java] ò Make sure the file/path name doesn't contain more than 218 characters. : .\invoke.cpp:460 
[java]  at com4j.Wrapper.invoke(Wrapper.java:122) 
[java]  at $Proxy5.save(Unknown Source) 
[java]  at ExcelDemo.main(ExcelDemo.java:36) 
[java] Caused by: com4j.ComException: 800a03ec (Unknown error) : The file could not be accessed. Try one of the following: 
[java] 
[java] ò Make sure the specified folder exists. 
[java] ò Make sure the folder that contains the file is not read-only. 
[java] ò Make sure the file name does not contain any of the following characters: < > ? [ ] : | or * 
[java] ò Make sure the file/path name doesn't contain more than 218 characters. : .\invoke.cpp:460 
[java]  at com4j.Native.invoke(Native Method) 
[java]  at com4j.StandardComMethod.invoke(StandardComMethod.java:95) 
[java]  at com4j.Wrapper$InvocationThunk.call(Wrapper.java:258) 
[java]  at com4j.Task.invoke(Task.java:44) 
[java]  at com4j.ComThread.run0(ComThread.java:149) 
[java]  at com4j.ComThread.run(ComThread.java:125) 
[java] Java Result: 1 

Ho provato le seguenti cose e nessuno era successo:

  1. impostazione del parametro readOnly su false
  2. impostazione del parametro ignoreReadOnly true
  3. Fare entrambe 1 e 2
  4. passando l'oggetto saveBeforeExit al metodo save

C'è un modo per salvare una cartella di lavoro senza che venga richiesto? Si noti che il codice sopra riportato apre il file e calcola le formule senza errori.

Grazie

+0

Qual è il motivo non si desidera utilizzare POI: http://poi.apache.org/ – tronda

+0

@tronda: Devo calcolare una cartella di lavoro contenente più fogli di formule. Il POI può valutare solo le formule all'interno delle celle. Sono vicino ad avere una soluzione usando l'API com4j. Pubblicherà presto. – kninja

risposta

5

Ok ecco la soluzione:

import excel.*; 
import com4j.Variant; 
import static com4j.Variant.MISSING; 


public class ExcelDemo { 
    public static void main(String[] args) { 
    _Application app = excel.ClassFactory.createApplication(); 
    app.visible(0,false); 

Variant saveBeforeExit = new Variant(Variant.Type.VT_BOOL); 
saveBeforeExit.set(1); 

_Workbook wb = app.workbooks().open(
    "C:/dev/test.xlsx", 
    MISSING, //0 
    MISSING, //false 
    MISSING, //5 
    MISSING, //"" 
    MISSING, //"" 
    MISSING, //true 
    MISSING, //true 
    MISSING, //obj 
    MISSING, //false 
    MISSING, //false 
    MISSING, //obj 
    MISSING, 
    MISSING, 
    MISSING, 
0); 
app.calculate(0); 
wb.close(saveBeforeExit, MISSING,MISSING, 0); 
app.quit(); 
} 

}