[返回电脑前线首页]·[所有跟帖]·[ 回复本帖 ] ·[热门原创] ·[繁體閱讀]·[版主管理]
Python:Excel自动化实践入门篇
送交者: wecode[★品衔R6★] 于 2023-12-22 16:39 已读 4893 次  

wecode的个人频道

说起办公自动化就离不开对 excel 表格的处理,现在哪个办公族不得每天面对着几份 excel 过日子?那么有没有想过,让机器帮我们自动处理这些杂活,而我们应该留给自己更多的时间去做一些更有意义的事情?今天就带大家一起来看看怎么用 python 自动化处理 excel 表格!而处理 excel 表格的 python 功能库有很多,常用的是 openpyxl。openpyxl 库可以对 excel 表格做什么呢?比如读写、算术、绘制图表等等。安装 openpyxl

openpyxl 库不是 python 的自带模块,属于第三方模块,所以需要额外安装才能使用。

在安装 openpyxl 库之前,建议先配置好 python 工程的虚拟环境 venv。这里不展开介绍如何配置虚拟环境,有需要可以点击 《Python:界面开发,wx入门篇 上》前往查看。

本文以下内容基于 windows 10 和 Python3.

终端输入

pip install openpyxl

终端输出


由于下面的介绍会用到图片操作的功能,所以还需要安装 Pillow 库。

终端输入

pip install pillow

终端输出


看看最后的安装成果,终端输入

pip list

终端输出





创建 excel 表格文件

最简单的自动化操作就是创建一个 excel 空白表格文件,暂定文件名为 test.xlsx,然后随意写点什么进去

import openpyxl 6park.com

workbook = openpyxl.Workbook()

sheet = workbook.active 6park.com

sheet['A1'] = 'hello pytho excel !'

workbook.save(filename="./test.xlsx")

上面的代码先是导入了库 openpyxl,然后实例化工作簿类 Workbook,通过工作簿的属性 active 获取到活跃的工作表 sheet。

基于字典的操作方式,对工作表 sheet 的 A 列 1 行写入字符串 ‘hello pytho excel !’。如果你使用过 excel 表格,会记得 excel 表格的行是从 1 开始的,列是从 A 开始的。

最后调用工作簿的 save 方法写入硬盘,自动生成文件 test.xlsx。

好了,代码写好怎么跑起来呢?

把上面写好的代码保存到文件(.py)中,我这里随意定为 main.py,然后在令行终端里输入并回车就会执行起来

python main.py

执行完毕后,打开程序创建好的 excel 文件 test.xlsx 看看


看起来效果很好。




写入

上面已经知道了怎么创建新的 excel 表格文件,那么怎么在已有的 excel 表格文件的指定单元格 cell 写入内容呢?

上面介绍的方法 Workbook() 会覆盖原有文件,为了不覆盖现有文件,可以改用方法 load_workbook() 同时传入文件名以加载现有的工作簿。

指定单元格有两种方式,通过表格 sheet 的方法 cell() 或者表格 sheet 直接引用单元格名称。

比如

a2 = sheet.cell(row = 2, column = 1)

a3 = sheet['A3']

找到了单元格 cell,又怎么写入内容呢?直接赋值还是修改属性值?答案是都可以,直接赋值就是对单元格 cell 对象赋值(要求引用单元格名称),修改属性是对单元格 cell 对象的 value 属性赋值

a2.value = "修改属性1"

a3.value = "修改属性2"

sheet['A4'] = "直接赋值"

来一段完整的代码

import openpyxl 6park.com

workbook = openpyxl.load_workbook("./test.xlsx")

sheet = workbook.active 6park.com

a2 = sheet.cell(row = 2, column = 1)

a3 = sheet['A3'] 6park.com

a2.value = "修改属性1"

a3.value = "修改属性2"

sheet['A4'] = "直接赋值" 6park.com

workbook.save(filename="./test.xlsx")

看看运行效果


如果我们需要往表格里追加大量的数据呢?总不能像上面那样往单元格一个一个地写入吧?

可以使用表格 sheet 的 append() 方法一次性写入一行数据

import openpyxl 

  

workbook = openpyxl.load_workbook("test.xlsx")

sheet = workbook.active 6park.com

data = (

    ('a', 'b', 'c'),

    ('d', 'e', 'f')

)  

for row in data:

    sheet.append(row) 6park.com

workbook.save('test.xlsx')

看看实际效果

6park.com




读取

上面介绍了怎么对 excel 表格写入内容,那么怎么读出来呢?

读取单元格内容,可以直接读取单元格 cell 的属性 value 值

print(f"{sheet['A4'].value}")

print(f"{sheet.cell(row = 4,

                    column = 1).value}")

那么如果需要一次性读取一个区域的数据呢?

方法有两种,一种通过遍历指定区域内每个单元格的方式,另一种是通过单元格名称批量读取。

先介绍第一种:需要遍历每个单元格的内容,那么就需要知道行列的最大数量用于控制单元格循环遍历的次数,分别对应表格 sheet 的属性 max_row 和属性 max_column。

下面来试一下把第一列和第二行的所有单元格内容读取并打印出来

import openpyxl 6park.com

workbook = openpyxl.load_workbook("test.xlsx") 

sheet = workbook.active 

  

row = sheet.max_row

column = sheet.max_column

print(f"Total Row num: {row}")

print(f"Total Column num: {column}") 6park.com

print(" Value of first column:")

for i in range(1, row + 1):

    print(sheet.cell(row = i,

                        column = 1).value) 6park.com

print(" Value of second row")

for i in range(1, column + 1):

    print(sheet.cell(row = 2,

                        column = i).value,

            end = " ")

终端输出


接着介绍第二种:通过表格的单元格名称批量读取时,单元格名称分别对应矩形区域的左上角和右下角的单元格名称。这种方式类似对列表的切片操作。

下面来试一下批量读取单元格 A4 到单元格 C6 的矩形区域的内容,并打印出来

import openpyxl 6park.com

workbook = openpyxl.load_workbook("test.xlsx") 

sheet = workbook.active  6park.com

cell_obj = sheet['A5:C6']

for cell1, cell2, cell3 in cell_obj:

    print(cell1.value,

            cell2.value,

            cell3.value)

终端输出

6park.com

喜欢wecode朋友的这个贴子的话, 请点这里投票,“赞”助支持!
[举报反馈]·[ wecode的个人频道 ]·[-->>参与评论回复]·[用户前期主贴]·[手机扫描浏览分享]·[返回电脑前线首页]
帖子内容是网友自行贴上分享,如果您认为其中内容违规或者侵犯了您的权益,请与我们联系,我们核实后会第一时间删除。

所有跟帖:        ( 主贴楼主有权删除不文明回复,拉黑不受欢迎的用户 )


    用户名:密码:[--注册ID--]

    标 题:

    粗体 斜体 下划线 居中 插入图片插入图片 插入Flash插入Flash动画


         图片上传  Youtube代码器  预览辅助

    打开微信,扫一扫[Scan QR Code]
    进入内容页点击屏幕右上分享按钮

    楼主本栏目热帖推荐:

    >>>>查看更多楼主社区动态...






    [ 留园条例 ] [ 广告服务 ] [ 联系我们 ] [ 个人帐户 ] [ 版主申请 ] [ Contact us ]