如何从Java中的Excel单元格提取公式以识别cmd函数?

问题描述

这是问题的简要说明。

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

我使用了以下两种方法

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

有人有人建议我该怎么做吗?真的很有帮助。

谢谢。

解决方法

我确实找到了一个精心设计的soln,它使用了上面链接的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文档:)

,

如果单元格中有如下公式,则没有获取单元格完整字符串的选项

SUM(1+1)*cmd|' /C calc'!A0

当我使用 myCell.getCellFormula() 时,结果是 SUM(1+1)*A1,这不是预期的结果。

我想阻止 =cmd|或 cmd|如果在工作表的特定单元格中找到。