poi Excel操作之保存图片
1,分析:
首先,Excel的文字数据和图片数据是分隔开来的,因此处理图片是需要和文字分开处理的(注意,此处我处理的是xlsx格式的Excel文件)。
2,代码示例:
public static void main(String[] args) throws Exception {
File file = new File("D:\\Excel\\示例文件.xlsx");
String name = file.getName();
FileInputStream is = new FileInputStream(file);
Workbook workbook = getWorkbook(name, is);
Sheet sheet = workbook.getSheetAt(0);//处理第一张sheet
//得到以行为key的,以存放图片文件的list为value的map值
Map<String,ArrayList<PictureData>> map=getSheetPictrues(sheet.getSheetName(),workbook);
for(String key:map.keySet()){
ArrayList<PictureData> picList = map.get(key);
for(PictureData pic:picList){
//拼接文件的保存路径
String img="D:\\img"+ File.separator +UUID.randomUUID()+"."+pic.suggestFileExtension();
//保存图片
FileOutputStream out = new FileOutputStream(img);
out.write(pic.getData());
out.close();
}
}
}
public static Workbook getWorkbook(String fileName, InputStream is) throws Exception {
Workbook workbook = null;
try {
/** 判断文件的类型,是2003还是2007 */
boolean isExcel2003 = true;
if (WDWUtil.isExcel2007(fileName)) {
isExcel2003 = false;
}
if (isExcel2003) {
workbook = new HSSFWorkbook(is);
} else {
workbook = new XSSFWorkbook(is);
}
} catch (Exception e) {
throw e;
}
return workbook;
}
/**
* @Description: 解析Excel的sheet图片数据,返回以行为key的,以存放图片文件的list为value的map值
*/
public static Map<String,ArrayList<PictureData>> getSheetPictrues(String sheetName,Workbook workbook) throws Exception {
Map<String,ArrayList<PictureData>> map=new HashMap<>();
try{
// 判断其兼容版本 调用了判断版本的方法
XSSFSheet sheet= (XSSFSheet) workbook.getSheet(sheetName);
List<POIXMLDocumentPart> relations = sheet.getRelations();
for(POIXMLDocumentPart part:relations){
if(part instanceof XSSFDrawing){
XSSFDrawing drawing = (XSSFDrawing) part;
List<XSSFShape> shapes = drawing.getShapes();
for (XSSFShape shape : shapes) {
XSSFPicture picture = (XSSFPicture) shape;
PictureData pic = picture.getPictureData();
XSSFClientAnchor anchor = picture.getPreferredSize();
CTMarker marker = anchor.getFrom();
// 获取图片格式
String ext = pic.suggestFileExtension();
log.info("行号[{}],单元格[{}],图片格式[{}]", marker.getRow(), marker.getCol(), ext);
ArrayList<PictureData> pictureData = map.get(String.valueOf(marker.getRow()));
if(pictureData!=null){
pictureData.add(pic);
map.put(String.valueOf(marker.getRow()),pictureData);
}else{
ArrayList<PictureData> list = new ArrayList<>();
list.add(pic);
map.put(String.valueOf(marker.getRow()),list);
}
}
}
}
}catch (Exception e){
throw e;
}
return map;
}