使用 Apache POI 将文件嵌入到 Excel 中的 XSSF 工作表中

2024-04-09

我已经发现奇异鸟翼 https://stackoverflow.com/users/2066598/kiwiwings answer https://stackoverflow.com/a/17757439/63436关于如何使用 Apache POI 将文件嵌入到 Excel 中的问题,但不幸的是,他的答案仅涵盖 HSSF 电子表格(XLS 格式),而我们目前正在使用新的 XSSF 格式(XLSX),针对 HSSF 电子表格提出的解决方案将不行。我尝试移植它,但棺材上的最后一颗钉子来自于 XSSF 世界中没有 HSSFObjectData 等效项这一事实。

这就是我到目前为止所做的 - 我找到了一种将文件附加到 Excel 文件的方法。这段代码的作用是:

private PackagePart packageNotebook(
    final OPCPackage pkg,
    final String notebookTable,
    final String taskId,
    final String notebookName,
    final byte[] contents
) throws InvalidFormatException, IOException
{
    final PackagePartName partName =
        PackagingURIHelper.createPartName( "/notebook/" + notebookTable + "/" + taskId + "/" + notebookName );
    pkg.addRelationship( partName, TargetMode.INTERNAL, PackageRelationshipTypes.CUSTOM_XML );
    final PackagePart part = pkg.createPart( partName, "text/xml" );
    IOUtils.write( contents, part.getOutputStream() );

    return part;
}

我还能够创建我想要用作 Excel 文件中的锚点的图像。然而,我无法做的是将该图像“链接”到嵌入的内容,正如 kiwiwings 在他的回复中所做的那样。

我的最终目标是拥有一个包含嵌入对象的 XLSX Excel 文件,这样用户就可以双击我在单元格中打开的锚点,然后能够编辑该文件,就像您所做的那样使用 Excel 客户端嵌入文件。

有人有关于如何做到这一点的有效示例吗?


我已经通过应用了补丁#60586 https://bz.apache.org/bugzilla/show_bug.cgi?id=60586,因此嵌入现在更加容易。以下片段摘自相应的JUnit测试 https://svn.apache.org/viewvc/poi/trunk/poi-ooxml/src/test/java/org/apache/poi/ss/tests/usermodel/TestEmbedOLEPackage.java?view=markup.

Workbook wb1 = new XSSFWorkbook();
Sheet sh = wb1.createSheet();
int picIdx = wb1.addPicture(getSamplePng(), Workbook.PICTURE_TYPE_PNG);
byte samplePPTX[] = getSamplePPT(true);
int oleIdx = wb1.addOlePackage(samplePPTX, "dummy.pptx", "dummy.pptx", "dummy.pptx");

Drawing<?> pat = sh.createDrawingPatriarch();
ClientAnchor anchor = pat.createAnchor(0, 0, 0, 0, 1, 1, 3, 6);
pat.createObjectData(anchor, oleIdx, picIdx);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 Apache POI 将文件嵌入到 Excel 中的 XSSF 工作表中 的相关文章

随机推荐