首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

使用EXCEL画画-送给撩妹的你

作者简介

原作: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

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180416G1FRXO00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券