如何用Python操作Excel自动化办公?一个案例教会你openpyxl——公式计算和数据处理

《如何用Python操作Excel自动化办公?一个案例教会你openpyxl——公式计算和数据处理》

术业有专攻,每一种工具每一种岗位都会有资深玩家,别说因为人人都会Excel就瞧不起Excel玩的溜的朋友。对于运营场景来说,能够和具体业务结合紧密,轻松实现目的,这就是很强大的玩家,但是如果精于提高技能水准来说,可能需要扩大技术的应用场景,强调通用性。

openpyxl等Python辅助办公工具就是在Excel基础上提升效率而产生。所以不必纠结某种工具不能实现什么,而看它能实现什么,不能实现的就找其他工具来弥补,解决问题不就完了么?

上一篇讲解了如何用openpyxl读Excel表格,可以看到其实跟我们操作Excel的步骤是一样的。本篇内容就在讲读取数据之后如何处理数据、公式计算。我们要解决一个问题:怎么读入工作簿,对数据求和、计数、修改数据、增加数据、筛选,然后将内容添加到一个新生成的工作簿中。

步骤很简单:生成新工作簿,读入已有工作簿,获取单元格数据,修改单元格数据,写入新工作簿。

1. 生成新工作簿

from openpyxl import  Workbook 
# 实例化   前一篇中导入EXxcel表格没有提实例化,这里是因为要新建一个空的工作簿,无中生有,所以需要实例化,意思就是新建一个实例
wb = Workbook()
# 激活 worksheet  指定操作数据的具体工作表
ws = wb.active

这样我们就生成了一张新的工作簿。接下来需要写内容,内容从已有的工作簿中来,那就需要导入工作簿。

2. 导入已有工作簿

导入已有工作簿,并读取6列10行的数据并打印显示:

from openpyxl import load_workbook
from openpyxl.utils import get_column_letter, column_index_from_string
wbo = load_workbook(r"D:\testOrders.xlsx")
wso = wbo.active
Cellarea1 = wso['A1:F10']
for col in Cellarea1:
    for cell in col:
        print(cell.value,end=",")
    print()

《如何用Python操作Excel自动化办公?一个案例教会你openpyxl——公式计算和数据处理》

我想把第6列第5行的值改为799,怎么办?

3. 输入公式

3.1 输入单个公式

wso['F5'] = 799  #直接将值赋给工作表指定单元格地址就可以。中括号表示切片,里面是字符串,一定记住要加引号,字母表示列号,数字表示行号。

《如何用Python操作Excel自动化办公?一个案例教会你openpyxl——公式计算和数据处理》

我想把第六列[1:10]的SalesAmount值求和怎么办?可以直接在单元格输入公式:

print("输入公式之前G10单元格值:",wso['G10'].value)
wso['G10'] = "=SUM(F1:F10)"
print("输入公式之后G10单元格值:",wso['G10'].value)

《如何用Python操作Excel自动化办公?一个案例教会你openpyxl——公式计算和数据处理》

输入之前单元格G5实际是没有值的,所以返回None,输入公式之后返回了公式的内容。这是怎么回事呢?我们想要公式的结果呀,这里就需要操作一步,在读取文件的时候设置data_only=True参数,然后保存文件,公式才能生效。

load_workbook方法中涉及到较多的属性,包括read_only,keep_vba,guess_types,data_only等。data_only用于读取cell中的值,当单元格中的值是一个公式的时候,会返回计算到的结果。data_only 控制具有公式的单元格是否具有公式(默认值)或上次Excel读取工作表时存储的值。

wbo = load_workbook(r"D:\testOrders1.xlsx",data_only=True)
wso = wbo.active
print(wso['G10'].value)
wso['G10'] = "=SUM(F1,F10)"
print(wso['G10'].value)
wbo.save("testOrders2.xlsx")

《如何用Python操作Excel自动化办公?一个案例教会你openpyxl——公式计算和数据处理》

《如何用Python操作Excel自动化办公?一个案例教会你openpyxl——公式计算和数据处理》

现在我不求和,而是对F列的每个值都四舍五入取整怎么办呢?涉及到单元格区域每个单元格,那就需要用到循环了。我们平时在Excel中先在一个单元格写好公式然后复制粘贴或者拖动小十字应用到别的单元格,这里我一次性就给要写公式的单元格写好。

3.2 批量输入公式

for j in range(2,11):
    cell_F = 'F' + str(j)
    cell_G = 'G' + str(j)
    wso[cell_G] = "=ROUND({},0)".format(cell_F)

《如何用Python操作Excel自动化办公?一个案例教会你openpyxl——公式计算和数据处理》

《如何用Python操作Excel自动化办公?一个案例教会你openpyxl——公式计算和数据处理》

看这样我们就把输入公式的方法给解决了,使用其他公式也照着这个方法就可以。如果我们想知道有多少公式怎么办呢?

3.3 查询支持公式

下面的代码告诉你怎么找公式:

from openpyxl.utils import FORMULAE  #导入公式包
print(len(FORMULAE))   #判断总共有多少公式
print('SUM' in FORMULAE)  #查看所写的公式是否支持
print('sum' in FORMULAE)  #公式名要大写,否则会出现错误

如果我需要对单元格公式转换一下位置怎么办呢?比如我现在不想把公式放在G列,而是放在H列。

3.4 移动公式位置

