项目中有一需求:需要读取excel中的信息,带图片,需要将每一行的图片,做对应,整理方法如下:

主要逻辑:
1,获取excel对象,
2,读取excel中所有的图片流,将图片所处的位置和图片流存在map中getPictures()方法
4,根据图片所处位置,获取图片流,上传图片,并将图片的所处位置和上传路径存在map中printImg()方法
5,读取excel中的每一行文字,当读取到图片列时,根据key获取第四步的map中的value,将路径以及文字信息存入list中;readData()方法

  1. controller层
 @PostMapping("/uploadFile")public List<Map<String, String>> uploadMonitorItem(MultipartFile upfile, String providerId) throws Exception {InputStream in = null;List<Map<String, String>> listob = null;in = upfile.getInputStream();listob = ExcelUtil.readExcelByInputStream(in, providerId);return listob;}

2.service层


import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;import org.apache.poi.ss.usermodel.PictureData;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;import com.qskj.framework.config.ERPConfig;public class ExcelUtil {/*** 读取 Excel文件内容** @param inputstream 文件输入流* @return* @throws Exception*/public static List<Map<String, String>> readExcelByInputStream(InputStream inputstream, String providerId)throws Exception {// 结果集List<Map<String, String>> list = new ArrayList<Map<String, String>>();XSSFWorkbook wb = new XSSFWorkbook(inputstream);String filePath = ERPConfig.getProfile() + "/" + "pic/" + providerId + "/";//图片保存路径final XSSFSheet sheet = wb.getSheetAt(0);// 得到Excel工作表对象Map<String, PictureData> map = ExcelImgUtil.getPictures(sheet);//获取图片和位置Map<String, String> pathMap = ExcelImgUtil.printImg(map, filePath);//写入图片,并返回图片路径,key:图片坐标,value:图片路径list = ExcelImgUtil.readData(sheet, pathMap,providerId);return list;}
}

3,工具类

package com.qskj.project.util;import java.io.File;
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 org.apache.poi.POIXMLDocumentPart;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.PictureData;
import org.apache.poi.ss.usermodel.Row;
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.openxmlformats.schemas.drawingml.x2006.spreadsheetDrawing.CTMarker;import com.qskj.common.utils.security.Md5Utils;
import com.qskj.framework.config.ERPConfig;public class ExcelImgUtil {private static int counter = 0;/*** 获取图片和位置 (xlsx)* * @param sheet* @return* @throws IOException*/public static Map<String, PictureData> getPictures(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();byte[] data = picture.getPictureData().getData();map.put(key, picture.getPictureData());}}}return map;}public static Map<String, String> printImg(Map<String, PictureData> sheetList, String path) throws IOException {Map<String, String> pathMap = new HashMap<String, String>();Object[] key = sheetList.keySet().toArray();File f = new File(path);if (!f.exists()) {f.mkdirs(); // 创建目录}for (int i = 0; i < sheetList.size(); i++) {// 获取图片流PictureData pic = sheetList.get(key[i]);// 获取图片索引String picName = key[i].toString();// 获取图片格式String ext = pic.suggestFileExtension();String fileName = encodingFilename(picName);byte[] data = pic.getData();// 图片保存路径String imgPath = path + fileName + "." + ext;FileOutputStream out = new FileOutputStream(imgPath);imgPath = imgPath.substring(ERPConfig.getProfile().length(), imgPath.length());// 截取图片路径pathMap.put(picName, imgPath);out.write(data);out.close();}return pathMap;}private static final String encodingFilename(String fileName) {fileName = fileName.replace("_", " ");fileName = Md5Utils.hash(fileName + System.nanoTime() + counter++);return fileName;}/*** 读取excel文字* * Excel 07版本以上* * @param sheet*/public static List<Map<String, String>> readData(XSSFSheet sheet, Map<String, String> map,String providerId) {List<Map<String, String>> newList = new ArrayList<Map<String, String>>();// 单行数据try {int rowNum = sheet.getLastRowNum() + 1;for (int i = 1; i < rowNum; i++) {// 从第三行开始读取数据,第一行是备注,第二行是标头Row row = sheet.getRow(i);// 得到Excel工作表的行if (row != null) {int col = row.getPhysicalNumberOfCells();// 单行数据Map<String, String> mapRes = new HashMap<String, String>();// 每格数据for (int j = 0; j < col; j++) {Cell cell = row.getCell(j);if (cell == null) {// arrayString.add("");} else if (cell.getCellType() == 0) {// 当时数字时的处理mapRes.put(getMapKey(j), new Double(cell.getNumericCellValue()).toString());} else {// 如果EXCEL表格中的数据类型为字符串型mapRes.put(getMapKey(j), cell.getStringCellValue().trim());}}if (i != 1) {// 不是标头列时,添加图片路径String path = map.get(i + "-9");mapRes.put(getMapKey(9), path);}mapRes.put("providerId", providerId);newList.add(mapRes);}}} catch (Exception e) {}return newList;}public static String getMapKey(int num) {String res = "";switch (num) {case 0:// 分类res = "secondDictCode";break;case 1:// 产品名称res = "productName";break;case 2:// 规格型号res = "specification";break;case 3:// 计量单位res = "unit";break;case 4:// 风格res = "style";break;case 5:// 颜色res = "color";break;case 6:// 采购单价res = "purchasePrice";break;case 7:// 材质res = "material";break;case 8:// 备注res = "remark";break;case 9:// 产品图片res = "picture";break;default:break;}return res;}
}
  1. postman请求测试:/poi/uploadFile?providerId=5
  2. 最终效果
[{"unit": "计量单位","color": "颜色","material": "材质","providerId": "5","specification": "规格型号","style": "风格","remark": "备注","purchasePrice": "采购单价","secondDictCode": "分类","productName": "产品名称","picture": "产品图片"},{"unit": "平方米","color": "白色,绿色,红色","material": "木质1","providerId": "5","specification": "600*900","style": "美式,北欧,中式","remark": "大萨达十大1","purchasePrice": "66.8","secondDictCode": "家具","productName": "床","picture": "/pic/5/b3e42b2d741cc16bff4fefaa6bb61d87.jpeg"},{"providerId": "5","picture": null}
]

github代码demo,及使用说明

csdn资源文件,代码demo及使用说明

poi读取excel中的内容(带图片)相关推荐

  1. java通过poi读取excel中的日期类型数据或自定义类型日期

    java通过poi读取excel中的日期类型数据或自定义类型日期 Java 读取Excel表格日期类型数据的时候,读出来的是这样的  12-十月-2019,而Excel中输入的是 2019/10/12 ...

  2. Java利用Apace POI读取Excel中数据

    Java利用Apace POI读取Excel中数据,解析数据 @Testpublic void readExcel() throws IOException{FileSystemView fsv = ...

  3. POI读取excel中读取小数位数过多,数值精度损失问题解决

    POI读取excel中读取小数位数过多,数值精度损失问题解决 参考来源 项目中需要用到读取excel功能,当excel中有计算公式时,读取到的数值就可能会出现多个小数点的问题 例如: 2.2 --&g ...

  4. 使用poi读取Excel中的数据到数据库

    大家好今儿给大家带来的是使用poi读取Excel中的数据到数据库 目录 大家好今儿给大家带来的是使用poi读取Excel中的数据到数据库 1.poi简单介绍 2.poi操作excel 3.代码部分(可 ...

  5. php 读取excel中的内容到mysql 数据库

    .................................................................................................... ...

  6. java通过poi读取excel中的日期类型

    1.问题分析 Java 读取Excel表格日期类型数据的时候,读出来的是这样的 12-十月-2020,而Excel中输入的是 2020/10/12 或 2020-10-12 poi处理excel时,当 ...

  7. 使用POI向Excel中插入多張图片

    2019独角兽企业重金招聘Python工程师标准>>> POI3.0以上版本才支持向Excel中插入图片 http://apache.freelamp.com/jakarta/poi ...

  8. java poi 读取Excel中的手机号或电话号码,手机号变成1.8312345678E10格式数据的解决方法

    [现象] 共有2行数据 [张三1, 1.8312345678E10, 张三2, 1.8312345679E10] [解决方法] v.add(row.getCell(1)+""); ...

  9. JAVA POI读取Excel中Cell为null的处理

    空数据:没有任何编辑过的单元格(非空格) 有时候我们需要对根据每一列的信息进行处理,这里就会出现易错的缺陷. 1.不需要这些空数据 row = sheet.getRow(i); for (Cell c ...

最新文章

  1. 《虚拟化与云计算》读书感(四)数据中心的设计和构造
  2. MDK 工程宏定义的应用
  3. stateless_Spring Stateless State Security第3部分:JWT +社会认证
  4. 一周以来的工作总结--oracle分区的迁移
  5. cocos2d 嵌入网页_在 cocos2d-x 中嵌入浏览器
  6. python 整数对应的字符,在Python中将字符串从字母解密为整数映射
  7. ‍炮灰模型---------- 对女生选择追求者的数学模型的建立
  8. seay代码审计工具_“代码审计”了解一下
  9. DELPHI源码防QQ截屏区域截图全屏截图框架
  10. (超详细)手把手教你在安卓手机上搭建服务器和网站
  11. Python---PDF旋转角度
  12. C++如何写adaptable仿函数
  13. Heartbeat简介
  14. 清明梦听说过吗?你对于控制你做梦这件事上的心力有多深
  15. USB虚拟串口(CDC)极限速度测试
  16. C#引用interop.taskscheduler.dll
  17. 数据挖掘——了解数据
  18. 数据泵 TTS(传输表空间技术)
  19. 校园网免认证停机卡免流服务器被迫关停
  20. 车载语音交互「停摆」

热门文章

  1. VMware虚拟机安装macos Monterey 12.1(21C52)教程镜像CDR/ISO下载
  2. 18 位业内专家预测 2019 年科技行业趋势
  3. 一个电商系统的性能需求例子
  4. 【Aladdin-Unity3D-Shader编程】之八-2D图常用的Shader效果
  5. Linux Grep 正则表达式示例
  6. android 定时器 循环器
  7. Redis RDB 和 AOF
  8. 软件工程导论——4系统设计
  9. CRC并行运算原理分析,公式推导及MATLAB实现,并行CRC Verilog代码生成
  10. 如何将两张图片拼接在一起?