JAVA POI的excel中包含图片进行读取保存,单张图片,多张图片

news2024/11/26 22:36:53

JAVA POI的excel中包含图片进行读取保存,单张图片,多张图片

---------------------------------------------效果----------------------------------------------------------

1.单张图片
在这里插入图片描述

2.多张图片
在这里插入图片描述

import java.io.FileInputStream;
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.stream.Collectors;

import org.apache.poi.hssf.usermodel.HSSFClientAnchor;
import org.apache.poi.hssf.usermodel.HSSFPicture;
import org.apache.poi.hssf.usermodel.HSSFRow;
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;

public class importExcelByImg {

	public static void main(String[] args) {
		// 1.一个单元格一个图片
		importExcelOne();
		// 2.一个单元格多个图片
		importExcelTwo();

	}

	/**
	 * 1.一个单元格一个图片
	 */
	public static void importExcelOne() {
		try {
			FileInputStream fileInputStream = new FileInputStream("D://1603169080802.xls");

			HSSFWorkbook hssfWorkbook = new HSSFWorkbook(fileInputStream);// 工作簿

			HSSFSheet sheet = hssfWorkbook.getSheetAt(0);// 工作表

			int lastRowNum = sheet.getLastRowNum();// 获取最后一行序号,从零开始

			Map<String, PictureData> picMap = new HashMap<>();// 存储图片信息和坐标

			List<HSSFShape> list = sheet.getDrawingPatriarch().getChildren();

			if (list != null && list.size() > 0) {// 处理获取图片信息和坐标
				list = list.stream().filter(item -> item instanceof HSSFPicture).collect(Collectors.toList());// 过滤出图片的数据
				for (HSSFShape hssfShape : list) {
					HSSFPicture hSSFPicture = (HSSFPicture) hssfShape;
					HSSFClientAnchor hSSFClientAnchor = (HSSFClientAnchor) hSSFPicture.getAnchor();
					PictureData pictureData = hSSFPicture.getPictureData();
					picMap.put(hSSFClientAnchor.getRow1() + "," + hSSFClientAnchor.getCol1(), pictureData);
				}
			}

			for (int i = 1; i <= lastRowNum; i++) {
				HSSFRow row = sheet.getRow(i);
				String name = row.getCell(0) == null ? "" : row.getCell(0).getStringCellValue();
				String sex = row.getCell(1) == null ? "" : row.getCell(1).getStringCellValue();

				// 获取图片数据
				PictureData pictureData = picMap.get(i + "," + 2);
				String path = "";
				if (pictureData != null) {
					String suggestFileExtension = pictureData.suggestFileExtension();// 图片格式
					path = "D://" + i + "-2." + suggestFileExtension;// 存储路径
					FileOutputStream out = new FileOutputStream(path);// 流写入
					out.write(pictureData.getData());
					out.close();
				}

				System.out.println("名称:" + name + ",    性别:" + sex + ",    图片存储路径:" + path);

			}

		} catch (IOException e) {
			e.printStackTrace();
		}
	}

	/**
	 * 1.一个单元格多图片
	 */
	public static void importExcelTwo() {
		try {
			FileInputStream fileInputStream = new FileInputStream("D://1603169081675.xls");

			HSSFWorkbook hssfWorkbook = new HSSFWorkbook(fileInputStream);// 工作簿

			HSSFSheet sheet = hssfWorkbook.getSheetAt(0);// 工作表

			int lastRowNum = sheet.getLastRowNum();// 获取最后一行序号,从零开始

			Map<String, List<PictureData>> picMap = new HashMap<>();// 存储图片信息和坐标

			List<HSSFShape> list = sheet.getDrawingPatriarch().getChildren();

			if (list != null && list.size() > 0) {// 处理获取图片信息和坐标
				list = list.stream().filter(item -> item instanceof HSSFPicture).collect(Collectors.toList());// 过滤出图片的数据
				for (HSSFShape hssfShape : list) {
					HSSFPicture hSSFPicture = (HSSFPicture) hssfShape;
					HSSFClientAnchor hSSFClientAnchor = (HSSFClientAnchor) hSSFPicture.getAnchor();
					PictureData pictureData = hSSFPicture.getPictureData();
					String point = hSSFClientAnchor.getRow1() + "," + hSSFClientAnchor.getCol1();
					// 如果存在这个坐标KEY表示相同单元格中的图片,直接集合添加该图片,不存在该坐标key直接创建添加
					if (picMap.containsKey(point)) {
						picMap.get(point).add(pictureData);
					} else {
						List<PictureData> arrayList = new ArrayList<PictureData>();
						arrayList.add(pictureData);
						picMap.put(point, arrayList);
					}
				}
			}

			for (int i = 1; i <= lastRowNum; i++) {
				HSSFRow row = sheet.getRow(i);
				String name = row.getCell(0) == null ? "" : row.getCell(0).getStringCellValue();
				String sex = row.getCell(1) == null ? "" : row.getCell(1).getStringCellValue();

				// 获取图片数据
				List<PictureData> pictureDataList = picMap.get(i + "," + 2);
				String paths = "";
				if (pictureDataList != null)
					for (PictureData pictureData : pictureDataList) {
						String suggestFileExtension = pictureData.suggestFileExtension();// 图片格式
						String path = "D://" + i + "-2--" + pictureDataList.indexOf(pictureData) + "."
								+ suggestFileExtension;// 存储路径
						paths = paths + path;
						FileOutputStream out = new FileOutputStream(path);// 流写入
						out.write(pictureData.getData());
						out.close();
					}

				System.out.println("名称:" + name + ",    性别:" + sex + ",    图片存储路径:" + paths);

			}

		} catch (IOException e) {
			e.printStackTrace();
		}
	}

}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/720415.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

