Python+xlwings操作Excel实战

Excel是全世界最普及最强大的办公软件,应该没有之一。excel就相当于是一只老虎,python相当于是一双翅膀,两者结合将产生“如虎添翼”的效果。好了,不卖关子了,今天我们要跟大家说到的是excel+xlwings(xlwings是一个Python包),能直接在excel中执行python代码。这意味着什么?意味着你的excel已经具备编程的能力了!比如你可以在excel中一键抓取数据直接存储下来,比如面对VBA比较棘手的问题用xlwings(本质上还是python)可以轻松解决,比如可以提高大文件处理速度......更多的可以尽情的想象!

一、先来说个例子

我相信看完以上这段话后,很多人还是持有怀疑的态度,所以我先直接来上一个案例,让大家比较直观的感受一下“excel飞一样”是什么感觉。这里以一个融资机构员工的日常为例,他可能每天需要查看一下独角兽公司的榜单,如果按照正常的,要打开浏览器访问 https://www.itjuzi.com/unicorn,然后获取信息。如果想要记录每天的数据,还得一个个手动记录下来,繁杂程度可想而知。这时候我们可以通过xlwings,自动帮我抓取数据,然后保存数据,甚至自动的做一些计算,大大提高了我们的工作效率。以下用一个动态度来感受一下:

在这里插入图片描述

可以看到,我只要点击一下excel中的一个按钮,便能自动的下载数据。现在还只是少量数据,如果数据量比较多,获取数据步骤比较复杂,用代码操作的优势会更加的明显。

二、怎么操作

如果能坚持看到这里的朋友,说明对这玩意儿还是挺认可的。那么接下来我就详细的讲一下这个东西的配置。建议先收藏一下,步骤有点多,然后找个时间练练,有问题欢迎关注公众号:pythonjs,私信咨询。

先来说下需要准备的东西吧:

  1. Excel自然不用说了,最好是用微软的Office,毕竟WPS有些地方有点不同,会造成学习的困扰。
  2. Python(3.6以上版本),可以在python官网:python.org下载,也可以私信我,我给你发软件。
  3. 安装完python后需要下载一些包,包括网络请求的requests库,xlwings,以及pandas,还有一个pywin32。包安装的方式是在cmd中通过pip安装,比如pip install requests。这里不再赘述,python基础课程可以加VX:zhiliaoketang008,即可免费获取。

东西准备好了后,咱们再来详细讲解一下如何配置,这过程稍微有点复杂,建议先收藏,以后慢慢看。

第一步、开启宏支持:

Excel 文件 - 选项 - 信任中心 - 宏设置 - 启用所有宏


在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

第二步、显示“开发工具”选项卡:

Excel选项 - 自定义功能区 - 开发工具(勾选)


在这里插入图片描述

这样,我们在excel文件菜单栏中就能看到“开发工具”选项了:


在这里插入图片描述

第三步、另存为启用宏的工作簿(*.xlsm):

在这里插入图片描述

然后在类型中,选择xlsm格式的:


在这里插入图片描述

第四步、在菜单栏中显示xlwings选项卡:

找到xlwings安装目录下的addin文件夹(在python的site-packages目录下。比如我的python是安装在C:\python中,那么路径就是:C:\python\Lib\site-packages\xlwings\addin),然后有一个叫做“xlwings.xlam”文件,我们双击它,再回到excel文件,就能在菜单栏中看到xlwings选项卡了。


在这里插入图片描述

以上设置完成后,还需要在VBA中进行引用的设置。开发工具 - 查看代码


在这里插入图片描述

然后点击工具 - 引用,找到xlwings,点击确定即可。
在这里插入图片描述

第五步、设置excel中的python解释器和执行文件:

在xlwings选项卡的左边,有一个Interpreter,这个是用来设置python解释器的,我们只要把python的安装路径拷贝进入,然后加上\python.exe就可以了(同理,比如我的python是安装在C:\python,那么我的解释器路径就是C:\python\python.exe)。

另外有一个PYTHONPATH,这个是用来设置你的python代码文件路径。比如我是放到D:\XX20200316\路径下的app.py文件中,那么PYTHONPATH设置就是D:\XX20200316\路径下的app.py。以上看似复杂,其实只要依葫芦画瓢即可。当然有任何问题也可以私信我。

第六步、开始编写python代码:

在这里,我们就可以找到之前说的那个app.py,也就是PYTHONPATH设置的那个文件,然后写入抓取数据的代码,以及保存数据的代码了。代码具体细节不展开来讨论,这里面的语法比较多,如果想要学习python的,可以私聊我获取视频课程。代码如下:

