最近公司要通过表格导入有图片的多行试题数据,发现网上都是导出图片到excel,对于导入图片的资料较少,且很多教程用不了,特此记录分享,让各位道友减少查找资料时间。
一、POI使用模版进行图片导入
1、先用excel创建一个导入模版
注意excel的列是从下标0开始的,我这表格前面有空一列。
如下第四列是图片:
2、导入excel,获得图片位置通用方法
下面两个是xlsx和xls表格的通用方法,复制到项目里即可
如果出现无法导入类,请查看是否有导入POI依赖,本次使用的POI版本是3.9版本。
/**
* 这是.xlsx文件拿到图片位置通用方法
*/
public static Map<String, List<PictureData>> getXlsxPictures(XSSFSheet sheet) throws IOException {
Map<String, List<PictureData>> map = new HashMap<>();
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();
List<PictureData> pictureDatas = map.get(key);
if (CollectionUtils.isEmpty(pictureDatas)) {
List<PictureData> newList = Lists.newArrayList();
newList.add(picture.getPictureData());
map.put(key, newList);
} else {
pictureDatas.add(picture.getPictureData());
}
}
}
}
return map;
}
/**
* 这是.xls文件拿到图片位置通用方法
*/
public static Map<String, List<PictureData>> getXlsPictures(HSSFSheet sheet) throws IOException {
Map<String, List<PictureData>> map = new HashMap<>();
List<HSSFShape> hapelList = sheet.getDrawingPatriarch().getChildren();
for (HSSFShape shape : hapelList) {
if (shape instanceof HSSFPicture) {
HSSFPicture picture = (HSSFPicture) shape;
HSSFClientAnchor cAnchor = (HSSFClientAnchor) picture.getAnchor();
PictureData pdata = picture.getPictureData();
// 行号-列号
String key = cAnchor.getRow1() + "-" + cAnchor.getCol1();
List<PictureData> pictureDatas = map.get