如何在java中从excel单元格中提取公式来识别cmd函数?
下面是问题的简要说明 我正在识别具有CMD函数的excel文件,例如用于安全筛选的“=CMD |'/C calc'!A0”。 我们目前必须使用Java来解析这些文件 我使用了以下两种方法:如何在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文件的测试时,它更像#这不是我们需要的 有没有人对我该怎么做有什么建议?这
谢谢。我确实找到了一个精心设计的解决方案,我使用了上面链接的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
以及fprHSSF
@AxelRichter的单元格公式字符串(不带前导=
),是的。似乎POI以一种奇怪的方式转换了它,我不明白是什么。与“=cmd |'/C calc'!A0”类似,对于XSSF,它将getCellForumla返回为“[0]!A0!”,对于HSSF,它将返回为“A0”。。。这不是直觉,我确实发现了这一点:这很有帮助。但不幸的是,这对HSSF工作簿格式没有帮助。您试过了吗?这将使您得到XSSF
以及fprHSSF
@AxelRichter的单元格公式字符串(不带前导=
),是的。似乎POI以一种奇怪的方式转换了它,我不明白是什么。与“=cmd |'/C calc'!A0”类似,对于XSSF,它将getCellForumla返回为“[0]!A0!”,对于HSSF,它将返回为“A0”。。。哪一个不是intuitive@AxelRichter这就是我最后的结局。感谢您在上一篇文章中的解答!我仍然在研究DDE的MS Word检测,我想:)@AxelRichter这就是我最终得到的结果。谢谢你在上一篇文章中的解答