我有一个名为“process”的宏,它可以处理我的工作表中的所有处理工作。我希望我的使用Apache POI的Java代码调用此宏,以便它可以替我处理工作表。如何在Java中调用Apache POI中的宏?请注意:我正在使用import org.apache.poi.ss.usermodel in Apache POI。请提供示例代码。(我对Apache POI和Java本身都很陌生。)
我认为这是不可能的。POI是一个用于读取/编辑Office文件的库,宏是另一种完全不同的东西。你需要在POI中实现Visual Basic for Applications解释器才能完成这个任务。已经存在于Excel工作簿中的宏将被保留,但你不能添加新的宏或调用现有的宏。
您可以使用其他工具,例如com4j。我今天刚刚创建了一个POC,并且效果非常好。只需按照以下步骤操作:
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();
Further examples: com4j tutorials
有一个小技巧可以做到这一点,那就是让你的宏在工作簿打开时自动运行。这可以通过在ThisWorkbook模块中使用vba来实现。
然后,你可以使用Desktop.getDesktop().open(new File(filePath));
打开Excel,并使用apache POI和FileInputStream获取“process”的结果。