2010-09-03 18 views
5

Estoy intentando guardar un libro que se ha modificado automáticamente. Aquí está un ejemplo:Cómo guardar el libro de Excel utilizando la API de com4j sin que se le solicite

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

}

El código anterior se ejecuta desde un archivo de hormigas y produjo el siguiente error:

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 

probé las siguientes cosas y ninguno tuvo éxito:

  1. configurando el parámetro readOnly como falso
  2. estableciendo el parámetro ignoreReadOnly a cierto
  3. Hacer ambas cosas 1 y 2
  4. pasando el objeto saveBeforeExit al método save

¿Hay una manera de guardar un libro sin ser impulsado? Tenga en cuenta que el código anterior abre el archivo y calcula las fórmulas sin ningún error.

Gracias

+0

algún motivo usted no desea utilizar PDI: http://poi.apache.org/ – tronda

+0

@tronda: Necesito calcular un libro de trabajo que contenga varias hojas de fórmulas. POI puede evaluar fórmulas dentro de las celdas solamente. Estoy cerca de tener una solución usando la API de com4j. Publicaremos pronto. – kninja

Respuesta

5

Ok aquí está la solución:

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

}

Cuestiones relacionadas