import xlwings as xw
import requests
import pandas as pd

# IT桔子爬虫
class ITJuziSpider:
def __init__(self):
    self.url = "https://www.itjuzi.com/api/nicorn?com_name="
    self.headers = {
'User-Agent': "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.132 Safari/537.36",
"authorization": '"bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJodHRwczpcL1wvd3d3Lml0anV6aS5jb21cL2FwaVwvYXV0aG9yaXphdGlvbnMiLCJpYXQiOjE1ODQzNTA4MTUsImV4cCI6MTU4NDM1NDQxNSwibmJmIjoxNTg0MzUwODE1LCJqdGkiOiI3eHVCTGpwVFB2cHRRam5WIiwic3ViIjo4MjE0NjMsInBydiI6IjIzYmQ1Yzg5NDlmNjAwYWRiMzllNzAxYzQwMDg3MmRiN2E1OTc2ZjciLCJ1dWlkIjoiUG1lQms0In0.YyDMDbphFcn7dMehLD2cBU2UTfRE34TFqFXykygVX8U"',
"cookie": '_ga=GA1.2.1593594823.1584350704; _gid=GA1.2.1296895333.1584350704; Hm_lvt_1c587ad486cdb6b962e94fc2002edf89=1584350704; juzi_user=821463; juzi_token=bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJodHRwczpcL1wvd3d3Lml0anV6aS5jb21cL2FwaVwvYXV0aG9yaXphdGlvbnMiLCJpYXQiOjE1ODQzNTA4MTUsImV4cCI6MTU4NDM1NDQxNSwibmJmIjoxNTg0MzUwODE1LCJqdGkiOiI3eHVCTGpwVFB2cHRRam5WIiwic3ViIjo4MjE0NjMsInBydiI6IjIzYmQ1Yzg5NDlmNjAwYWRiMzllNzAxYzQwMDg3MmRiN2E1OTc2ZjciLCJ1dWlkIjoiUG1lQms0In0.YyDMDbphFcn7dMehLD2cBU2UTfRE34TFqFXykygVX8U; Hm_lpvt_1c587ad486cdb6b962e94fc2002edf89=1584350929; _gat_gtag_UA_59006131_1=1',
"referer": 'https://www.itjuzi.com/unicorn',
"curlopt_followlocation": "true"
    }


def run(self):
    # 获取当前excel对象
    wb = xw.Book.caller()
    sheet = wb.sheets[0]
    # 爬取数据,非常简单的代码
    resp = requests.get(self.url,headers=self.headers)
    result = resp.json()
if "data" in result and "data" in result['data']:
      companies = result['data']['data']
      names = list(companies[0].keys())
      data_list = []
for company in companies:
        values = list(company.values())
        data_list.append(values)
      # 变成一个dataframe对象
      df = pd.DataFrame(data=data_list,columns=names)
# 设置到excel文件中
      sheet.range("A4").options(index=False).value = df

第七步:插入按钮,绑定宏:

我们在excel中创建一个按钮,然后给按钮绑定一个宏,然后再在宏中调用刚刚写好的python代码,就是这么简单。

开发工具 - 插入 - 表单控件(按钮):


在这里插入图片描述

选中按钮,右键,指定宏,点击编辑:


在这里插入图片描述

在这里插入图片描述

写入以下代码:
在这里插入图片描述
Sub hi()
RunPython ("from app import ITJuziSpider; ITJuziSpider().run()")
End Sub

最后,点击按钮,代码就能执行起来了。当然你的执行过程可能会报错,这中间还涉及到一些包的版本问题。遇山开山,遇水搭桥,报什么错,到百度上搜索一下,很多问题都是别人遇到过的。

没有接触过编程的朋友,看起本文来肯定比较吃力,这个是能理解的。这也正说明了一个问题,你的能力需要提升了,python现在已经把“魔抓”伸向自动化办公的领域了,也许今天你手动操作还依然能扛得住,但是三年、四年之后,你的这点体力活会被代码无情的代替了。不要愤怒,这就是现实,适者生存。

最后还是一样,代码可以关注公众号:pythonjs,回复“xlwings”,即可免费获取!

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,402评论 6 499
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,377评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,483评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,165评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,176评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,146评论 1 297
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,032评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,896评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,311评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,536评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,696评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,413评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,008评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,659评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,815评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,698评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,592评论 2 353

推荐阅读更多精彩内容