poi Excel操作之保存图片

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;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值