POI获取逐行获取所有图片,以及所在行左侧的名字

首先说下格式,如下图: 

POI获取逐行获取所有图片,以及所在行左侧的名字


我现在的需求是 要将左侧的文字作为 右侧图片的名字,如果图片多张则需要区分,举例: A2行的图片,起名为 A2_1 A2_2 A2_3 A2_4; 而第一行的则是左侧的文字即可,举例:A1。如需要改动根据个人需要改即可。

本人搞了大半天终于搞定了,啥也不说了,上代码。

----------------------------------------------------------------------------------------------------

package cn;


import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;


import org.apache.poi.hssf.usermodel.HSSFClientAnchor;
import org.apache.poi.hssf.usermodel.HSSFPicture;
import org.apache.poi.hssf.usermodel.HSSFPictureData;
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.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;


public class T1_2 {
public static void main(String[] args) throws FileNotFoundException, IOException {
HSSFWorkbook wb = new HSSFWorkbook(new FileInputStream("C:\\Users\\Administrator\\Desktop\\t3.xls")); 
//获取图片map
Map<Integer, List<HSSFPictureData>> pics = getPicMap(wb);
//获取名字Map
Map<Integer,String> texts = getText(wb);
//文件流
FileOutputStream fos = null;
//得到所有行
Set<Integer> namesKey = texts.keySet();
System.out.println("文本 : "+texts);
System.out.println("图片 : "+pics);
for (Integer key : namesKey) {
//用来解决多张图时起名字的问题
int i = 1;
//根据名字所在行去获取该行有名字的图片
List<HSSFPictureData> list = pics.get(key);
System.out.println(list+"\\\\\\\\\\");
//图片可能为多张,也可能不存在图片
if (list!=null&&list.size()>1) {
for (HSSFPictureData hssfPictureData : list) {
//循环得到改行的每一张图片,并用 变量i来分别图片名字 格式: name_i.jpg
fos = new FileOutputStream("E:\\AA\\"+texts.get(key)+"_"+i+".jpg");
//将此张图片写出,进入下一轮循环
fos.write(hssfPictureData.getData());
fos.close();
//区别名称所需要的变量
i++;
}
}else {
//图片为一张
if(list!=null) {
//直接写出
fos = new FileOutputStream("E:\\AA\\"+texts.get(key)+".jpg");
fos.write(list.get(0).getData());
fos.close();
}
}
}
}

/**
* 获取文字
* key = 文字所在行; value = 文字内容
* @param wb
* @return Map(row,text)
*/
private static Map<Integer,String> getText(HSSFWorkbook wb){

Map<Integer,String>map = new HashMap<Integer, String>();
//得到Excel工作表对象
HSSFSheet sheet = wb.getSheetAt(0);
//得到Excel工作表的行 
for(int i=0;i<=sheet.getPhysicalNumberOfRows();i++) {
// 读取左上端单元格
                 Row row = sheet.getRow(i);
                 // 行不为空
                  if (row != null) {
                     // 获取到Excel文件中的所有的列
                     int cells = row.getPhysicalNumberOfCells();
                     // 遍历列
                     for (int j = 0; j < cells; j++) {
                      // 获取到列的值
                         Cell cell = row.getCell(j);
                         map.put(row.getRowNum(), cell.getStringCellValue());
                 }
             }
}
return map;
}
/**

* 获取图片
* key = 图片所在行 value = 图片对象
* @param workbook
* @return Map(row,image);
*/
private  static Map<Integer, List<HSSFPictureData>> getPicMap(HSSFWorkbook wb) {


Map<Integer, List<HSSFPictureData>> picMap = new HashMap<Integer, List<HSSFPictureData>>();
        List<HSSFPictureData> pictures = wb.getAllPictures();
        HSSFSheet sheet = (HSSFSheet) wb.getSheetAt(0);
        for (HSSFShape shape : sheet.getDrawingPatriarch().getChildren()) {
            HSSFClientAnchor anchor = (HSSFClientAnchor) shape.getAnchor();
            List<HSSFPictureData> list = new ArrayList<>();
            if (shape instanceof HSSFPicture) {
                HSSFPicture pic = (HSSFPicture) shape;
                HSSFPictureData picData = pictures.get(pic.getPictureIndex()-1);
                //如果通过本次获取的行能得到value,说明本行已存在,
                if (picMap.get(anchor.getRow1())!=null) {
                //找到本行的集合
List<HSSFPictureData> list2 = picMap.get(anchor.getRow1());
//将图片存储进去 
list2.add(picData);
//进入下一轮循环
continue;
            }
                //添加本次循环的图片对象
                list.add(picData);
                //将本张图片的行信息作为key存入map,将图片对象作为值存储
                picMap.put(anchor.getRow1(), list);
            } else {
            //非图片数据则插入null
                picMap.put(anchor.getRow1(), null); 
            }
        }
        return picMap;
    }
}