Python-操作 Excel

阿里云双11来了!从本博客参与阿里云,服务器最低只要86元/年!

Python-高级-实用-操作 Excel

缘起

Excel 是我们日常工作学习中都会使用到的很重要的工具。但是处理过程中难免会遇到重复的操作,同时面对大量数据时手工操作也可能因为误操作导致错误发生。我们刚好在学习 Python, 那有没有办法通过 code 来读取 Excel 文件。

答案是肯定的,下面我们就使用 Python 来进行操作 Excel 文件。

模块选择

熟悉 Python 世界的读者,就会明白:在 Python 的世界里,做一件事情,官方建议只有一种方法。但是现实中,大佬太多,互相之间看不上别人做的东西,重复造轮子的现象比较严重。

如果百度或google 一下:“Python Excel”, 下面的几个第三方模块库常常出现在推荐列表中

  • openpyxl
  • xlsxwriter
  • xlutils
  • xlwings

经过实际的验证(验证过程略), 我挑选 xlwings 作为实际使用的模块。

xlwings 简介

众所周知,VBA 可以很高效的操作 Excel,提高办公效率。
在 Python 中,我们可以通过 pywin32 来调用 windows 系统的 API 来实现 VBA 的很多功能,但是写起来比较复杂。

xlwings 是基于 BSD-licensed 的一个 Python 第三方的模块,对 pywin32 进行了封装,可以很方便的和 Excel 进行交互,它有以下优点:

  • 语法接近 VBA
  • 可以用 Python 代码取代 VBA 编写宏
  • 在 windows 可以用 Python 编写 Excel 用户自定义函数
  • 全功能支持 Numpy Pandas matplotlib 等科学计算库
  • 支持 Windows 和 MacOS
  • 支持 Py3.3+

官方地址: https://www.xlwings.org/

入门使用

安装

推荐的方式

推荐使用 Anaconda 来安装,可以省去很多麻烦,

Anaconda 是一个包含了Python 常用模块的第三方整合的包,里面包含了很多实用的工具及模块,是Python 快速学习及开发比较推荐的方式。同时他也提供命令行工具 conda 方便来对模块进行安装,其功能类似于Python 官方的 pip 工具。

conda install xlwings

自己手动安装

当然自己手动安装也是可以的,下面是自己手动使用 pip 安装的过程。
使用 pip 安装,需要先手动安装 pywin32 , 这是一个将 OS 的一些底层操作进行高级封装的模块,简化了对系统的复杂操作。

下载地址:
https://sourceforge.net/projects/pywin32/files/pywin32/

安装 pywin32 后,使用 pip 安装 xlwings即可

pip install xlwings

xlwings的 官方安装文档,
https://docs.xlwings.org/en/stable/installation.html

基础使用

引入库

import xlwings as xw 

打开Excel程序,默认设置:程序可见,只打开不新建工作薄

app = xw.App(visible=True,add_book=False)
# 新建工作簿 (如果不接下一条代码的话,Excel会一闪而过就走了)
wb = app.books.add()

打开已有工作簿(支持绝对路径和相对路径)

wb = app.books.open('temp.xlsx')
# 也可以直接使用下面这条
#wb = xw.Book('temp.xlsx')
# 这样的话就不会频繁打开新的Excel

保存工作簿

wb.save('example.xlsx')

退出工作簿(可省略)

wb.close()

退出Excel

app.quit()

引用Excel工作表,单元格


# 引用工作表
sht = wb.sheets[0]
#sht = wb.sheets[第一个sheet名]
# 引用单元格
rng = sht.range('a1')
# rng = sht['a1']
# rng = sht[0,0] 第一行的第一列即a1,相当于pandas的切片
# 引用区域
rng = sht.range('a1:a5')
# rng = sht['a1:a5']
# rng = sht[:5,0]

实用例子

一份完整的sample 代码

我们把刚刚的过程,写到一起,再来回顾下函数的基础使用。

