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

问题描述 投票:0回答:3

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

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

java excel excel-vba vba
3个回答
0
投票

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


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,并添加一个像上一个关系的新关系。然后,您必须将宏二进制文件打包到xl目录中,styles.xmlworkbook.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"/>

我认为就是这样。


0
投票

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.