问题描述
这是问题的简要说明。
我正在努力识别具有CMD功能(例如“ = cmd |'/ C calc'!A0”)的excel文件,以进行安全过滤。 当前,我们必须使用Java来解析这些文件。
我使用了以下两种方法:
- Apache POI。我可以将Excel解析为工作簿,并获取每个单元格值。我在这里面临的问题是我们获得的单元格已经过评估,似乎没有办法检查单元格是否以“ cmd”开头
- 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|如果在工作表的特定单元格中找到。