【问题标题】:How to Read an Excel Personal Macro from java with Jacob如何使用 Jacob 从 Java 中读取 Excel 个人宏
【发布时间】:2013-03-06 04:46:26
【问题描述】:

我必须从 jacob 执行一个 excel 文件的宏,但现在我想执行一个 personal.xlsb!mymacro 并且我的 java 程序抛出错误。个人宏的名字不知道怎么写,我放:

String file="D:/Aprogramas/EclipseJEE/temp/Libro2.xlsm"

public boolean openFile`(String file) {
  try {
   final String macroName = "!PERSONAL.XLSB!Auto_abrir";
   executeMacro(new File(file), macroName);
   return true;
  } catch (Exception e) {
   e.printStackTrace();
  }
  return true;
 }


public boolean executeMacro(File file, String macroName) {
  ComThread.InitSTA();

  final ActiveXComponent excel = new ActiveXComponent("Excel.Application");

  try {

   final Dispatch workbooks = excel.getProperty("Workbooks")
     .toDispatch();
   final Dispatch workBook = Dispatch.call(workbooks, "Open",
     file.getAbsolutePath()).toDispatch();

   final Variant result = Dispatch.call(excel, "Run",
     new Variant(file.getName() + macroName));

   Dispatch.call(workBook, "Save");

   com.jacob.com.Variant f = new com.jacob.com.Variant(true);
   Dispatch.call(workBook, "Close", f);

  } catch (Exception e) {
   e.printStackTrace();
  } finally {
   excel.invoke("Quit", new Variant[0]);
   ComThread.Release();
   return true;
  }

 }

控制台中的错误是:

com.jacob.com.ComFailException: Invoke of: Run
Source: Microsoft Excel
Description: No se puede ejecutar la macro "Libro2.xlsm!PERSONAL.XLSB!Auto_abrir". Puede que la macro no esté disponible en este libro o que se hayan deshabilitado todas las macros.

at com.jacob.com.Dispatch.invokev(Native Method)
at com.jacob.com.Dispatch.invokev(Dispatch.java:625)
at com.jacob.com.Dispatch.callN(Dispatch.java:453)
at com.jacob.com.Dispatch.call(Dispatch.java:541)
at com.test.main.POIExecutor.executeMacro(POIExecutor.java:43)
at com.test.main.POIExecutor.openFile(POIExecutor.java:23)
at com.test.main.Main.main(Main.java:11)

【问题讨论】:

    标签: java excel jacob


    【解决方案1】:

    无需在 Dispatch.call 方法中附加文件名和宏名。

    从 Dispatch.call 方法中删除 "new Variant(file.getName() +" 部分

    final Variant result = Dispatch.call(excel, "Run",
     **new Variant(file.getName() +** macroName));
    

    正确的做法是

    final Variant result = Dispatch.call(excel, "Run", macroName));
    

    它将正确执行。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-10
      • 1970-01-01
      • 2021-06-02
      相关资源
      最近更新 更多