注意:此种方法只适用于图片悬浮在单元格之上的图片搜寻!!!

首先导入相关poi的包:

        <dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>3.16</version></dependency>

Apache POI 是用Java编写的免费开源的跨平台的 Java API,Apache POI提供API给Java程式对Microsoft Office格式档案读和写的功能。POI为“Poor Obfuscation Implementation”的首字母缩写,意为“简洁版的模糊实现”。

读取表格内容的程序:

for (int i = 0; i < wookbook.getNumberOfSheets(); i++) {sheet=wookbook.getSheetAt(i);// 判断用07还是03的方法获取图片if(filePath.endsWith(".xls")){maplist=getPictures((HSSFSheet)sheet);}else if(filePath.endsWith(".xlsx")){maplist=getPictures((HSSFSheet)sheet);}printImg(maplist);//获得表头Row rowHead=sheet.getRow(0);if(rowHead.getPhysicalNumberOfCells()!=6){System.out.println("表头的数量不对!");return;}//获得所有数据for(int j=1;j<=sheet.getLastRowNum();j++){//获得第i行对象Row row=sheet.getRow(j);for (short k = 0; k < row.getLastCellNum(); k++) {Cell cell=row.getCell(k);System.out.println(getXCellVal(cell));}}}

读取图片的具体代码:

/*** 获取excel表中的图片* @return* @Param fis 文件输入流* @Param sheetNum Excel表中的sheet编号* @throws IOException* @throws InvalidFormatException* @throws EncryptedDocumentException** //说明Excel中的图片不在单元格内,而是悬浮在单元格之前,采用如下方式读取,* //但要求图片必须放在某个单元格之内也不能压住边框,否则获取的行数会有重复的。*/public Map<String, HSSFPictureData> getPictures (HSSFSheet sheet)  throws  IOException {Map<String, HSSFPictureData> map =  new  HashMap<String, HSSFPictureData>();List<HSSFShape> list = sheet.getDrawingPatriarch().getChildren();for  (HSSFShape shape : list) {if  (shape  instanceof  HSSFPicture) {HSSFPicture picture = (HSSFPicture) shape;HSSFClientAnchor cAnchor = picture.getClientAnchor();HSSFPictureData pdata = picture.getPictureData();String key = cAnchor.getRow1() +  "-"  + cAnchor.getCol1();  // 行号-列号System.out.println(key);map.put(key, pdata);}}return  map;}

读取图片转化为base64:须知图片转成img src格式的图片data:,文本数据
    //data:text/plain,文本数据
    //data:text/html,HTML代码
    //data:text/html;base64,base64编码的HTML代码
    //data:text/css,CSS代码
    //data:text/css;base64,base64编码的CSS代码
    //data:text/JavaScript,Javascript代码
    //data:text/javascript;base64,base64编码的Javascript代码
    //data:image/gif;base64,base64编码的gif图片数据
    //data:image/png;base64,base64编码的png图片数据
    //data:image/jpeg;base64,base64编码的jpeg图片数据
    //data:image/x-icon;base64,base64编码的icon图片数据

public Map<Integer, String> printImg(Map<Integer, HSSFPictureData> sheetList) {result = new HashMap<Integer, String>();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();// 对字节数组Base64编码BASE64Encoder encoder = new BASE64Encoder();// 返回Base64编码过的字节数组字符串Pattern p = Pattern.compile("\\s*|\t|\r|\n");Matcher m = p.matcher(encoder.encode(data).trim());String dest = m.replaceAll("");result.put((Integer) key[i], dest);}return result;}

附上整体代码:全

package com.tan.cn;import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.text.DecimalFormat;
import java.text.SimpleDateFormat;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.apache.poi.EncryptedDocumentException;
import org.apache.poi.hssf.usermodel.*;
import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFCell;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import sun.misc.BASE64Encoder;/*** @Author Tan* @description excel导出工具类* @Date 2019/7/10*/
public class ExcelUtil {private Map<String, HSSFPictureData>  maplist=null;private String val = null;private SimpleDateFormat fmt = new SimpleDateFormat("yyyy-MM-dd"); //日期格式yyyy-mm-ddprivate DecimalFormat df = new DecimalFormat("0");             //数字格式,防止长数字成为科学计数法形式,或者int变为double形式public void getDataFromExcel(String filePath)throws IOException {//判断是否为excel类型文件if(!filePath.endsWith(".xls")&&!filePath.endsWith(".xlsx")){System.out.println("文件不是excel类型");return;}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 blocke.printStackTrace();}}for (int i = 0; i < wookbook.getNumberOfSheets(); i++) {sheet=wookbook.getSheetAt(i);// 判断用07还是03的方法获取图片if(filePath.endsWith(".xls")){maplist=getPictures((HSSFSheet)sheet);}else if(filePath.endsWith(".xlsx")){maplist=getPictures((HSSFSheet)sheet);}printImg(maplist);//获得表头Row rowHead=sheet.getRow(0);if(rowHead.getPhysicalNumberOfCells()!=6){System.out.println("表头的数量不对!");return;}//获得所有数据for (int j = 0; j <= sheet.getLastRowNum(); j++) {//去掉第一行数据,表头if (j == 0) {continue;}//获得第i行对象Row row=sheet.getRow(j);for (short k = 0; k < row.getLastCellNum(); k++) {Cell cell=row.getCell(k);switch (k){case 0: name=getXCellVal(cell);break;}System.out.println(getXCellVal(cell)+"---------"+name+pid);}}}}/*** 获取图片和位置 (xls)** @param sheet* @return* @throws IOException*//*** 获取excel表中的图片* @return* @Param fis 文件输入流* @Param sheetNum Excel表中的sheet编号* @throws IOException* @throws InvalidFormatException* @throws EncryptedDocumentException** //说明Excel中的图片不在单元格内,而是悬浮在单元格之前,采用如下方式读取,* //但要求图片必须放在某个单元格之内也不能压住边框,否则获取的行数会有重复的。*/public Map<String, HSSFPictureData> getPictures (HSSFSheet sheet)  throws  IOException {Map<String, HSSFPictureData> map =  new  HashMap<String, HSSFPictureData>();List<HSSFShape> list = sheet.getDrawingPatriarch().getChildren();for  (HSSFShape shape : list) {if  (shape  instanceof  HSSFPicture) {HSSFPicture picture = (HSSFPicture) shape;HSSFClientAnchor cAnchor = picture.getClientAnchor();HSSFPictureData pdata = picture.getPictureData();String key = cAnchor.getRow1() +  "-"  + cAnchor.getCol1();  // 行号-列号System.out.println(key);map.put(key, pdata);}}return  map;}//图片转成img src格式的图片data:,文本数据//data:text/plain,文本数据//data:text/html,HTML代码//data:text/html;base64,base64编码的HTML代码//data:text/css,CSS代码//data:text/css;base64,base64编码的CSS代码//data:text/JavaScript,Javascript代码//data:text/javascript;base64,base64编码的Javascript代码//data:image/gif;base64,base64编码的gif图片数据//data:image/png;base64,base64编码的png图片数据//data:image/jpeg;base64,base64编码的jpeg图片数据//data:image/x-icon;base64,base64编码的icon图片数据public Map<Integer, String> printImg(Map<Integer, HSSFPictureData> sheetList) {result = new HashMap<Integer, String>();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();// 对字节数组Base64编码BASE64Encoder encoder = new BASE64Encoder();// 返回Base64编码过的字节数组字符串Pattern p = Pattern.compile("\\s*|\t|\r|\n");Matcher m = p.matcher(encoder.encode(data).trim());String dest = m.replaceAll("");result.put((Integer) key[i],"data:image/png;base64,"+dest);}return result;}//图片写出public void printImg(Map<String, HSSFPictureData> 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();File file=new File("D:\\FacePic");if (!file.exists()){file.mkdirs();}File filePic=new File("D:\\FacePic\\pic"+picName+"."+ext);//图片保存路径try {FileOutputStream out= new FileOutputStream(filePic);out.write(data);out.close();} catch (Exception e) {e.printStackTrace();}}}/*** @param cell* @return String 获取单元格中的值* @author: tan 2021-1-25 下午7:40:05*/private String getXCellVal(Cell cell) {switch (cell.getCellType()) {case XSSFCell.CELL_TYPE_NUMERIC:if (DateUtil.isCellDateFormatted(cell)) {val = fmt.format(cell.getDateCellValue()); //日期型} else {val = df.format(cell.getNumericCellValue()); //数字型}break;case XSSFCell.CELL_TYPE_STRING: //文本类型val = cell.getStringCellValue();break;case XSSFCell.CELL_TYPE_BOOLEAN: //布尔型val = String.valueOf(cell.getBooleanCellValue());break;case XSSFCell.CELL_TYPE_BLANK: //空白val = cell.getStringCellValue();break;case XSSFCell.CELL_TYPE_ERROR: //错误val = "错误";break;case XSSFCell.CELL_TYPE_FORMULA: //公式try {val = String.valueOf(cell.getStringCellValue());} catch (IllegalStateException e) {val = String.valueOf(cell.getNumericCellValue());}break;default:val = cell.getRichStringCellValue() == null ? null : cell.getRichStringCellValue().toString();}return val;}}

看完不关注一下?码农不易,且行且珍惜!!!

Java从excel带图片的导入相关推荐

  1. java导出excel带图片_JAVA的poi实现模版导出excel(带图片).doc

    JAVA的poi实现模版导出excel(带图片) 下面是本人使用java的poi实现使用模板到处excel,内容包含图片,使用两种不同的方式实现其到处excel.但是使用jxl实现到处excel只能到 ...

  2. java 导出excel 附带图片

    java 导出excel 附带图片,思路将后台数据里保存的图片url转为file ,添加到excel里导出 代码示例 String imgPath = filePath +item.getFilePa ...

  3. Java实现Excel表格数据的导入(兼容xls与xlsx)

    Java实现Excel表格数据的导入(兼容xls与xlsx) 目录 依赖 代码 注意点 目录 依赖 <!-- 添加POI的依赖用于Excel的操作 --><dependency> ...

  4. poi解析excel中图片(导入试题中图片)

    导入模板如下: 读取图片(03,07兼容):将图片数据(sheet,row,column,data)存到ExcelPicPositionEntity实体类中 ExcelPicPositionEntit ...

  5. Java实现excel大数据量导入

    情景分析: 通常我们通过poi读取excel文件时,若在用户模式下,由于数据量较大.Sheet较多,很容易出现内存溢出的情况 用户模式读取excel的典型代码如下: FileInputStream f ...

  6. java导出excel插入图片

    首项需要的jar包有: 1.poi-3.8-20120326.jar 2.commons-codec-1.10.jar 代码:package com.demo; import java.awt.ima ...

  7. Java发送邮件(带图片和附件)

    如何获取QQ邮箱授权码 package com.jason.mail;import com.sun.mail.util.MailSSLSocketFactory;import javax.activa ...

  8. java实现Excel转图片

    使用 Java 转换 Excel 文件为图片可以使用 Apache POI 库.POI 是一个 Java 库,它可以访问 Microsoft Office 文档格式,包括 Excel. 首先,你需要在 ...

  9. 批量发送邮件(java开发、带图片和附件)

    本程序配置好后可以直接运行,采用javamail1.6 api ,具有如下特点: (1)邮件内容.主题 可以定制,内容可以是富文本,可以带图片和附件 (2)为了避免垃圾邮件拦截,设置为3秒钟一封,每发 ...

  10. java word excel ppt 图片转pdf

    第一步将jar导入mvn库 下载地址 0积分 https://download.csdn.net/download/qq_35908944/18549670 mvn install:install-f ...

最新文章

  1. pytorch利用多个GPU并行计算多gpu
  2. [转] Zend studio中开发常用
  3. WinFrom子窗体向父窗体传值
  4. 实现透明渐变的Activity
  5. javascript箭头函数和this的指向问题
  6. jquery 学习之二 属性---文本 值
  7. 使用选择器语法来查找元素 - 你想使用类似于CSS或jQuery的语法来查找和操作元素...
  8. 【数据库原理及应用】经典题库附答案(14章全)——第十章:数据库完整性
  9. Master PDF Editor_v5.7.00 PDF编辑
  10. php中的DS,PHP Ds\Set reverse()用法及代码示例
  11. 笨办法学 Python · 续 练习 6:`find`
  12. js文件上传不用点击上传按钮自动上传
  13. python中正则表达式_Python中正则表达式详解
  14. Beautiful选择器/遍历文档树Day3-7
  15. tbb::atomic和std::atomic的区别 废弃
  16. 如何长时间保存记忆,分享我的数据备份大法
  17. 中M22春C、Java入门练习( 7-13 后天 )
  18. 都说web前端开发薪资高,入行就有上万月薪,转行难吗?
  19. QT软件开发-基于FFMPEG设计视频播放器-流媒体播放器(五)
  20. 利用windbg简单调试dump文件

热门文章

  1. 管家婆 凭证查找 Date exceeds maximum of 19-12-31 报错解决办法
  2. 用计算机弹让我做你的眼睛,让我做你的眼睛 (改编版)歌词
  3. exe图标修改器和EXE文件打不开了的办法
  4. MessageDigest
  5. 控制系统设计专题(一)——PID控制算法
  6. 基于51单片机的交通灯控制系统设计
  7. Easytrader 超简单的股市自动交易神器
  8. linux编译C文件两种方法
  9. 小米一键解锁system分区_不要浪费小米10的双扬声器!杜比全景音刷入教程分享...
  10. 微小区2018年度物业缴费数据报告