利用python在excel中画图

  • 一、前言
    • 1.1、实现效果
    • 1.2、需要用到的库的安装
  • 二、代码分开讲解
    • 2.1、对象的定义以及初始化
    • 2.2、对象的方法1:行高列宽调整,以防止图像变形
    • 2.3、对象的方法2:10进制转化为16进制
    • 2.4、对象的方法3:获取r、g、b值并运用方法1转化为16进制颜色码
    • 2.5、对象的方法4;颜色填充
  • 三、完整代码
  • 四、结语

一、前言

以前大学时候,学EXCEL看到N多大神利用excel画图,觉得很不可思议。今个学了一个来月python,膨胀了就想用excel画图。当然,其实用画图这个词不甚严谨,实际上是利用opencv遍历每一个像素的rgb值,再将其转化为16进制,最后调用openpyxl进行填充即可。

1.1、实现效果

效果如下图

1.2、需要用到的库的安装

需要用到库如下:

import cv2          #导入OpenCV库
import xlsxwriter   #利用这个调整行高列宽
import openpyxl     #利用这个填充颜色
import numpy as np  #下面这两个是数据存储的两种方式,用此种方式处理数据,比列表高效,具体可自行查看文档
import pandas as pd

除了第一个库其他的可以直接用pip在命令提示行进行安装,或者利用编辑器的一些自动安装功能也非常的方便,具体的请参看这篇文章 的第三节: 三、开始安装

第一个库如果你直接用pip3 install opencv-python 进行安装的话,无论你网速多么快,都会非常慢几k/s,如下:

如果能安装好还行,关键有的可能等上几分钟也不行,直接出现几十行的红色字看的头疼。几经百度后才知道是安装源的问题,切换为国内的安装源即可,利用如下命令,
pip3 install -i https://pypi.tuna.tsinghua.edu.cn/simple opencv-python
如下图,我准备截取安装速度和上面的作对比的,结果直接安装好了

二、代码分开讲解

本文我们利用面相对象的编程思维进行。

2.1、对象的定义以及初始化

class ImageToExcel():def __init__(self,image_path,excel_path):self.imgviewx=cv2.imread(image_path,cv2.IMREAD_COLOR)self.excel_path=excel_path

前面两行很好理解就是定义对象的格式以及初始化对象
其中image_path和excel_path这两个变量是你的图像储存路径和后续的excel文件保存位置。
第三行<<self.imgviewx=cv2.imread(image_path,cv2.IMREAD_COLOR)>>意思是调用opencv的imread读取图片。其中第一个参数就是对象实例化时候传递进来的图像储存路径。该函数返回的是一个三维数组,分别表示x,y,rgb 就是x,y坐标对应的rgb值,其中x,y单位为1像素。最后将这个三维数组传递给对象的一个属性imgviewx,等待后续对象方法调用。我们将之打印出来如下。

第四行<<self.excel_path=excel_path>>是将对象实例化时候传递进来的excel_path传递给对象的属性excel_path,同样等待后续对象的方法调用。

2.2、对象的方法1:行高列宽调整,以防止图像变形

#excel行高列宽调整def excel_size(self):workbook = xlsxwriter.Workbook(self.excel_path)worksheet = workbook.add_worksheet('test')worksheet.set_column('A:CAA', 1)for x in range(2000):worksheet.set_row(x, 8.4)workbook.close()

这个其实你可以后续在excel中调整也可以。
第二行第三行基本一看就懂,就是在你刚开始对象实例化时候传入的一个路径中创建一个工作簿并添加一个名为test的工作表。
第三行意思是将A列到CAA列的列宽设置为1(注意:这里面设置为1不知道为什么在工作表中就是0.94,列宽同样小点)
第四行意思同样,不过行高不能批量只能通过循环。
最后一样看着像关闭,其实最主要功能是保存,没有这一行,前面的所有设置都不会被保存。

