我使用Apache-Poi以编程方式创建Excel电子表格,但它不支持添加宏。
有没有办法使用Java将宏添加到电子表格中。我很高兴在Excel中手动创建宏,如果我有一种方法可以导出它,然后以编程方式导入/添加到新的电子表格但不知道是否有办法做这样的事情。
答案 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,并添加一个新关系,如最后一个。然后,您必须将宏二进制文件打包到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"/>
我认为这就是全部。
答案 2 :(得分:0)
以编程方式不支持此功能。一种方法是使用模板文件创建excel。这可以通过Apache POI或JExcel库来完成。您可以使用lib打开文档,修改并将其另存为新文件。
Apache POI显然给它的limitation无法创建宏。
Jexcel link还指出您无法创建宏,但可以从模板中复制。