poi 读取excel中的图片,并获取图片做业务处理

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.apache.poi.POIXMLDocumentPart;
import org.apache.poi.hssf.usermodel.HSSFClientAnchor;
import org.apache.poi.hssf.usermodel.HSSFPicture;
import org.apache.poi.hssf.usermodel.HSSFShape;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.PictureData;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.usermodel.XSSFClientAnchor;
import org.apache.poi.xssf.usermodel.XSSFDrawing;
import org.apache.poi.xssf.usermodel.XSSFPicture;
import org.apache.poi.xssf.usermodel.XSSFShape;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.openxmlformats.schemas.drawingml.x2006.spreadsheetDrawing.CTMarker;

/**
 * @version:V1.0
 * @Description:  读取EXCEL 文件后 将图片写出(得到图片后,可按照自己业务逻辑进行处理)
 * @author: LiGuoWei
 * @date: 2019年1月21日下午4:10:37
 */
public class ExcelImg {

    public static void getDataFromExcel(String filePath) throws IOException
    {
       
        //判断是否为excel类型文件
        if(!filePath.endsWith(".xls")&&!filePath.endsWith(".xlsx"))
        {
            System.out.println("文件不是excel类型");
        }
        
        FileInputStream fis =null;
        Workbook wookbook = null;
        Sheet sheet =null;
        try
        {
            //获取一个绝对地址的流
              fis = new FileInputStream(filePath);
        }
        catch(Exception e)
        {
            e.printStackTrace();
        }
       
        try 
        {
            //2003版本的excel,用.xls结尾
            wookbook = new HSSFWorkbook(fis);//得到工作簿
             
        } 
        catch (Exception ex) 
        {
            //ex.printStackTrace();
            try
            {
                //2007版本的excel,用.xlsx结尾
                 fis = new FileInputStream(filePath);
                wookbook = new XSSFWorkbook(fis);//得到工作簿
            } catch (IOException e)
            {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
        

        Map<String, PictureData>  maplist=null;
              
        sheet = wookbook.getSheetAt(0);  
            // 判断用07还是03的方法获取图片  
        if (filePath.endsWith(".xls")) {  
            maplist = getPictures1((HSSFSheet) sheet);  
        } else if(filePath.endsWith(".xlsx")){  
            maplist = getPictures2((XSSFSheet) sheet);  
        }  
        try {
            printImg(maplist);
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }  
    }

      /**
       * 获取图片和位置 (xls)
       * @param sheet
       * @return
       * @throws IOException
       */
      public static Map<String, PictureData> getPictures1 (HSSFSheet sheet) throws IOException {
            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)
       * @param sheet
       * @return
       * @throws IOException
       */
      public static Map<String, PictureData> getPictures2 (XSSFSheet sheet) throws IOException {
          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;
      }
      //图片写出
      public static void printImg(Map<String, PictureData> sheetList) throws IOException {  
        
            //for (Map<String, PictureData> map : sheetList) {  
                Object key[] = sheetList.keySet().toArray();  
                for (int i = 0; i < sheetList.size(); i++) {  
                    // 获取图片流  
                    PictureData pic = sheetList.get(key[i]);  
                    // 获取图片索引  
                    String picName = key[i].toString();  
                    // 获取图片格式  
                    String ext = pic.suggestFileExtension();  
                      
                    byte[] data = pic.getData();  
                     
              //图片保存路径 
                    FileOutputStream out = new FileOutputStream("D:\\img\\pic" + picName + "." + ext);  
                    out.write(data);  
                    out.close();  
                }  
           // }  
              
        }  


      //执行 测试 。图片保存到 D:\\img 就算成功 
      
      public static void main(String[] args) throws Exception {
                getDataFromExcel("D:"+ File.separator +"materialTemplate.xlsx");
                
      }               

      
    
}
 

猜你喜欢

转载自blog.csdn.net/qq_36457575/article/details/86594577
今日推荐