from openpyxl.formula.translate import Translator
for c in range(2,11):
    cell_F = 'F' + str(c)
    cell_G = 'G' + str(c)
    cell_H = 'H' + str(c)
    wso[cell_H] = Translator("=ROUND({},0)".format(cell_F), origin=cell_G).translate_formula(cell_H)

《如何用Python操作Excel自动化办公?一个案例教会你openpyxl——公式计算和数据处理》

《如何用Python操作Excel自动化办公?一个案例教会你openpyxl——公式计算和数据处理》

看轻松搞定所有关于公式的内容,大家可以收藏本篇,如果遇到用公式的时候copy一下改改就好了。

要是我想对[A1:F11]单元格进行排序怎么实现呢?

4. 排序和筛选

4.1 简单筛选

wso.auto_filter.ref = "A1:F11"
wso.auto_filter.add_filter_column(0, ["T1", "T4", "T6","T9"])
wso.auto_filter.add_sort_condition("F2:F11")

《如何用Python操作Excel自动化办公?一个案例教会你openpyxl——公式计算和数据处理》

第一行代码表示需要筛选的范围;第二行代码增加了筛选的列,0表示第1列,后面的列表表示需要选择的关键字;第三行代码的作用是为指定的单元格范围添加排序条件。运行代码以后的数据截图样式显示如上图可以发现,表格已经增加了相应的筛选按钮,且点击筛选按钮。

在openpyxl中有排序和过滤的功能设置,但是实际上不会实际起作用,因为openpyxl只能做配置,需要在 Excel 等应用程序中人为的应用,才会实际上重新排列或格式化区域中的单元格或行。那我实际想要筛选该如何实现?

Cellarea2 = wso['A1:F10']
for col in Cellarea2:
    for cell in col:
        if cell.value == 3399.99:
            print("单元格{}值:".format(cell.coordinate),cell.value,end=",")
    print()

《如何用Python操作Excel自动化办公?一个案例教会你openpyxl——公式计算和数据处理》

看!只要在打印过程中加入相应筛选条件就可以了。这个筛选很有用,如果你想对单个值替换,筛选+替换就可以了:

4.2 多值替换

Cellarea2 = wso['A1:F10']
for col in Cellarea2:
    for cell in col:
        if cell.value == 3399.99:
            print("单元格{}值:".format(cell.coordinate),cell.value,end=",")
            wso['G{}'.format(cell.row)] ='=SUBSTITUTE(F{},3399.99,3399)'.format(cell.row)

筛选替换功能实现了,但是要实现排序怎么办呢?在openpyxl里暂时还不行,所以这时候可以用另一个强大的库pandas来处理:

5. 排序

5.1 简单排序

import pandas as pd
wso2 = pd.read_excel(r"D:\4_MySQL\AdventureWorksDW2012\testOrders.xlsx")
df = wso2.iloc[1:10,:]
# 用SalesAmount列的值大小来进行升序
dfn = df.sort_values('SalesAmount',ascending=True)

《如何用Python操作Excel自动化办公?一个案例教会你openpyxl——公式计算和数据处理》

5.2 多值排序

import pandas as pd
wso2 = pd.read_excel(r"D:\testOrders.xlsx")
df = wso2.iloc[1:10,:]
# 用多列的值大小来进行升序
dfn = df.sort_values(["TerritoryKey",'SalesAmount'],ascending=True)

《如何用Python操作Excel自动化办公?一个案例教会你openpyxl——公式计算和数据处理》

筛选替换和排序都实现了,现在希望插入一列怎么办呢?

6. 插入行和列

wso.insert_cols(1)
wso.insert_cols(4,1)
wso.insert_rows(3,2)

《如何用Python操作Excel自动化办公?一个案例教会你openpyxl——公式计算和数据处理》

这三行代码的意思是:第一行在第一列前面插入一列;第二行是在第四列前面插入一列;第三行代表是在第三行前插入两行。要是想移动单元格呢?

7. 移动单元格

wso.insert_cols(5,1)  #在倒数第二列之前插入一列
areaf = get_column_letter(wso.max_column)+str(1)  #最后列第一个单元格地址
areal = get_column_letter(wso.max_column)+str(wso.max_row)  #最后列的最后一个单元格地址
#把最后列区域整体移动到倒数第二列
wso.move_range("{}:{}".format(areaf,areal), rows=0, cols=-2)

《如何用Python操作Excel自动化办公?一个案例教会你openpyxl——公式计算和数据处理》

可以看到倒数第一列被移动到倒数第二列了,这里需要注意的是不能直接移动到对应的位置,那样会把原数据给覆盖,需要在目标位置新加一列再移动。

所有步骤都处理完了如何保存呢?很简单,只需要一下代码:

wbo.save("testOrders.xlsx")

以上就是利用openpyxl添加公式计算、筛选替换、排序移动处理数据的常用步骤了,从读到改再到写入文件的代码和实现结果都在这里,如果大家需要数据集或者有什么不明白的,可以关注同名”二八Data”,私戳我。下一篇文章将讲解怎么调整工作表的格式。

最后欢迎大家关注我,我是拾陆,关注同名”二八Data“,更多干货持续为你奉献。《如何用Python操作Excel自动化办公?一个案例教会你openpyxl——公式计算和数据处理》
《如何用Python操作Excel自动化办公?一个案例教会你openpyxl——公式计算和数据处理》

    原文作者:DataMiningSharer
    原文地址: https://blog.csdn.net/lqw844597536/article/details/121890992
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