能力有限,今天一天时间也没有解决这个问题。所以只能绕道而行。
判断是否存在对象。
先贴一下今天尝试的代码。代码执行后,文件变小了,但文件中的对象还是存在。所以毫无办法。坑爹的office
//JAVA导入Excel 报错 java.io.IOException: Zip bomb detected!
ZipSecureFile.setMinInflateRatio(-1.0d);
// 创建XSSF的workbook
XSSFWorkbook book = XSSFWorkbookFactory.createWorkbook(file.getInputStream());
// 这一行没什么用,只是为了看里面方法和值
CTWorksheet ctWorksheet = book.getSheetAt(0).getCTWorksheet();
// 获取画图管理器
XSSFDrawing drawingPatriarch = book.getSheetAt(0).getDrawingPatriarch();
// 这一行也没什么用,因为对象依然存在
book.getSheetAt(0).getPackagePart().clear();
// 没什么用
CTShape ctShape = new CTShapeImpl(ctWorksheet.schemaType());
// 获取XSSFShape列表,就是那些该死的对象。
List shapes = drawingPatriarch.getShapes();
// a、b、c、d、flag、shapeNames都没什么用,只是为了代码执行时,能观察数量和对象名称
int a = 0;
int b = 0;
int c = 0;
int d = 0;
boolean flag = false;
List shapeNames = new ArrayList<>();
for (XSSFShape xssfShape:shapes){
shapeNames.add(xssfShape.getShapeName());
xssfShape.setLineStyle(0);
xssfShape.setLineWidth(0);
// 将对象的三围搞到0.
XSSFClientAnchor anchor = (XSSFClientAnchor) xssfShape.getAnchor();
anchor.setCol1(0);
anchor.setCol2(0);
anchor.setDx1(0);
anchor.setDx2(0);
anchor.setDy1(0);
anchor.setDy2(0);
anchor.setRow1(0);
anchor.setRow2(1);
d++;
}
System.out.println("a:"+a);
System.out.println("b:"+b);
System.out.println("c:"+c);
System.out.println("d:"+d);
System.out.println("flag:"+flag);
System.out.println("对象名称:"+ shapeNames.get(0));
改造后
XSSFWorkbook book = XSSFWorkbookFactory.createWorkbook(file.getInputStream());
XSSFDrawing drawingPatriarch = book.getSheetAt(0).getDrawingPatriarch();
if (drawingPatriarch != null && drawingPatriarch.getShapes().size()>0){
return ApiResult.error("文件中存在隐藏对象,请重新整理。粘贴时,只粘贴文字");
}