导入相关POI maven
org.apache.poi
poi
4.0.1
org.apache.poi
poi-ooxml
4.0.1
xls和xlsx获取图片方式是不同的所以判断一下后缀
String type = file.getOriginalFilename();
if (type.endsWith(".xls")){
maplist = getPictures1((HSSFSheet) s);
} if (type.endsWith(".xlsx")){
maplist = getPictures2((XSSFSheet) s);
}
获取图片和位置(xls)
public static MapgetPictures1 (HSSFSheet sheet) { Map map = new HashMap (); List list = sheet.getDrawingPatriarch().getChildren(); for (HSSFShape shape : list) { if (shape instanceof HSSFPicture) { HSSFPicture picture = (HSSFPicture) shape; HSSFClientAnchor cAnchor = (HSSFClientAnchor) picture.getAnchor(); PictureData pdata = picture.getPictureData(); String key = cAnchor.getRow1() + "-" + cAnchor.getCol1(); // 行号-列号 map.put(key, pdata); } } return map; }
获取图片和位置(xlsx)
public static MapgetPictures2 (XSSFSheet sheet) { Map map = new HashMap (); List list = sheet.getRelations(); for (POIXMLdocumentPart part : list) { if (part instanceof XSSFDrawing) { XSSFDrawing drawing = (XSSFDrawing) part; List shapes = drawing.getShapes(); for (XSSFShape shape : shapes) { XSSFPicture picture = (XSSFPicture) shape; XSSFClientAnchor anchor = picture.getPreferredSize(); CTMarker marker = anchor.getFrom(); String key = marker.getRow() + "-" + marker.getCol(); map.put(key, picture.getPictureData()); } } } return map; }
xlsx和xls读取的都是sheet全部的图片key存储的是坐标,所以一获取想要获取指定文件传入对应坐标就可以了。因为业务逻辑规定图片只能存储在第一列所以这边只需要传入对应的row就可以了。
PictureData pictureData = maplist.get(rowlenth + "-" + 0);
String path = "";
if (pictureData != null) {
byte[] bytes = pictureData.getData();
InputStream sbs = new ByteArrayInputStream(bytes);
path = uploadImg(sbs);
log.info("头像上传成功,path:"+path);
}
vtCandidate.setIconUploaded(path);
POI中pictureData.getData();方法获取的是byte字节 上传图片是需要讲其转化为InputStream
至此大功告成!!!



