![article header image](http://pbpython.com/images/article-overview.png)

简介

我已经写了好几 次关于pandas作为一个数据操纵/扯皮工具,以及它是如何能够有效地从Excel读取或写入数据,是多么的好用。但是,在有些你需要为数据分析提供一个交互式环境的情况下,试图在纯Python中,以一种用户友好的方式将它们拖到一起,将是困难的。这篇文章将会讨论如何使用xlwings来将Excel, Python和pandas绑定在一起,以构建一个数据分析工具,这个工具从一个外部的数据库中提取信息,操纵它,并且以一种熟悉的电子表格格式将其呈现给用户。

一个快速的Excel自动化简介

Excel使用VBA支持一些自动化选项。用户定义函数(UDF,User Defined Functions)是相当简单的,它们接收输入,然后返回一个简单的值。更强大的选择是一个宏(或过程),它们可以自动完成几乎任何Excel可以做到的事。

尽管UDF和宏是强大的,但是它们仍然是用VBA写的,而有时候,将Python的力量带给我们基于Excel的解决方法会非常有用。这就是xlwings的用武之地。最简单地说,xlwings允许我们以两种主要方式粘合python和Excel:

在Python中控制Excel

在Excel中调用自定义的Python代码

本文将重点构建一个调用你自定义的Python代码的Excel工作表。

问题是……

在这个例子中,我们将开发一个简单的建模应用,它将允许某人输入一个账号以及日期范围,然后返回一些已经通过pandas转化的总结的销售信息。解决方法是简单的,但它显示了这种结合的威力,以及执行一些更复杂的数据分析有多么简单。

这里是一个我们正在试图做的事情的图表:

下面的例子可以很容易地扩展到查询多个数据库,或者与任何Python可以读取的文件(CSV, Excel, json等等)进行交互。

安装环境

为了达到这篇文章的目的,我将假设你在一个基于Windows的系统上运行该应用。我强烈建议你使用anaconda (或者miniconda)作为你选择的发行版本。

我们需要做的第一件事是安装xlwings(假设python+pandas已经安装好了):

conda install xlwings

版本警告

xlwings在不断的更新中。这个代码时基于0.7.1版本的。

有一个漂亮的名为quickstart的xlwings帮助函数,它会为你创建一个Excel文件样例和Python文件桩。

c:\>xlwings quickstart pbp_proj

如果你看一看新创建的pbp_proj目录,那么你将看到两个文件:

pbp_proj.py

pbp_proj.xlsm

其中,Python文件是空的,而Excel看上去也是空的,但是,幕后已经完成了一些工作,以使得excel到Python接口更加容易。

要看看Excel文件中有啥,请在Excel中打开你新创建的文件,然后选择Developer -> Visual Basic,然后你应该可以看到一些像这样的东东:

你会发现有两个模块 - xlwings和Module1。xlwings模块包含所有的VBA代码,从而使得你自定义的代码可用。在大多数情况下,你应该不要管它。然而,如果你的配置有问题(例如无法找到Python),那么你可以在这里更新配置信息。

Module1将有一些默认代码,它们看起来是这样的:

一会,我们将修改它来调用我们自定义的代码。首先,我想要创建Excel输入文件。

对于这个应用,我们将允许用户输入一个账号,开始日期和结束日期,然后将基于这些输入操纵销售日期。

下面是简单的电子表格:

我只是做了一些小的格式修改,这些格子中并没有公式。请务必将修改保存到Excel文件中。

下一步,我将创建一个简短的Python函数,它说明了如何从Excel中读取数据,然后将数据写回到Excel中。我将保存它到一个名为pbp_proj.py的空文件中。

import pandas as pd

from xlwings import Workbook, Range

def summarize_sales():

"""

Retrieve the account number and date ranges from the Excel sheet

"""

# Make a connection to the calling Excel file

wb = Workbook.caller()

# Retrieve the account number and dates

account = Range('B2').value

start_date = Range('D2').value

end_date = Range('F2').value

# Output the data just to make sure it all works

Range('A5').value = account

Range('A6').value = start_date

Range('A7').value = end_date

该程序是简单的,但现在还没啥用。我想,为了确保所有的“管道”各就各位,开发一个框架程序更容易些。要记住的关键一点是,这个文件名为pbp_proj.py,而函数名为summarize_sales。

要将这一切写在一起,我们需要定义一个Excel过程来运行我们的代码:

代码时相当简洁的,它只是导入该模块,然后执行函数:

Sub RetrieveSales()

RunPython ("import pbp_proj;pbp_proj.summarize_sales()")

End Sub

最后一块是添加一个按钮到我们的表单中,然后将其分配给程序/宏RetrieveSales。

一旦你有了这个,你应该可以按下按钮,然后看到像这样的东东:

基本过程已经有了,我们可以从Excel读取到Python程序中,然后使用读取的数据来输出数据到Excel。现在,让我们使其更有用些。

从数据库中读取数据

在这个例子中,我将使用sqlalchemy来查询一个小的sqlite db,然后直接将读取查询到一个pandas dataframe中。这种方法的好处是,如果你决定要查询另一个数据库,那么你可以只是修改slqlalchemy引擎,然后保持你的代码的剩余部分不变。作为参考,xlwings网站给出了另一个例子,作为进一步的参考,这个例子应该很有帮助。

在处理代码之前,确保安装了sqlalchemy:

conda install sqlalchemy

下面是如何通过使用到数据库的完整路径来连接到该sqlite引擎:

from sqlalchemy import create_engine

# Connect to sqlite db

db_file = os.path.join(os.path.dirname(wb.fullname), 'pbp_proj.db')

engine = create_engine(r"sqlite:///{}".format(db_file))

现在,我们有引擎了,我们可以构建并执行查询,然后将结果读取到一个dataframe中:

# Create SQL query

sql = 'SELECT * from sales WHERE account="{}" AND date BETWEEN "{}" AND "{}"'.format(account, start_date, end_date)

# Read query directly into a dataframe

sales_data = pd.read_sql(sql, engine)

一旦我们将数据保存在sales_data dataframe中,我们可以做任何我们想做的事情。为了简便起见,我会做一个简单的groupby,然后是总支出的sum:

# Analyze the data however we want

summary = sales_data.groupby(["sku"])["quantity", "ext-price"].sum()

total_sales = sales_data["ext-price"].sum()

幸运的是,xlwings“理解”pandas dataframe,因此将值返回到Excel工作表中很简单:

Range('A5').value = summary

Range('E5').value = "Total Sales"

Range('F5').value = total_sales

这样就完成数据Excel -> Python -> Excel的往返。

完整的程序

这里是包含在pbp_proj.py中的全功能代码:

import pandas as pd

from sqlalchemy import create_engine

from xlwings import Workbook, Range

import os

def summarize_sales():

"""

Retrieve the account number and date ranges from the Excel sheet

Read in the data from the sqlite database, then manipulate and return it to excel

"""

# Make a connection to the calling Excel file

wb = Workbook.caller()

# Connect to sqlite db

db_file = os.path.join(os.path.dirname(wb.fullname), 'pbp_proj.db')

engine = create_engine(r"sqlite:///{}".format(db_file))

# Retrieve the account number from the excel sheet as an int

account = Range('B2').options(numbers=int).value

# Get our dates - in real life would need to do some error checking to ensure

# the correct format

start_date = Range('D2').value

end_date = Range('F2').value

# Clear existing data

Range('A5:F100').clear_contents()

# Create SQL query

sql = 'SELECT * from sales WHERE account="{}" AND date BETWEEN "{}" AND "{}"'.format(account, start_date, end_date)

# Read query directly into a dataframe

sales_data = pd.read_sql(sql, engine)

# Analyze the data however we want

summary = sales_data.groupby(["sku"])["quantity", "ext-price"].sum()

total_sales = sales_data["ext-price"].sum()

# Output the results

if summary.empty:

Range('A5').value = "No Data for account {}".format(account)

else:

Range('A5').options(index=True).value = summary

Range('E5').value = "Total Sales"

Range('F5').value = total_sales

这里是结果样例:

All of the data, including the sqlite db is in my github 所有的数据,包括sqlite db,都在我的github repo中

总结

xlwings提供了从Python与Excel无缝交互的一个有用的功能。通过使用此代码,你可以为你自己或那些从多个源获取数据,并且在非常熟悉的Excel环境中分析数据的非技术用户,轻松构建交互式工具。一旦建立起了结构,那么将所有复杂的逻辑和数据分析放到Python文件中,并利用所有在Python生态系统中提供的工具,这将是非常有用的。我希望,一旦你开始玩这个,那么你会发现有很多机会来使用这个方法将Python解决方法带给你的一些陷入使用Excel作为他们唯一的数据分析工具的非技术用户。

python和excel进行数据交换_python-doc/使用Python和Excel进行交互式数据分析.md at master · HSUCHING/python-doc · GitHub...相关推荐

  1. python爬取网页数据软件_python爬虫入门10分钟爬取一个网站

    一.基础入门 1.1什么是爬虫 爬虫(spider,又网络爬虫),是指向网站/网络发起请求,获取资源后分析并提取有用数据的程序. 从技术层面来说就是 通过程序模拟浏览器请求站点的行为,把站点返回的HT ...

  2. python中查看表头的函数_Python中也可以写Excel中的“Vlookup”函数?太牛逼了吧!...

    原标题:Python中也可以写Excel中的"Vlookup"函数?太牛逼了吧! Vlookup函数,可以算是一个数据专员必须要会使用的基本函数了,确实很好用.但是你可能会注意到, ...

  3. python爬取天气数据山东_Python的学习《山东省各城市天气爬取》

    Python+scrapy爬取山东各城市天气预报 1.在命令提示符环境使用pip install scrapy命令安装Python扩展库scrapy,详见Python使用Scrapy爬虫框架爬取天涯社 ...

  4. python爬取网站数据步骤_python怎么爬取数据

    在学习python的过程中,学会获取网站的内容是我们必须要掌握的知识和技能,今天就分享一下爬虫的基本流程,只有了解了过程,我们再慢慢一步步的去掌握它所包含的知识 Python网络爬虫大概需要以下几个步 ...

  5. python各种类型的数据拼接_python基础2 数据类型、数据拼接、数据转换

    一.数据类型 1.字符串 字符串英文string,简写str,只要是被[单/双/三引号]这层皮括起来的内容,不论那个内容是中文.英文.数字甚至火星文.只要是被括起来的,就表示是字符串类型 如:prin ...

  6. python网络爬虫的第三方库_Python常用第三方库_网络爬虫、数据分析与WEB开发、机器学习...

    Python语言有超过12万个第三方库,覆盖信息技术几乎所有领域.下面简单介绍下网络爬虫.自动化.数据分析与可视化.WEB开发.机器学习和其他常用的一些第三方库,如果有你感兴趣的库,不妨去试试它的功能 ...

  7. android excel读取和写入_Python科普帖 csv amp; excel

    0 存储数据的方式 常用的存储数据的方式有两种--存储成csv格式文件.存储成Excel文件(不是复制黏贴的那种).前面,我有讲到json是特殊的字符串.其实,csv也是一种字符串文件的格式,它组织数 ...

  8. 用matlab处理表格,matlab删除excel表格数据-如何用matlab处理多个excel表格中的数据...

    如何用matlab处理多个excel表格中的数据 biao='D:\Program Files\matlab\bin\filename.xls'; A1=xlsread (biao,'Sheet1', ...

  9. matlab批量导入excel表格数据,matlab导入excel表格数据-如何用matlab读取多个excel表格数据,将每个表格数......

    如何用matlab读取多个excel表格数据,将每个表格数... 一xlsread()函数,比import简单的多,具体语句:A = xlsread('yourfilename.xls')望高手支招! ...

  10. matlab 里的数据粘贴不出来怎么办,为什么excel表格数据复制不出来怎么办_为什么excel中内容不能复制粘贴...

    excel里面的数字为什么复制不出来怎么办 因为是带公式的,直接复制到另张表中.公式中的单元格会相对变动的. 你可以这样操作 复制这个和, 然后选中你要粘的位置 右击菜单-选择性粘贴-数值. exce ...

最新文章

  1. bugku 杂项 就五层你能解开吗_你能解开这个和数字有关的逻辑解谜游戏吗? | 每日一考...
  2. 干货:一文彻底弄懂递归如何解题
  3. 中国联邦学习「五大流派」
  4. Python xrange与range的区别
  5. [转]PCB 设计中敷铜的注意事项
  6. 并发数据结构-1.1.2 阻塞技术
  7. OpenGL的glScissor示例程序
  8. 反射 + 抽象工厂模式切换不同的实现方法
  9. 软件设计师1991下午试题1(流程图解析)
  10. C# EXCEL 透视表使用 多行多列的导出透视表
  11. Pytorch 入门之数据处理 -- Dataset、Sampler、DataLoader
  12. Scrapy框架——CrawlSpider爬取某招聘信息网站
  13. 能查阅国外文献的8个论文网站(最新整理)
  14. 嵌入式面试经典30问
  15. 485通讯( 详解 )
  16. Java就业面试问题大全
  17. python聊天室socket+tkinter_基于socket和tkinter的python网络聊天室程序
  18. [BJOI2019] 排兵布阵
  19. 远程桌面TeamViewer, 向日葵, NoMachine 和 远程控制MobaXterm软件
  20. 小红书3大新功能上线,提升笔记转化率和品牌投放效果

热门文章

  1. nn.module 看图搭建网络
  2. 华为热设计工程师待遇_【华为热设计工程师面试】华为的面试是我面试过程中相对简单的一个。-看准网...
  3. 一维数组实验题:大奖赛现场统分。已知某大奖赛有n个选手参赛,m(m>2)个评委为参赛选手评分(最高10分,最低0分)。统分规则为:在每个选手的m个得分中,去掉一个最高分和一个最低分后,取平均分作为该选
  4. PS暂存盘已满怎么办
  5. 电脑显示your pc android,新版DeX模式不再强调手机变PC,而是让Android融合PC
  6. 【每日一读】SWOPE:Efficient Approximate Algorithms for Empirical Entropy and Mutual Information
  7. linux mint字体缺失,WPS for Linux【Debian、Ubuntu、Deepin、Linux Mint】字体缺失解决【批量字体安装】...
  8. Word控件Spire.Doc 【页面设置】教程(1):在C#/VB.NET:在 Word 文档中插入分页符
  9. 易康EPS2的使用(一)
  10. Ubuntu 18.04 究极美化教程