2.3、对象的方法2:10进制转化为16进制

    #10进制转化为16进制def ten2_16(self,num):num1 = hex(num).replace('0x', '')return num1 if len(num1) > 1 else '0' + num1

这个方法不用细说,就是利用系统自带的函数hex将10进制转化为16进制。我们都知道hex返回的16进制是以0x开头的,而16进制颜色码中明显没有,所以要用replace去掉。
如果rgb值是16以内的,以16进制显示的话会是1位数,而同样这个在16进制颜色码中也没有,所以最后一行的意思就是一位数的话在开头补0。

2.4、对象的方法3:获取r、g、b值并运用方法1转化为16进制颜色码

#获取像素数据并转化为16进制def get_rgb_data(self):self.excel_size()data_r=pd.DataFrame( np.array(self.imgviewx)[:,:,2] ).applymap(self.ten2_16)data_g=pd.DataFrame( np.array(self.imgviewx)[:,:,1] ).applymap(self.ten2_16)data_b=pd.DataFrame( np.array(self.imgviewx)[:,:,0] ).applymap(self.ten2_16)return (data_r+data_g+data_b).values

其中第二行<<self.excel_size()>>是在本方法本调用时候先调用方法1调整行高列宽。我们后面说,这关系到对象方法之间的参数传递,我们后续说。
三四五行的代码结构一样,我们挑一个说。比如第三行

<<data_r=pd.DataFrame( np.array(self.imgviewx)[:,:,2] ).applymap(self.ten2_16)>>

这个代码我们可以拆开成下面的代码

r=np.array(self.imgviewx)[:,:,2]
tmp=pd.DataFrame( r )
data_r=tmp.applymap(self.ten2_16)

这下就容易懂了
第一行意思是将刚开始对象初始化时候得到的包含目标图片的所有像素点的rgb值的三维列表转化为数组并提取其中的r。
第二行是将第一行得到的数组转化为DataFrame对象并存储在tmp变量中,以便第三行的处理。
第三行是利用DataFrame中的applymap将r值转化为16进制。

最后一行<<return (data_r+data_g+data_b).values>>意思是将转化为16进制的rgb值合并后就得到了16进制的颜色码并转化为数组。

2.5、对象的方法4;颜色填充

    def color_fill(self):rgb_list=self.get_rgb_data()wb = openpyxl.load_workbook(self.excel_path)ws = wb['test']for x,tmp1 in list(enumerate(rgb_list)):print('总共有%s行,已填充%s行,还剩下%s行'%(len(rgb_list),x+1,len(rgb_list)-x-1))for y ,tmp2 in list(enumerate(tmp1)):ws.cell(x+1,y+1).fill = openpyxl.styles.fills.GradientFill(stop=[str(tmp2),str(tmp2)])wb.save(self.excel_path)

第二行<<rgb_list=self.get_rgb_data()>>是不是似曾相识,对,就是在方法2中调用方法1时候用的。
这里就是在本方法也就是方法3中调用方法2。唯一的区别就是有没有返回值。
我们这样在方法3中调用方法2然后方法2中调用方法1。这样在对象外的时候我们就只用对象实例化并调用方法3即可实现功能。
第三行、第四行就是调用openpyxl.load_workbook打开我们在方法1中新建的工作簿中的test工作表
五到七行两个循环嵌套很容易懂就是利用循环遍历每个工作表
第八行的代码可能可以简化 ,这个是我修改网上的一个填充渐变色的代码。
最后一行就是工作表的保存,没什么可说的。

三、完整代码

