我使用Apache-Poi以编程方式创建Excel电子表格,但它不支持添加宏。
有没有办法使用Java将宏添加到电子表格中。我很高兴在Excel中手动创建宏,如果有一种方法我可以导出它,然后以编程方式导入/添加到新的电子表格但不知道是否有办法做这样的事情。
我认为这还没有。最好的解决方案是手动创建一个空的工作簿,并在其中手动编写宏,然后将此工作簿保存为模板。然后,只要您将来的工作簿需要此宏,只需使用此现有工作簿而不是启动临时工作簿,您将发现您的宏也已在此工作簿中附加并启用。希望这是有道理的!
好吧,我还没有尝试过(尽管尝试了类似的东西,但取得了一些成功)。但是你可以尝试一下:查看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.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"/>
我认为就是这样。
这不是以编程方式支持的。一种方法是使用模板文件创建excel。这可以通过Apache POI或JExcel库来完成。您可以使用lib打开文档,修改并将其另存为新文件。
Apache POI显然给它的limitation无法创建宏。
Jexcel link还指出您无法创建宏,但可以从模板中复制。