如何在Java中从Apache POI库调用宏?

9
我有一个名为“process”的宏,它可以处理我的工作表中的所有处理工作。我希望我的使用Apache POI的Java代码调用此宏,以便它可以替我处理工作表。如何在Java中调用Apache POI中的宏?请注意:我正在使用import org.apache.poi.ss.usermodel in Apache POI。请提供示例代码。(我对Apache POI和Java本身都很陌生。)
4个回答

11

我认为这是不可能的。POI是一个用于读取/编辑Office文件的库,宏是另一种完全不同的东西。你需要在POI中实现Visual Basic for Applications解释器才能完成这个任务。已经存在于Excel工作簿中的宏将被保留,但你不能添加新的宏或调用现有的宏。


我已经在编辑的文件中有宏。我只想用Java POI执行宏! - Yugal Jindle
1
请注意,当前版本的POI支持常规Excel函数。 - parasietje
如果你想执行一个VBA宏,你要么得使用OpenOffice,要么得使用Microsoft Excel。你可以使用他们的UNO接口来绑定OpenOffice,使用COM(参见JACOB for a COM java library)来绑定Microsoft Excel。 - parasietje

6

您可以使用其他工具,例如com4j。我今天刚刚创建了一个POC,并且效果非常好。只需按照以下步骤操作:

  1. Download the last version here
  2. Using Apache Ant build the sample: samples\excel
  3. With the code generated by tlbimp (it is just a part of com4j), create a small app and write a code like:

    // 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. Further examples: com4j tutorials


3
这真的有帮助吗?有人证实了吗? - Eugene Hoza
9
该死,空参数的数量让我感到焦虑。 - testuserx

5
我觉得你不行。

无法创建宏。但是,读取和重写包含宏的文件将安全地保留宏。
Apache POI 限制 Apache POI Limitations

我已经在编辑的文件中有宏。我只想使用Java POI执行宏! - Yugal Jindle
19
反复表达你的目标并不能使它神奇地实现。 - Ben

0

有一个小技巧可以做到这一点,那就是让你的宏在工作簿打开时自动运行。这可以通过在ThisWorkbook模块中使用vba来实现。 然后,你可以使用Desktop.getDesktop().open(new File(filePath));打开Excel,并使用apache POI和FileInputStream获取“process”的结果。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接