作者简介
原作:run_tc(网名)
喜欢用编程做点事的注册会计师。
本文由周美川排版。
工作繁忙的晚上,妹子收到了一份来自你的excel文件,掩盖着失望神情的她,挪着疲惫的食指轻轻的点击鼠标。咦?怎么回事?表格中没有任何文字,只有她开心的笑脸……妹子头往屏幕前探,what?竟然不是图片,是你手把手将excel的M*N个单元格逐个进行颜色填充。从画中完全可以看出你的细心,耐心!妹子对你的好感+10!哈哈哈哈……老司机们,你们已经在开车了……
so,如何实现??
听说Excel能够画画???
来讲两个故事吧。
故事一
发表于遥远的过去诚一财税
查看:run_tc回复:周美川
日本一位73岁大爷在退休之后,为了完成童年时的画画的梦想,开始学习画画。由于经济窘迫,他买不起纸墨,于是尝试着用Excel作画,坚持十年,成就自己的梦想。
作
品
展
示
run_tc1分钟前于你耳旁
是的,如果你有一颗喜欢【做傻事】的心,你也可以试着去填充单元格!但是,时间不等人,画出妹子的身影,她已嫁做人妇……
故事二
发表于遥远的过去诚一财税
查看:run_tc回复:周美川
《Excel的VBA现在还算是办公利器吗?》火了,里面提到了Excel可以制作油画,天真的我信了!搜索了一番,发现有个excelart的工具可以实现。下载/安装,结果很不爽,免费版本输出的图像像素太低了。
作
品
展
示
run_tc1分钟前于你耳旁
要钱还是要像素?sorry,大多数人都是要像素,但不想花钱。
如果你想简单的在Excel中作图,借助软件无疑是最佳途径。文章将结合Python与VBA,发布一款免费开源的代码,供各位使用。
好吧,其实软件制作图像这种事情,道理是很简单的,无非是将图像的RGB矩阵拷贝到excel中,再对excel进行填充罢了。
但是事情并非那么顺利,存在两个问题:
困难1:excel对于填充颜色的种类是有限制的,不得超过4000,而RGB的色彩的种类是2的24次方,因此,存在种类限制。
困难2:如果使用python对于excel进行操作,那么现如今的库中,只有win32com可用。一方面,运行速度慢;另外一方面,出了问题很难调试。
解决思路
对于颜色种类太多的问题,可以采用近似的方法,将RGB转为仅仅只有200多种的网络色彩,同时,将网络色彩在还原成RGB,以方便对Excel对RGB进行操作。
对于操作excel问题,那就留给VBA来吧。
EXCEL作图步骤:
1、读取图片中的RGB值,将其转化成网络色彩,最后还原成RGB值;
2、将经过处理的RGB值存为文本;
3、新建Excel,导入文本值;
4、借助VBA进行填充。
第一步
读取图片中的RGB值,将其转化为网络色彩,最后还原成RGB值,并将24的RGB计算为整数并存为文本。这里我将借助python实现。
#coding=utf-8
importnumpyasnp
fromPILimportImage
def jpg_image_to_array(image):
"""
Loads JPEG image into 3D Numpy array of shape
(width, height, channels)
"""
im_arr = np.fromstring(image.tobytes(), dtype=np.uint8)
im_arr = im_arr.reshape((image.size[1], image.size[0], 3))
returnim_arr
def rgbToInt(rgb):
colorInt = rgb[0] + (rgb[1] * 256) + (rgb[2] * 256 * 256)
returncolorInt
path = r"I:\\tc.JPG"
f = Image.open(path)
f1 = f.convert("P").convert("RGB")
arr = jpg_image_to_array(f1)
print(type(arr),arr.shape)
arr2 = np.apply_along_axis(rgbToInt,2,arr)
np.savetxt("simple1.txt",arr2)
第三步
新建Excel,导入文本值。这里是Sheet1中添加文本:
第四步
填充单元格:
Sub set_color()
Dim row As Integer, col As Integer
Set Rng = Sheet1.Range(Sheet1.Cells(1, 1), Sheet1.Cells(750, 1000))
row = Rng.Rows.Count
col = Rng.Columns.Count
Set new_rng = Sheet2.Range(Cells(1, 1), Cells(row, col))
new_rng.Columns.ColumnWidth = 0.54
new_rng.Rows.RowHeight = 5.75
For Each i In Rng
Sheet2.Cells(i.row, i.Column).Interior.Color = i.Value
Next
End Sub
运行几分钟,结果如下:
好了,仅仅复制原图到excel上面,没啥创意,妹子顶多瞄一眼。如果你会PS/美图秀秀等其他操作的话,无疑是惊喜,尤其当潜在对象是整天处理表格财务汪/审计狗时……
美图秀秀—油画效果
美图秀秀—素描效果
EXCEL效果如下:
素描效果—EXCEL展示
文章介绍完毕,如果想亲自动手制作的朋友,请走下面的快捷通道!
鉴于文章同时使用Python与VBA较为繁琐,且部分读者有自行操作的冲动,因此,文章接下来将探索如何制作一键生成EXCEL图像的可执行文本版本—即exe文件,供读者直接使用。
思路:
1、书写纯python代版本,实现作图;
2、使用pyinstaller制作EXE版本。
第一步
#文件python_final_editon.py 代码
#coding=utf-8from win32com import clientimport numpy as npfrom PIL import Imageimport sys#coding = utf-8import tkinter as tkfrom tkinter import filedialogimport osimport timefrom tkinter import messageboxdef jpg_image_to_array(image): """ Loads JPEG image into 3D Numpy array of shape (width, height, channels) """ im_arr = np.fromstring(image.tobytes(), dtype=np.uint8) im_arr = im_arr.reshape((image.size[1], image.size[0], 3)) return im_arrdef rgbToInt(rgb): colorInt = rgb[0] + (rgb[1] * 256) + (rgb[2] * 256 * 256) return colorIntdef get_txt(): my_filetypes = [('all files', '.*'), ('text files', '.txt')] application_window = tk.Tk() answer = messagebox.askyesno("关闭Excel", "是否关闭Excel?", parent=application_window) if not answer: "如果不关闭Excel,直接退出程序" sys.exit() file_name_abs = filedialog.askopenfilename(parent=application_window, initialdir=os.getcwd(), title="Please select a file:", filetypes=my_filetypes) path =os.path.join(file_name_abs) application_window.destroy() return pathstart = time.clock()path = get_txt()f = Image.open(path)f1 = f.convert("P").convert("RGB")arr = jpg_image_to_array(f1)arr2 = np.apply_along_axis(rgbToInt,2,arr)#------------call the excel com -------------width = arr2.shape[1]height = arr2.shape[0]print(width,height)E = client.Dispatch("Excel.Application")E.visible = FalseE.DisplayAlerts = FalseWB = E.Workbooks.Add()wt = WB.Worksheets("Sheet1")rng = wt.Range(wt.cells(1,1),wt.cells(height,width))rng.Columns.ColumnWidth = 1.75rng.Rows.RowHeight = 14.25i = 0size = height * widthprint("欢迎使用本软件,tc竭诚为您服务!","\n" "在开始前,请关闭所有的Excel!")for j in rng: j.Interior.Color = int(arr2[j.Row-1,j.Column-1]) i = i + 1 p = i / size now = time.clock() inteval = int(now - start) if inteval % 10 ==0: print("已经完成" + str(p),"请继续等待并不要打开Excel")final_path = path.split(".")[0] + ".xlsx"WB.SaveAs(Filename = final_path.replace("/","\\"))WB.Close(SaveChanges=0)del E
第二步
将python代码直接生成打包的exe文件
这里就不解释具体原理了,详细看Pysintaller库说明书
以下操作均在cmd中完成:
1、pip install pyinstaller #如果未安装包pyinstaller
安装成功之后,进入第二步
2、pyinstaller-D python_final_editon.py
等待片刻,就生成了exe文件,如图
包含EXE文件的文件夹
软件截图
软件操作方法
1)双击软件
2)在运行页面中,点击【是】;如果点击否,则直接退出程序
3)弹出文件对话框,选择需要制作EXCEL图像的文件(仅仅支持单选!)
4)等到程序运行到结束即可
run_tc1分钟前于你耳旁提醒
注意:
1、由于程序运行较慢,请耐心等待,建议在空闲时间运行;
2、运行程序需要关闭EXCEL,并在运行当中也不要打开EXCEL,防止出错;
3、如有反馈请留言,文章后续将做更新并优化,敬请期待
EXE文件地址:
链接:pan.baidu.com/s/1c2NfyA…密码:aha8
领取专属 10元无门槛券
私享最新 技术干货