如何使用Java以编程方式将宏添加到Excel电子表格中

时间:2018-03-02 14:31:12

标签: java excel excel-vba vba

我使用Apache-Poi以编程方式创建Excel电子表格,但它不支持添加宏。

有没有办法使用Java将宏添加到电子表格中。我很高兴在Excel中手动创建宏,如果我有一种方法可以导出它,然后以编程方式导入/添加到新的电子表格但不知道是否有办法做这样的事情。

3 个答案:

答案 0 :(得分:0)

我认为这还不可用。最好的解决方案是手动创建一个空的工作簿,并在其中手动编写宏,然后将此工作簿保存为模板。然后,只要您将来的工作簿需要此宏,只需使用此现有工作簿而不是启动临时工作簿,您将发现您的宏也已在此工作簿中附加并启用。希望这是有道理的!

答案 1 :(得分:0)

嗯,我还没有尝试过(尝试类似的事情,但取得了一些成功)。但您可以尝试一下:查看xlsm文档中的workbook.xml.rels文件,您可以找到以下内容:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Relationships xmlns="http://schemas.openxmlformats.org/package/2006/relationships">
    <Relationship Id="rId3" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/styles" Target="styles.xml"/>
    <Relationship Id="rId2" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/theme" Target="theme/theme1.xml"/>
    <Relationship Id="rId1" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/worksheet" Target="worksheets/sheet1.xml"/>
    <Relationship Id="rId4" Type="http://schemas.microsoft.com/office/2006/relationships/vbaProject" Target="vbaProject.bin"/>
</Relationships>

注意最后一个关系:那是宏文件( vbaProject ) 因此,您可以提取关系包并编辑此特定XML,并添加一个新关系,如最后一个。然后,您必须将宏二进制文件打包到xlstyles.xml所在的workbook.xml目录中。我认为那样做会。

对于第一部分,虽然您在Apache POI中有方法,如document.getRelations()RelationPart.addReation(...)和其他类似的方法,但在我看来,它们打算用于XML文档部分,这是不是宏的情况。因此,您可以使用Java ZipInputStream和ZipEntry util库,提取名为workbook.xml.rels的XML文件,构建如下的XML文档:

DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder();
org.w3c.dom.Document xmlDoc = documentBuilder.parse(WORKBOOK.XML.RELS_INPUT_STREAM);
//INSERT HERE SOME LOGIC TO ADD THE DESIRED Relationship NODE

Transformer transformer = TransformerFactory.newInstance().newTransformer();
Result output = new StreamResult(SOME_OUTPUT_STREAM);
Source input = new DOMSource(xmlDoc);
transformer.transform(input, output);

然后在oder中操作Zip文件以包含您已从实际的启用宏的电子表格中提取的vbaProject.bin文件。

很高兴听到你的成功!

干杯

修改 您可能还想编辑[Content_Types] .xml文件,以包含bin内容类型的vbaProject扩展名,以防它尚未存在:

<Default Extension="bin" ContentType="application/vnd.ms-office.vbaProject"/>

我认为这就是全部。

答案 2 :(得分:0)

以编程方式不支持此功能。一种方法是使用模板文件创建excel。这可以通过Apache POI或JExcel库来完成。您可以使用lib打开文档,修改并将其另存为新文件。

Apache POI显然给它的limitation无法创建宏。

Jexcel link还指出您无法创建宏,但可以从模板中复制。