途乐证券|有色金属板块崛起涨超2%,云南锗业两连板

周三(7月5日)&#xff0c;A股三大股指震荡整理。截至上午收盘&#xff0c;上证指数跌幅达0.51%&#xff0c;报3228.68点&#xff1b;深证成指和创业板指跌幅分别为0.53%和0.59%&#xff1b;沪深两市合计成交额5310.1.6亿元&#xff0c;总体来看&#xff0c;两市个股跌多涨少。 …

机器学习25:《数据准备和特征工程-III》采样和分隔

目录 1.采样和分割数据 1.1 抽样简介 1.2 过滤 PII&#xff08;个人身份信息&#xff09; 2.数据不平衡 2.1 下采样和增加权重 3.数据分割示例 3.1 随机分割可能不是最好的方法 4.分割数据 5.随机化 5.1 实际考虑 5.2 散列的注意事项 6.参考文献 1.采样和分割数据-…

2023,中国电商重回元老时代

中国的历史上不缺“太上皇”&#xff0c;但“太上皇”再度站到台前的很少。公元1457年&#xff0c;被囚禁在南宫的“太上皇”朱祁镇复位&#xff0c;上演了中国历史上少见的南宫复辟。而危机时刻被推举为皇帝的朱祁钰&#xff0c;后来的庙号是代宗&#xff0c;阴阳怪气十足。 …

php://input文件包含

实验目的 通过本实验&#xff0c;了解php封装伪协议&#xff0c;掌握php://input文件包含的用法 实验环境 操作机&#xff1a;kali 靶机&#xff1a;Windows 实验地址&#xff1a;http://靶机ip/exp/include2/input/input2/ 工具&#xff1a;burpsuite 用户名&#xff1a…

好用的屏幕录制工具--Bandicam(班迪录屏)

最近准备录个电脑的音频&#xff0c;找了好多个软件&#xff0c;除了收费就是功能有限&#xff0c;经过好一番折腾试用&#xff0c;发现了2个介面友好功能强大的录屏、录音软件&#xff1a; ① Bandicam(班迪录屏)&#xff08;强烈推荐&#xff09; ② 数据蛙录屏 Bandicam(班迪…

【PC】CPU与GPU

文章目录 CPU与主板CPU是什么主板是什么功能 GPU与显卡GPU是什么显卡是什么功能 CPU与GPU的关系 ALU&#xff1a; 算术单元&#xff08;Arithmetic Unit&#xff09;&#xff1a;算术单元执行基本的算术运算&#xff0c;如加法、减法、乘法和除法。它能够对整数、浮点数和定点数…

适合成长型企业的4个 CRM 工作流程

如果你在繁琐的任务上花费太多的时间并难以让你的业务井井有条&#xff0c;CRM工作流程自动化可能会解决你的问题。 CRM&#xff08;客户关系管理系统&#xff09;是自动化工作流程最有效的工具之一&#xff0c;因为它可以帮助你从一个地方完成关键工作流程。CRM工作流程使你能…

软件测试技能,JMeter压力测试教程,获取post请求x-www-form-urlencoded格式的数据(二十四)

一、前言 post请求的参数有一些是json格式&#xff0c;也有一些是x-www-form-urlencoded格式&#xff0c;前面讲签名的时候获取到post请求的是json格式 本篇继续讲x-www-form-urlencoded格式的请求body如何获取到 二、x-www-form-urlencoded 在请求头部添加Content-Type类型…

CodeForces..移位密码器.[简单].[字符比较]