import cv2          #导入OpenCV库
import xlsxwriter   #利用这个调整行高列宽
import openpyxl     #利用这个填充颜色
import numpy as np  #下面这两个是数据存储的两种方式,用此种方式处理数据,比列表高效
import pandas as pdclass ImageToExcel():#初始化def __init__(self,image_path,excel_path):self.imgviewx=cv2.imread(image_path,cv2.IMREAD_COLOR)self.excel_path=excel_path# excel行高列宽调整def excel_size(self):workbook = xlsxwriter.Workbook(self.excel_path)worksheet = workbook.add_worksheet('test')worksheet.set_column('A:CAA', 1)for x in range(2000): worksheet.set_row(x, 8.4)workbook.close()#rgb转16进制颜色码def ten2_16(self,num):tmp = hex(num).replace('0x', '')return tmp if len(tmp) > 1 else '0' + tmp#获取像素数据并转化为16进制def get_rgb_data(self):self.excel_size()data_r=pd.DataFrame( np.array(self.imgviewx)[:,:,2] ).applymap(self.ten2_16)data_g=pd.DataFrame( np.array(self.imgviewx)[:,:,1] ).applymap(self.ten2_16)data_b=pd.DataFrame( np.array(self.imgviewx)[:,:,0] ).applymap(self.ten2_16)return (data_r+data_g+data_b).values#颜色填充def color_fill(self):rgb_list=self.get_rgb_data()wb = openpyxl.load_workbook(self.excel_path)ws = wb['test']for x,tmp1 in list(enumerate(rgb_list)):print('总共有%s行,已填充%s行,还剩下%s行'%(len(rgb_list),x+1,len(rgb_list)-x-1))for y ,tmp2 in list(enumerate(tmp1)):ws.cell(x+1,y+1).fill = openpyxl.styles.fills.GradientFill(stop=[str(tmp2),str(tmp2)])wb.save(self.excel_path)
excel_path='test23.xlsx'
image_path='tttt.png'
image=ImageToExcel(image_path,excel_path)
image.color_fill()

最后四行前两行可以直接写在第三行中,就是对象的实例化中
另外还有一点,image_path中的 tttt.png是直接和我的py文件放在一起的,不然运行会报错。

四、结语

好啦,到此所有东西已全部搞定,当然还有很多要注意的,
第一、方法3中红绿蓝的提取中这部分的编号是刚好相反的,提取时候需要注意
如下

当然你也可以尝试改变这个值看最后会得到什么结果。蓝色的太阳 红色的天空 或者是绿色的帽子,哈哈 好吧这个就你们自己发挥了。
第二、除了以上一点需要注意的,还有一个需要注意,就是像素不能太高。我测试了下342*218的话我的i7-6700u打开excel就不是很流畅了。
你可以遍历的时候以2个像素点或者四个像素点为步长,不过这样我没试过,可能颗粒感比较明显吧(自己猜测没试过),或者把原始图片修改下。

第三、如果对这篇文章有任何问题,欢迎私信,评论。

Title: the third blog
By:P&p
Time:2020-03-09 15.39 (学python的第38天)

