gpt4 book ai didi

java - 如何从 excel 文件中提取外部引用列表

转载 作者:行者123 更新时间:2023-11-30 11:12:41 24 4
gpt4 key购买 nike

我正在为(不断增长的)非结构化 excel 文档集合设置一个自动处理系统。该集合包括旧式 .xls 文件和新的 .xlsx 文件。在我基于 Java 的解决方案中,我已经在使用 Apache POI 工具包来分析文档。

我尚未能够解决的一个挑战是如何识别文档之间的链接以便绘制依赖关系图表。我还没有弄清楚如何方便地提取外部引用列表。对于 .xlsx 文件,我有一个解决方法可以解压缩文件,然后打开包含引用的 xml 文件。这可行,但对于大型文档集合来说效率低下,并且也没有为 .xls 文件提供解决方案。

我更喜欢不依赖于 Microsoft Office 或相关库的解决方案,因为该解决方案需要在 Linux 环境中运行。

POI 是否能够以某种方式做到这一点?如果没有,我可以进一步调查的建议库/工具/区域是什么?

最佳答案

最终,我完成了 POI 源代码,并使用反射获取了引用的外部工作簿列表。以下代码经过测试可在 POI 版本 3.11 beta 上运行。

希望在代码中使用此方法的人请注意:因为它处理非公共(public)方法和类,所以它可能会更改并且将来可能会中断。

private LinkedList<String> getWorkbookReferences(HSSFWorkbook wb) {
LinkedList<String> references = new LinkedList<>();

try {
// 1. Get InternalWorkbook
Field internalWorkbookField = HSSFWorkbook.class.getDeclaredField("workbook");
internalWorkbookField.setAccessible(true);
InternalWorkbook internalWorkbook = (InternalWorkbook) internalWorkbookField.get(wb);

// 2. Get LinkTable (hidden class)
Method getLinkTableMethod;
getLinkTableMethod = InternalWorkbook.class.getDeclaredMethod("getOrCreateLinkTable", null);

getLinkTableMethod.setAccessible(true);
Object linkTable = getLinkTableMethod.invoke(internalWorkbook, null);

// 3. Get external books method
Method externalBooksMethod = linkTable.getClass().getDeclaredMethod("getExternalBookAndSheetName", int.class);
externalBooksMethod.setAccessible(true);

// 4. Loop over all possible workbooks
int i = 0;
String[] names;
try {
while( true) {
names = (String[]) externalBooksMethod.invoke(linkTable, i++) ; if (names != null ) {
references.add(names[0]);
}
}
}
catch ( java.lang.reflect.InvocationTargetException e) {
if ( !(e.getCause() instanceof java.lang.IndexOutOfBoundsException) ) {
throw e;
}
}
} catch (NoSuchFieldException | NoSuchMethodException | SecurityException | InvocationTargetException | IllegalAccessException e) {
e.printStackTrace();
}

return references;
}

关于java - 如何从 excel 文件中提取外部引用列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26758099/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com