apache poi excel显示 base64 图片_数据处理之带图片Excel数据处理解惑

小编最近项目中遇到一个大批量Excel数据提取的问题,因为Excel数据中含有图片,所以在程序处理时遇到了困难,小编花了点时间才解决了这个问题,所以在这里mark一下。

1 问题描述

首先来描述一下数据处理的需求,如下图所以是给定Excel表的数据结构(非项目数据,自己构造),数据包括人的照片、身份证号、生日等信息,数据处理的需求是将Excel中的图片提取出来并命名为对应身份证号码保存。

f6c553137bebad1a26750b95d2226682.png

2 python读取Excel内容

作为一个一个程序员首先想到的就是写一个脚本来实现自动化提取与重命名,于是想编写个python脚本来实现。大体设想就是,下载安装python读取Excel的包,读取sheet中的数据行然后将“照片”列不为空的照片保存为该行“身份证”命名的图片。

用pip安装xlrd后,用如下代码进行数据读入测试:

53ed6abd9337e1411829ebe73d6679b1.png

读取数据后的输出如下:

f0090e50897c83bca76ebfd189fc1df5.png

由python打印的输出结果分析可知,python读取Excel时将Excel的sheet分别读入一个dict中,然后通过遍历dict和dict中的内容来输出表中内容,本例中只有一个sheet中有数据。但是,python读取Excel内容只能读取Excel中的文字,对于Excel列中的图片xlrd并不能读取,如上图所示读取到的数据每一行的第一列均为空值。

3 java读取Excel中的内容及图片

python不能对所描述问题给出完美解决方案,经查阅资料小编准备转战java来实现。

首先下载并build如下Excel读取的POI的jar包:

f501930be81e42947532475bd5814c19.png

java读取Excel中的内容和图片的代码如下:

