Вызов макроса из Java с использованием Jacob 1.18
У меня есть макрос, определенный в файле Excel, и я хочу вызвать его из Java-программы, используя Jacob 1.18 jar и dll.
Ниже приведен сегмент кода, который я сейчас использую.
import java.io.File;
import com.jacob.activeX.ActiveXComponent;
import com.jacob.com.ComThread;
import com.jacob.com.Dispatch;
import com.jacob.com.Variant;
public class TestJacob {
public static void main(String[] args) {
// TODO Auto-generated method stub
File file = new File("C:\\TestJacob\\TestExcel_copy.xlsm");
String macroName = "TestMacro";
callExcelMacro(file, macroName);
}
private static void callExcelMacro(File file, String macroName) {
ComThread.InitSTA(true);
final ActiveXComponent excel = new ActiveXComponent("Excel.Application");
try{
excel.setProperty("EnableEvents", new Variant(false));
Dispatch workbooks = excel.getProperty("Workbooks")
.toDispatch();
Dispatch workBook = Dispatch.call(workbooks, "Open",
file.getAbsolutePath()).toDispatch();
// Calls the macro
Variant V1 = new Variant( file.getName() + macroName);
Variant result = Dispatch.call(excel, "Run", V1);
// Saves and closes
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();
}
}
}
Следующее исключение я получаю при вызове макроса.
com.jacob.com.ComFailException: Invoke of: Run
Source: Microsoft Excel
Description: Cannot run the macro 'TestExcel_copy.xlsmTestMacro'. The macro may not be available in this workbook or all macros may be disabled.
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 TestJacob.callExcelMacro(TestJacob.java:38)
at TestJacob.main(TestJacob.java:16)
Я также включил макросы в файл Excel, выполнив следующие действия.
- Файл-> Параметры
- Центр управления безопасностью-> Настройки центра управления безопасностью
- Настройки макроса
- Включено "Включить все макросы" и "Доверительный доступ к объектной модели проекта VBA"
- нажмите "ОК"
3 ответа
Вам нужно изменить ваш макрос вызова на
Variant result = Dispatch.call(excel, "Run", new Variant("\'"+file.getName()+"\'"+ macroName));
потому что внутри excel имя файла находится в кавычках, поэтому он не находит имя вашего макроса без "\"
Если быть точным:
Dispatch.call(excel, "Run", new Variant("\'"+file.getName()+"\'!" + macroName));
Не нужно добавлять file.getname() при вызове макроса. Достаточно только макронамена.
использование
Variant result = Dispatch.call(excel, "Run", new Variant(macroName));