题目描述&#xff1a; 题目解读&#xff1a; 对字符串 a 进行加密后得到j加密字符串 s 。 加密规则为&#xff1a; 在字符串 a 的每个字符之后&#xff0c;添加任意(可能为零)数量的小写字母&#xff0c;与字符本身不同。 在每次这样的添加之后&#xff0c;我们将原字符添加…

【来不及刷题之】42、括号生成(递归)

常规的方法是用回溯来写这个题&#xff0c;但是回溯理解起来实在是有一点困难&#xff0c;下面这个思路是直接用递归来生成&#xff0c;首先要明确的是&#xff0c;在已经生成的字符串中&#xff0c;左括号的数量一定要大于等于右括号的数量&#xff0c;否则就不合法&#xff0…

ADSCOPE加入中国广告协会!

近日&#xff0c;经协会批准&#xff0c;上海倍孜网络技术有限公司正式加入中国广告协会&#xff0c;成为会员单位。上海倍孜将在中广协的组织和引导下&#xff0c;依托自身在行业深耕多年的优势&#xff0c;为中国数字营销领域贡献力量。 中国广告协会&#xff08;中广协&…

看完就会,从抓包到接口测试的全过程解析

一、为什么抓包 从功能测试角度 通过抓包查看隐藏字段 Web 表单中会有很多隐藏的字段&#xff0c;这些隐藏字段一般都有一些特殊的用途&#xff0c;比如收集用户的数据&#xff0c;预防 CRSF 攻击&#xff0c;防网络爬虫&#xff0c;以及一些其他用途。这些隐藏字段在界面上…

react—Hook(2)

6. useMemo—似计算属性 useMemo和useCallback的作用十分类似&#xff0c;只不过它允许记住任何类型的变量&#xff08;useCallback只记住函数&#xff09;。当改变其他变量时&#xff0c;普通函数都会运行&#xff0c;它返回的结果并没有改变。这个时候就可以使用useMemo将函…

MFC 单文档模式

Doc类利用自带框架存数据 void CCADDoc::Serialize(CArchive& ar) {if (ar.IsStoring()){// TODO: 在此添加存储代码//保存数据到文件ar << m_nShapeCount;for (int i 0; i < m_arrShapes.GetSize(); i){CShape* pShape NULL;pShape (CShape*)m_arrShapes[i];…

如何在大背景下降本增效,构建超大规模存储架构?

在日新月异的大数据服务不断涌现的今天&#xff0c;我们可以看到作为数据基础底座的存储服务面临了越来越多的复杂环境和需求的挑战。无论是离线大数据存储&#xff0c;还是在线 KV 类存储&#xff0c;都服务了越来越多的数据应用场景。存储业务形态的多样化&#xff0c;催生了…

linux centos8下安装redis6.2.12

一.下载安装包并解压 Download | Redis 解压操作 tar -zxvf redis-6.2.12.tar.gz 二.进入到redis-6.2.12中 cd redis-6.2.12 三.预编译make到本地 四.创建文件: mkdir -p /opt/redis,最后将redis安装到opt/redis目录中去 五.安装到指定目录: make install PREFIX/opt/redis…

Android 支持 lhdc

LHDC全称Low-Latency Hi-Definition Audio Codec&#xff0c;是一种高音质蓝牙编解码方案&#xff0c;由台湾厂商 Savitech 盛微先进科技开发。先看下介绍 这块不涉及音频&#xff0c;只有蓝牙&#xff0c;因为音频的codec是由台湾厂商 Savitech 盛微先进科技开发的&#xff0…

信息化项目生命周期类型的特点与管理方法论

目录 一、预测型生命周期 二、迭代型生命周期 三、增量型生命周期 四、适应型生命周期 五、混合型生命周期 六、各生命周期之间的差异点 七、项目管理五大过程组 八、适应型项目中过程组之间的关系 九、项目管理十大知识领域 十、项目管理八大绩效域 十一、价值交付系统 一、预…

立体记录留住精彩瞬间,推荐录屏软件给你

在如今数字化时代&#xff0c;电脑录屏软件成为越来越多人必备的工具之一。不论是教学、演示、游戏录制还是内容创作&#xff0c;录屏软件能够帮助我们捕捉屏幕上的活动并将其保存为高质量的视频文件。然而&#xff0c;在众多的选择中&#xff0c;我们该如何寻找一款适合自己需…

C#核心知识回顾——10.List、Dictionary、数据结构

1.List List<int> list new List<int>(); List<String> strings new List<String>();//增list.Add(0);list.Add(1);List<int> ints new List<int>();ints.Add(0);list.AddRange(ints);//插入list.Insert(0, 1);// 位置0插入1//删//1.移…