如何在java中从excel单元格中提取公式来识别cmd函数?

如何在java中从excel单元格中提取公式来识别cmd函数?,java,excel,security,apache-poi,apache-tika,Java,Excel,Security,Apache Poi,Apache Tika,下面是问题的简要说明 我正在识别具有CMD函数的excel文件,例如用于安全筛选的“=CMD |'/C calc'!A0”。 我们目前必须使用Java来解析这些文件 我使用了以下两种方法: 阿帕奇波伊。我可以将excel解析为工作簿,并获取每个单元格的值。我现在面临的问题是,我们得到的单元格已经计算过了,似乎没有办法检查单元格是否以“cmd”开头 蒂卡。这里也差不多。我能够获取元数据,但是当尝试使用处理程序获取excelt文件的测试时,它更像#这不是我们需要的 有没有人对我该怎么做有什么建议?这

下面是问题的简要说明

我正在识别具有CMD函数的excel文件,例如用于安全筛选的“=CMD |'/C calc'!A0”。 我们目前必须使用Java来解析这些文件

我使用了以下两种方法:

  • 阿帕奇波伊。我可以将excel解析为工作簿,并获取每个单元格的值。我现在面临的问题是,我们得到的单元格已经计算过了,似乎没有办法检查单元格是否以“cmd”开头
  • 蒂卡。这里也差不多。我能够获取元数据,但是当尝试使用处理程序获取excelt文件的测试时,它更像#这不是我们需要的
  • 有没有人对我该怎么做有什么建议?这真的很有帮助


    谢谢。

    我确实找到了一个精心设计的解决方案,我使用了上面链接的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;
        }
    
    if(XSSF工作簿的工作簿实例){
    XSSFWorkbook XSSFWorkbook=(XSSFWorkbook)工作簿;
    List externalLinks=xssf工作簿.getExternalLinksTable();
    for(ExternalLinksTable链接稳定:externalLinks){
    if(linksTable.getCTExternalLink().isSetDdeLink()){
    返回false;
    }
    }
    }否则{
    HSSF工作簿HSSF工作簿=(HSSF工作簿)工作簿;
    设置引用=getWorkbookReferences(hssfWorkbook);
    if(包含startswithsubstring(引用“cmd”)){
    返回false;
    }
    }
    专用集getWorkbookReferences(HSSF工作簿wb)
    {
    Set references=newhashset();
    InternalWorkbook InternalWorkbook=wb.getInternalWorkbook();
    int extSheetIdx=0;
    while(internalWorkbook.getExternalSheet(extSheetIdx)!=null){
    EvaluationWorkbook.ExternalSheet extSheet=
    getExternalSheet(extSheetIdx++);
    add(extSheet.getWorkbookName());
    //故障保险。
    如果(extSheetIdx>maxExterLinks){
    返回引用;
    }
    }
    返回引用;
    }
    
    欢迎提出任何建议


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

    我确实找到了一个详细的解决方案,我使用了上面链接的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;
        }
    
    if(XSSF工作簿的工作簿实例){
    XSSFWorkbook XSSFWorkbook=(XSSFWorkbook)工作簿;
    List externalLinks=xssf工作簿.getExternalLinksTable();
    for(ExternalLinksTable链接稳定:externalLinks){
    if(linksTable.getCTExternalLink().isSetDdeLink()){
    返回false;
    }
    }
    }否则{
    HSSF工作簿HSSF工作簿=(HSSF工作簿)工作簿;
    设置引用=getWorkbookReferences(hssfWorkbook);
    if(包含startswithsubstring(引用“cmd”)){
    返回false;
    }
    }
    专用集getWorkbookReferences(HSSF工作簿wb)
    {
    Set references=newhashset();
    InternalWorkbook InternalWorkbook=wb.getInternalWorkbook();
    int extSheetIdx=0;
    while(internalWorkbook.getExternalSheet(extSheetIdx)!=null){
    EvaluationWorkbook.ExternalSheet extSheet=
    getExternalSheet(extSheetIdx++);
    add(extSheet.getWorkbookName());
    //故障保险。
    如果(extSheetIdx>maxExterLinks){
    返回引用;
    }
    }
    返回引用;
    }
    
    欢迎提出任何建议


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

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

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

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


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

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

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

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


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

    我确实发现了这一点:这很有帮助。但不幸的是,这对HSSF工作簿格式没有帮助。您试过了吗?这将使您得到
    XSSF
    以及fpr
    HSSF
    @AxelRichter的单元格公式字符串(不带前导
    =
    ),是的。似乎POI以一种奇怪的方式转换了它,我不明白是什么。与“=cmd |'/C calc'!A0”类似,对于XSSF,它将getCellForumla返回为“[0]!A0!”,对于HSSF,它将返回为“A0”。。。这不是直觉,我确实发现了这一点:这很有帮助。但不幸的是,这对HSSF工作簿格式没有帮助。您试过了吗?这将使您得到
    XSSF
    以及fpr
    HSSF
    @AxelRichter的单元格公式字符串(不带前导
    =
    ),是的。似乎POI以一种奇怪的方式转换了它,我不明白是什么。与“=cmd |'/C calc'!A0”类似,对于XSSF,它将getCellForumla返回为“[0]!A0!”,对于HSSF,它将返回为“A0”。。。哪一个不是intuitive@AxelRichter这就是我最后的结局。感谢您在上一篇文章中的解答!我仍然在研究DDE的MS Word检测,我想:)@AxelRichter这就是我最终得到的结果。谢谢你在上一篇文章中的解答