导入相关POI maven
<!--poi-->
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>4.0.1</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>4.0.1</version>
</dependency>
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 Map<String, PictureData> getPictures1 (HSSFSheet sheet) {
Map<String, PictureData> map = new HashMap<String, PictureData>();
List<HSSFShape> 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 Map<String, PictureData> getPictures2 (XSSFSheet sheet) {
Map<String, PictureData> map = new HashMap<String, PictureData>();
List<POIXMLDocumentPart> list = sheet.getRelations();
for (POIXMLDocumentPart part : list) {
if (part instanceof XSSFDrawing) {
XSSFDrawing drawing = (XSSFDrawing) part;
List<XSSFShape> 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
至此大功告成!!!