import xlwings as xw
# 打开一个新的 workbook 
wb = xw.Book()
# 打开当前目录已经存在的一个 workbook 
wb = xw.Book('temp.xlsx')
# 输入完整的路径打开一个 workbook 
FileName = "C:\\python\\to\\temp.xlsx"
# FileName = r"C:\python\to\temp.xlsx"
wb = xw.Book(fn)
# 打开 sheet 的三种方式
## 打开第一个 sheet
sheet = wb.sheets[0]
## 打开名字为 "zfh1005" sheet
sheet = wb.sheets["zfh1005"]
## 打开当前活动的 sheet
sheet = wb.sheets.active
# 读写数据到 sheet 
## 当前活动的 sheet 中读写一个单元格的数据
sht = wb.sheets.active
sht.range('A1').value = "zfh1005"
print(sht.range('A1').value)
## zfh1005
# 当前活动的 sheet 中读写一行单元格的数据
## 将列表储存在A1:C1中
sht.range('A1').value=["zfh1005","age","gender"]
print(sht.range('A1:C1').value)
## ['zfh1005', 'age', 'gender']
# #当前活动的 sheet 中读写一列单元格的数据
# 将列表储存在A1:A3中
sht.range('A1').options(transpose=True).value=["zfh1005",18,1]
print(sht.range("A1:A3").value)
## ['zfh1005', 18.0, 1.0]
sht.range('A1:A3').value = ["zfh1005", 20, 2]
print(sht.range("A1:A3").value)
## ['zfh1005', 18.0, 1.0]
## 当前活动的 sheet 中读写多行多列单元格的数据
## 将2x2表格,即二维数组,储存在A1:B2中,如第一行1,2,第二行3,4
wb = xw.Book()
sht = wb.sheets.active
sht.range('A1').options(expand='table').value=[[1,2],[3,4]]
print(sht.range("A1").expand().value)
## [[1.0, 2.0], [3.0, 4.0]]
## expand 的详细用法请参考文档
sht.range('A1:B2').value = [[1,2],[3,4]]
print(sht.range('A1:B2').value)
## [[1.0, 2.0], [3.0, 4.0]]

应用实例

有了上面的回顾后,我们再来一个实例来再学习一次。

需求:删除 Excel 文件中,满足条件的单元格所在的一整行.

我们的Excel 文件长这样。


image.png

你当然可以在Excel 中使用Excel 自带的方法,来实现去重的功能,但是那不是手动了吗?
现在是数据少的时候,如果数据多了呢?手动操作,出错的概率会大大的增加。

# python3
# -*- coding: utf-8 -*-
# @Date    : 2019-10-19 17:14:03
# @Author  : zfh1005 (zfh1005)
import xlwings as xw
fn = "temp.xlsx"
class DeleteTools(object):
    """
    删除满足某些条件的行
    data.xlsx 中有很多重复的数据    
    需要删除那些重复的
    """
    def __init__(self, fn):
        super(DeleteTools, self).__init__()
        self.ExistSet = set()
        self.ToDelList = list()
        self.fn = fn
    def rule(self, value):
        # 可以自定义规则来操作
        pass
    def Delete(self):
        # visible 控制 Excel 打开是否显示界面
        ## add_book 控制是否添加新的 workbook
        app = xw.App(visible=True, add_book=False)
        # app.display_alerts = False
        # 打开 temp.xlsx 文件到 wookbook 中
        wb = app.books.open(fn)
        # 切换到当前活动的 sheet 中
        sheet = wb.sheets.active
        # 选择 A1 所在的一列
        ## 当 Excel 格式复杂的时候,不建议使用 expand
        ## 可以这样选择
        ARange = sheet.range("A1:A100")
        # ARange = sheet.range("A1").expand("download")
        for A in ARange:
            if str(A.value).strip() not in self.ExistSet:
                self.ExistSet.add(str(A.value).strip())
            else:
                # address = A.address
                ## 获取 A 所在的位置坐标
                self.ToDelList.append(A.address)
                ## print(A.value)
        while self.ToDelList:
            td = self.ToDelList.pop()
            # 删除 A 所在的一行
            sheet.range(td).api.EntireRow.Delete()
        
        # 保存 wookbook
        ## 相当于Excel 的 Ctrl+S 快捷键
        sheet.autofit()
        wb.save()
        app.quit()
if __name__ == '__main__':
    d = DeleteTools(fn)
    d.Delete()

结束语

通过 xlwings 模块去自动操作 excel , 将日常需要手动操作的过程通过代码来自动操作,减少犯错的可能,一次次的不犯错,就是巨大的成功,在迎娶“白富美”的路上越走越远了。

https://www.jianshu.com/p/8ce221a29118

Python量化投资网携手4326手游为资深游戏玩家推荐:《自由之战下载

「点点赞赏,手留余香」

    还没有人赞赏,快来当第一个赞赏的人吧!
0 条回复 A 作者 M 管理员
    所有的伟大,都源于一个勇敢的开始!
欢迎您,新朋友,感谢参与互动!欢迎您 {{author}},您在本站有{{commentsCount}}条评论