利用python在excel中画图相关推荐

  1. python excel绘图-利用python在excel中画图的实现方法

    一.前言 以前大学时候,学EXCEL看到N多大神利用excel画图,觉得很不可思议.今个学了一个来月python,膨胀了就想用excel画图.当然,其实用画图这个词不甚严谨,实际上是利用opencv遍 ...

  2. python 表格格式输出_利用python对excel中一列的时间数据更改格式操作

    问题场景:需要将下列的交期一列的数据格式更改成2019/05/10 存货编码 尺寸 数量 交期 0 K10Y0190000X B140 200 2019-05-10 00:00:00 1 K10Y01 ...

  3. python对excel数据更改_利用python对excel中一列的时间数据更改格式代码示例

    本篇文章小编给大家分享一下利用python对excel中一列的时间数据更改格式代码示例,文章代码介绍的很详细,小编觉得挺不错的,现在分享给大家供大家参考,有需要的小伙伴们可以来看看. 问题场景:需要将 ...

  4. 利用python读取excel中的公司名称获取公司的经营范围并回填进excel中

    前几天朋友托我帮完成一份地区教育类型公司的经营范围,表中已经有了公司的名称及地点等信息,但是还缺少经营范围,由于数据量比较大,一个一个的去百度搜再复制到表里,工作量有点大,可能需要我好几天不吃不喝的C ...

  5. python更改整列小时分钟_利用python对excel中一列的时间数据更改格式操作

    问题场景:需要将下列的交期一列的数据格式更改成2019/05/10存货编码 尺寸 数量 交期 0 K10Y0190000X B140 200 2019-05-10 00:00:00 1 K10Y019 ...

  6. 利用python读取excel中邮箱进行批量群发,使用中国移动内部邮箱或139邮箱-html编辑的正文并且带附件。

    简介 此项目是通过读取excel文件内容(包含公司名称,公司类型,邮箱-每个公司对应多个邮箱)自动批量发送邮件到目标公司.亲测可用. 完整代码 import smtplib from email.mi ...

  7. 利用python统计excel中的数据

    准备工作 完成这项工程需要用到os库与xlrd库 其详细介绍可以参考这两篇博客: os库篇 xlrd库篇 思路 1.先把excel文件都放入一个文件夹中 2.再读取这个文件夹,把所有excel文件的地 ...

  8. 利用python对excel文件进行操作_数据处理-对Excel文件读取和操作和存储(python版)...

    一:利用python读取Excel中.xls文件中所有数据 #encoding=utf-8 import xlrd import xlwt from xlwt import * fileName=&q ...

  9. Python对Excel中具体某几列进行数据预处理

    1.利用python读取Excel中.xls文件中所有数据 #encoding=utf-8 import xlrd import xlwt from xlwt import *fileName=&qu ...

  10. 如何利用python将excel表格中筛选出来的每一份数据各自另存为新的excel文件?

    如何利用python将excel表格中筛选出来的每一份数据各自另存为新的excel文件? 1.问题描述 2.解决过程 2.1 问题分析: 2.2 解决思路 3.运行结果 1.问题描述 最近在处理一堆工 ...

最新文章

  1. python判断素数的函数_如何用python求素数
  2. 关于学习Python的一点学习总结(3->标识符->if->模块->字符)
  3. 很多人都在埋怨没有遇到好的团队,但好的团队不可能凭空出现,一流的团队不能仅靠团队成员努力,作为Leader,要有可行的规划,并坚定地执行、时势地调整(转)...
  4. Leetcode 18. 四数之和 (每日一题 20211011)
  5. Codeforces 468C/469E 易错点
  6. 缓存行cache line概述
  7. ITK:将两个图像相乘
  8. ARM uboot中的.lds
  9. PyCharm+Python3转换xls文件为xlsx文件格式
  10. Go 标准库: path
  11. 最新容器项目 Kata 曝光
  12. C++多线程Demo
  13. TensorFlow by Google过拟合优化 Machine Learning Foundations: Ep #7 - Image augmentation and overfitting
  14. 记一次kubernetes的搭建遇坑coredns状态为CrashLoopBackOff并不断重启
  15. 被称为史上最高效学习方法——费曼学习法
  16. 2022年系统集成项目管理工程师考试知识点:区块链
  17. 戴尔笔记本重装系统找不到硬盘怎么办?
  18. 教学资源库建设计算机专业,教学资源库建设计算机应用论文
  19. 大数据分析的四个关键环节
  20. 电磁炮程序(电子设计大赛)

热门文章

  1. 安装Ubuntu Linux系统时硬盘分区
  2. 20155305《网络对抗》信息搜集与漏洞扫描
  3. 【转载】PowerDomain简介
  4. Deecamp笔记——点云目标跟踪 Open3D连续可视化
  5. MySql根据当前页pageNo、显示条数pageSize,实现分页查询的SQL
  6. 显卡温度过高怎么处理
  7. 最小二乘法以及正交最小二乘(OLS)的推导与简单比较
  8. win10无线断开无法连接服务器,win10wifi自动断开什么原因_win10wifi自动断开且无法连接如何解决...
  9. word自动生成目录,设置从指定页码开始
  10. Flutter 如何实现禁止手机横屏的功能