Как вызвать макрос из библиотеки Apache POI на Java?

У меня есть :

  • Процесс с именем макроса, который выполняет всю работу по обработке моих рабочих листов.

  • Я хочу, чтобы мой Java-код, использующий Apache POI, вызывал этот макрос, чтобы он мог обрабатывать листы для меня.

  • Как я могу вызвать макрос в Apache POI на Java?

:: Примечание ::

  • Я использую import org.apache.poi.ss.usermodel в Apache POI.

  • Пожалуйста, дайте пример кода. (Я новичок в Apache POI и самой Java.)


person Yugal Jindle    schedule 04.08.2011    source источник


Ответы (4)


Я не думаю, что это возможно. POI — это библиотека для чтения/редактирования файлов Office, макросы — совсем другое дело. Для этого вам придется внедрить интерпретатор Visual Basic for Applications в POI. Макросы, которые уже есть в вашей книге Excel, сохраняются, но вы не можете добавлять новые или вызывать существующие.

person Jacob    schedule 04.08.2011
comment
У меня уже есть макрос в моем файле, который я редактирую. Я просто хочу выполнить макрос с Java POI! - person Yugal Jindle; 04.08.2011
comment
Обратите внимание, что текущая версия POI поддерживает обычные функции Excel. - person parasietje; 02.08.2012
comment
И если вы хотите выполнить макрос VBA, вам придется использовать OpenOffice или Microsoft Excel. Вы можете привязываться к OpenOffice, используя их интерфейс UNO, и к Microsoft Excel, используя COM (см. JACOB для Java-библиотеки COM). - person parasietje; 02.08.2012

Вы можете использовать другой инструмент, например com4j. Я создал POC только сегодня и работает как шарм. Просто выполните следующие действия:

  1. Загрузите последнюю версию здесь
  2. Используя Apache Ant, создайте образец: samples\excel
  3. Используя код, сгенерированный tlbimp (это всего лишь часть com4j), создайте небольшое приложение и напишите такой код:

    // Starts excel and open an existing workbook
    _Application app = ClassFactory.createApplication();
    app.setVisible(0, true);
    _Workbook wb = app.getWorkbooks().open("c:\\test.xlsx", null, null, null, null, null, null, null,
            null, null, null, null, null, null, null, 0);
    
    // run a macro
    Variant macro = new Variant(Variant.Type.VT_BSTR);
    macro.set("my_macro");
    wb.getApplication().run(macro, null, null, null, null, null, null, null, null, null, null, null,
            null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
            null, null, null, null);
    
    // Save the excel file and quit
    Variant saveBeforeExit = new Variant(Variant.Type.VT_BOOL);
    saveBeforeExit.set(1);
    wb.close(saveBeforeExit, Variant.getMissing(), Variant.getMissing(), 0);
    app.quit();
    
  4. Дополнительные примеры: руководства по com4j.

person Hállisson    schedule 26.09.2012
comment
Это действительно полезно? Кто-нибудь подтверждает это? - person Eugene Hoza; 31.07.2013
comment
блин, количество нулевых параметров меня обеспокоило. - person testuserx; 04.02.2019

Я думаю, вы не можете.

Макросы

Макросы создавать нельзя. Однако чтение и перезапись файлов, содержащих макросы, безопасно сохранят макросы.

Ограничения Apache POI

person ksimon    schedule 04.08.2011
comment
У меня уже есть макрос в моем файле, который я редактирую. Я просто хочу выполнить макрос с Java POI! - person Yugal Jindle; 04.08.2011
comment
Неоднократное провозглашение цели не приведет к тому, что она произойдет волшебным образом. - person Ben; 19.05.2014

Один небольшой хитрый способ сделать это — заставить ваши макросы запускаться автоматически при открытии рабочей книги. Это можно сделать с помощью vba в модуле ThisWorkbook. Затем вы можете открыть Excel с помощью Desktop.getDesktop().open(new File(filePath));, а с помощью apache POI и FileInputStream просто получить результат 'process' .

person Hercules270    schedule 08.03.2021