首页 > 解决方案 > 如何从java中的excel单元格中提取公式来识别cmd函数?

问题描述

这是问题的简要说明。

我正在努力识别具有 CMD 功能的 excel 文件,例如 "=cmd|'/C calc'!A0" 用于安全过滤。我们目前必须使用 Java 来解析这些文件。

我使用了以下两种方法:

  1. 阿帕奇 POI。我可以将 excel 解析为工作簿并获取每个单元格的值。我在这里面临的问题是我们得到的单元格已经被评估,似乎没有办法检查单元格是否以“cmd”开头
  2. 蒂卡。它在这里类似。我能够获取元数据,但是当尝试使用处理程序来获取 excelt 文件的测试时,它更像是 !#REF,这不是我们需要的。

有没有人有一些建议我该怎么做?这真的很有帮助。

谢谢你。

标签: javaexcelsecurityapache-poiapache-tika

解决方案


我确实找到了一个精心设计的解决方案,我使用上面链接的 stackoverflow 来使用它。它同时处理 XSSF 和 HSSF。

            if (workbook instanceof XSSFWorkbook) {
                XSSFWorkbook xssfWorkbook = (XSSFWorkbook) workbook;
                List<ExternalLinksTable> externalLinks = xssfWorkbook.getExternalLinksTable();
                for (ExternalLinksTable linksTable : externalLinks) {
                    if (linksTable.getCTExternalLink().isSetDdeLink()) {
                        return false;
                    }
                }
            } else {
                HSSFWorkbook hssfWorkbook = (HSSFWorkbook) workbook;
                Set<String> references = getWorkbookReferences(hssfWorkbook);
                if (containsStartsWithSubString(references, "cmd")) {
                    return false;
                }
            }


    private Set<String> getWorkbookReferences (HSSFWorkbook wb)
    {
        Set<String> references = new HashSet<>();
        InternalWorkbook internalWorkbook = wb.getInternalWorkbook();
        int extSheetIdx = 0;
        while (internalWorkbook.getExternalSheet(extSheetIdx) != null) {
            EvaluationWorkbook.ExternalSheet extSheet =
                internalWorkbook.getExternalSheet(extSheetIdx++);
            references.add(extSheet.getWorkbookName());

            // fail safe.
            if (extSheetIdx > maxExterLinks) {
                return references;
            }
        }

        return references;
    }

欢迎任何建议!

不幸的是,我仍在研究如何识别 Word 文档:)


推荐阅读