package test;
import java.io.File;
import java.io.FileInputStream;
import java.util.List;import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.DateUtil;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.xssf.usermodel.XSSFPictureData;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
public final class TestImportXlsx {public static void main(String[] args) throws Exception {File excelFile = new File("/root/zachary/extract_img/data.xlsx");XSSFWorkbook wb = new XSSFWorkbook(new FileInputStream(excelFile));XSSFSheet sheet = wb.getSheetAt(0);for (Row row : sheet) {for (Cell cell : row) {switch (cell.getCellType()) {case Cell.CELL_TYPE_STRING:System.out.print(cell.getRichStringCellValue().getString());System.out.print("|");break;case Cell.CELL_TYPE_NUMERIC:if (DateUtil.isCellDateFormatted(cell)) {System.out.print(String.valueOf(cell.getDateCellValue()));} else {System.out.print(cell.getNumericCellValue());}System.out.print("|");break;case Cell.CELL_TYPE_BOOLEAN:System.out.print(cell.getBooleanCellValue());System.out.print("|");break;default:}}System.out.println();} //读取图片List<XSSFPictureData> pictures = wb.getAllPictures();  for (int i = 0; i < pictures.size(); i++) {XSSFPictureData pictureData = pictures.get(i);byte[] picData = pictureData.getData();System.out.println("image-size:" + picData.length);} System.out.println(wb.getSheetName(0));}
}

troubleshoot:

应用java能够读取到Excel中的文字与图片,那么就能利用其相关性进行图片存储并重命名。麻烦的问题是,原始数据中存在图片列为空的行,但是java的POI包只能按顺序获取到图片并已将图片为空的行自动去除,那么这样按照图片索引找的身份证ID和真正的ID会出现偏差。

为了去除图片列为空的行,需要对Excel在java读取时去掉为空的行。但是面对庞大的Excel手动去除成了一大难题,因为插入的图片是附在Excel单元格上的,所以python在读取该列时才会都读为空,java也只能按照图片在Excel中的位置顺序载入图片。经过试验,并不能通过查找空值和排序来处理掉Excel中图片列为空的行。

4 Excel图片列为空数据预处理

小编经过Excel的多方尝试,给出下面无图片行数据删除的Excel操作。

1.选中相片列---->开始---->条件格式---->突出显示单元格规则---->重复值---->选择浅红色文本填充重复值:

73980959454ef16894b3386ccbf1e310.png

2.在相片列按颜色筛选内容:选中相片列--->开始---->排序和筛选--->筛选--->在相片列按照浅红色筛选内容。

fb994362667a3d2740fc3e1de1ba560a.png

3.经过筛选后只显示相片列为空的行,这样我们只需要删除了筛选出的行,然后恢复筛选前的条件即可得到删除相片列为空行的数据结果。

4 总结

综合2、3两步得到完整解决开篇描述问题的解决方案:

Excel中删除相片列为空行的数据---->java读取图片和身份证ID---->图片以ID重命名存

本篇内容在本人个人公众号上也已发布,欢迎关注本人微信公众号“勤菜鸟”。

Reference

1.http://www.cnblogs.com/lhj588/archive/2012/01/06/2314181.html

2.https://blog.csdn.net/qw0907/article/details/54617706

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

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

相关文章

mysql加锁后怎么解除_Mysql查看死锁与解除死锁的深入讲解

前言前段时间遇到了一个Mysql 死锁相关的问题&#xff0c;整理一下。问题描述&#xff1a;Mysql 的修改语句似乎都没有生效&#xff0c;同时使用Mysql GUI 工具编辑字段的值时会弹出异常。什么是死锁在解决Mysql 死锁的问题之前&#xff0c;还是先来了解一下什么是死锁。死锁是…

mysql查询工具哪个好_一个比较实用的数据库查看管理工具

个人从业四年多&#xff0c;和数据库打交道不计其数&#xff0c;特别是在之前做企业级应用系统的时候&#xff0c;整天就是在业务、数据和程序之间穿梭&#xff0c;那个数据查的呀&#xff0c;平均每天有40% 左右的时间都在手工的写sql进行数据的查询。刚开始&#xff0c;通过数…

mysql运维机制_《MySQL运维内参》节选 | InnoDB日志管理机制(一)

引 子InnoDB 存储引擎是支持事务ACID特性的&#xff0c;它是以二十多年前IBM的一篇著名文章《ARIES:A Transaction Recovery Method Supporting Fine-Granularity Locking and PartialRollbacks Using Write-Ahead Logging》为理论基础&#xff0c;大多数关系型数据库的实现都是…

数mysql据分析优化_从零开始学习数据分析-mysql架构与优化理论

mysql的逻辑分层&#xff1a;连接层 服务层 引擎层 存储层引擎层主要分为两类&#xff1a;InnoDB、MyIsam(使用show engines;查看)InnoDB是事务优先的&#xff0c;会进行行锁&#xff0c;适合高并发操作MyIsam是性能优先的&#xff0c;进行表锁sql优化点&#xff1a;等待时间长…

检验int值在list中是否存在_R语言统计与绘图:卡方检验

卡方检验在计数资料中的应用&#xff0c;包括推断两个总体率或构成比之间有无差别、多个总体率或构成比之间有无差别、多个样本率间的多重比较、两个分类变量之间有无关联性、多维列联表的分析和频数分布拟合优度的卡方检验。选自&#xff1a;周支瑞老师下面分别介绍计数资料怎…

mysql in 多个字段_MySQL如何同时自增自减多个字段

“本文将带大家聊一下如何同时自增自减多个字段”前言最近小Q同学去面试了&#xff0c;然后就问了题目的问题&#xff0c;如何同时自增自减多个字段。小Q一时回答不出来&#xff0c;最终的结果就是回家等通知....关于这个问题咔咔来给小Q简单的进行解答一下。一、ThinkPHP框架实…

wxpython 调用子窗口_wxpython入门第一步(简单例子)

在这部分wxPython教程中&#xff0c;我们将创建一些简单的例子。简单的例子​ 我们从一个非常简单的例子开始。我们的第一个脚本将只显示一个小窗口。它不会做太多事情。我们将逐行分析这个脚本。# simple.pyimport wxapp wx.App()frame wx.Frame(None, )frame.Show()app.Mai…

orderd mysql_Oracle入门教程:leading vs ordered hint

odered hint 可以指示oracle 使用from 关键字后面的表的顺序进行join连接&#xff01;cbo会优先按照from 后面的表的顺序来进行join&#xff0c;当统计leading hint 可以指示Oracle使用leading 中指定的表作为驱动表,比如 正常的访问计划如下SCOTT> select e.ename, hiredat…

mysql标识列从一开始_mysql中标识列是什么意思有什么用

标识列是什么&#xff1f;标识列又称为自增长列。含义&#xff1a;可以不用手动的插入值&#xff0c;系统提供默认的序列值特点&#xff1a;1、标识列必须和主键搭配吗&#xff1f;不一定&#xff0c;但要求是一个key2、一个表可以有几个标识列&#xff1f;至多一个&#xff01…

mysql 及时点还原_mysqlbinglog基于即时点还原

mysqlbinlog介绍要想从二进制日志恢复数据&#xff0c;你需要知道当前二进制日志文件的路径和文件名。一般可以从选项文件(即my.cnf or my.ini&#xff0c;取决于你的系统)中找到路径。(mysql5.7开启binglog 时需要同时设置server-id否则无法启动)要想确定当前的二进制日志文件…

python mysql查表_python进阶(十、mysql:单表查询)

3.mysql数据库3.10 单表查询3.10.1. 简单查询查询在数据库中使用的频率是最高的&#xff1a;十次查询&#xff0c;一次增删改。1)建表2)插入数据3.10.1.1. 选择字段&#xff1a;selectselect 字段名1,字段名2…… from 表名 where 条件;3.10.1.2. 字段重命名(别名)&#xff1a;…

python常见的数值运算符_第18 p,Python中各种常用的运算符,特别是增量运算符...

原标题&#xff1a;第18 p&#xff0c;Python中各种常用的运算符&#xff0c;特别是增量运算符大家好&#xff0c;我是杨数Tos&#xff0c;这是《从零基础到大神》系列课程的第18篇文章&#xff0c;第二阶段的课程&#xff1a;Python基础知识&#xff1a;Python中各种常用的运算…

python画害羞的表情_用Python把你的朋友变成表情包

一、项目说明在日常生活中&#xff0c;我们经常会存取一些朋友们的丑照&#xff0c;在这个项目中&#xff0c;我们以萌萌哒的熊猫头作为背景&#xff0c;然后试着在背景图上加入朋友们的照片。效果如下图所示&#xff1a;二、实现步骤导入朋友的照片(前景照片)&#xff1b;处理…

.net md5 java 偏移量_C# java MD5加密方不一致问题

说来惭愧&#xff0c;做开发几年了&#xff0c;一直在吸取&#xff0c;今天也写写自已关于技术的一点点理解&#xff0c;不正之处&#xff0c;请大家多多指点。由于之前开发的项目使用的是C#,用户信息使用的C#的MD5加密码方式&#xff0c;而现在需要切换到Java平台下&#xff0…

java dijkstra算法代码_[转载]Java实现dijkstra算法: 地图中任意起点寻找最佳路径...

最近在复习java&#xff0c;下学期要用&#xff0c;写这个练手. 技术较粗糙&#xff0c;见谅.代码里用的是这幅地图&#xff0c;根据实际情况更改&#xff0c;在addNode方法中这个是运行结果&#xff0c;起点和终点在 运行wrap(String qidian, String zhongdian) 时定义代码&a…

java xml opencv_Java中使用opencv

零、前言作为图像处理出身&#xff0c;不仅仅要会C图像处理、matlab图像处理、python图像处理、最起码也得会java图像处理&#xff0c;当然我最终还都用的是opencv这个机器视觉库了。今天简单介绍一下java中如何使用opencv。一、配置库(1)官网下载opencv&#xff0c;在opencv\b…

java实现table可编辑_动态渲染可编辑单元格的Table

一、问题描述问题是这样的&#xff0c;后台传了xArr [x1, x2,...,xn]和yArr [y1, y2, ..yn]两个数组&#xff0c;前端要渲染出表格并且可以填写每个单元格的值&#xff0c;然后按照一定数据结构保存并传给后台&#xff0c;并且再次获取这个数据结构和数组xArr、yArr可以自己渲…

java包裹邮费计算_GitHub - honghailiang/FreightSystem: 基于Java Swing编写的简易运费计算工具...

FreightSystem基于java Swing编写的运费计算系统初始化数据从excel中读取数据&#xff0c;转化为对象(只保存基础数据&#xff1a;序列号、始发站、目的站、省份、100kg以下(元/kg)、100kg以上(元/kg)、到货(元/kg)、自提(元/kg)、补贴里程、公路里程、单价(元/吨公里))并保存到…

java需求设计_JavaWeb期末设计---需求分析文档. stage1

影院活动管理系统—需求分析文档目录第2章 需求分析2.1 用户需求2.1.1 业务需求2.1.2 商业需求2.1.3 特殊需求2.2 可行性分析2.2.1 技术可行性2.2.2 经济可行性2.3 系统功能2.3.1 功能概述2.3.2 E-R图2.3.4 Domian logic2.3.5 系统框架图-------------------------------------…

selenium java po模式_selenium + java po模式

po模式大概介绍&#xff0c;大家也可以自己百度看看Page Object模式主要是将每个页面设计为一个类class&#xff0c;这个类包含页面中需要测试的元素(按钮、输入框、URL、标题等)和实际操作方法&#xff0c;这样在写测试用例时可以通过调用页面类的方法和属性来获取页面元素和操…