2010-09-03 8 views
5

Ich versuche, eine Arbeitsmappe zu speichern, die automatisch geändert wurde. Hier ein Beispiel:So speichern Sie Excel-Arbeitsmappe mit com4j API ohne Aufforderung

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

}

Der obige Code wurde von einer Ameise-Datei ausführen und erzeugt den folgenden Fehler:

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 

Ich habe versucht, die folgenden Dinge und keiner war erfolgreich:

  1. Setzen Sie den Parameter readOnly auf false
  2. Einstellung der ignoreReadOnly Parameter auf true
  3. tun beide 1 und 2
  4. das saveBeforeExit Objekt der Methode speichern vorbei

Gibt es eine Möglichkeit, eine Arbeitsmappe zu speichern, ohne gefragt zu werden? Beachten Sie, dass der obige Code die Datei öffnet und Formeln ohne Fehler berechnet.

Dank

+0

Gibt es Gründe, die Sie nicht wollen POI verwenden: http://poi.apache.org/ – tronda

+0

@tronda: Ich muss eine Arbeitsmappe berechnen, die mehrere Formelblätter enthält. POI kann nur Formeln in Zellen auswerten. Ich bin nah daran, eine Lösung zu haben, obwohl ich die com4j API verwende. Wird bald posten. – kninja

Antwort

5

Ok hier ist die Lösung:

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

}