术业有专攻,每一种工具每一种岗位都会有资深玩家,别说因为人人都会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()

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

3. 输入公式

3.1 输入单个公式

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

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

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

输入之前单元格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")

现在我不求和,而是对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)

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

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)

看轻松搞定所有关于公式的内容,大家可以收藏本篇,如果遇到用公式的时候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")

第一行代码表示需要筛选的范围;第二行代码增加了筛选的列,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()

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

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)

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)

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

6. 插入行和列

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

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

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)

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

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

wbo.save("testOrders.xlsx")

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

最后欢迎大家关注我,我是拾陆,关注同名"二八Data",更多干货持续为你奉献。

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

  1. 如何用Python操作Excel自动化办公?一个案例教会你openpyxl——读取数据

    欢迎大家关注我,我是拾陆,关注同名"二八Data" 数据分析工作最难搞的是处理数据的过程,不然不会有专门的ETL(数据抽取.转换.加载)工程师了.如果是企业级数据处理可能数据库直接 ...

  2. 【PDF】超简单!用Python让Excel自动化办公

    Excel作为当今最流行的办公软件之一,在数据编辑.处理和分析方面的表现都非常出色.但是,即使有 Excel的帮助,在面对重复性.机械性的事务时仍然要花费大量时间. 所以今天了解一下这本<超简单 ...

  3. Python操作Excel文件汇总数据案例一则

    问题描述: Excel文件"每个人的爱好.xlsx"内容如下: 要求在最后追加一列,该列中每个单元格的内容为所在行前几列单元格数据的汇总.以上面的内容为例,处理后文件内容如下: 参 ...

  4. python series转置储存到excel_Python 实现Excel自动化办公下

    上一讲我们讲到了Python 针对Excel 里面的特殊数据处理以及各种数据统计,本讲我们将引入Pandas 这个第三方库来实现数据的统计,只要一个方法就可以统计到上一讲的数据统计内容,本讲也会扩展讲 ...

  5. Python openpyxl打开有公式的excel表取值错误的解决办法,Python openpyxl获取excel有公式的单元格的数值错误,Python操作excel(.xlsx)封装类

    Python openpyxl打开有公式的表格,如果直接读取,会出现有公式的单元格为空或零的情况. 参见: https://blog.csdn.net/weixin_45903952/article/ ...

  6. 十六、Python操作excel(.xlsx)封装类MyPyExce

    自己利用python编写的操作excel封装类 """ ================================================ Python模块 ...

  7. python自动化办公excel-自动化办公:python 操作Excel

    原标题:自动化办公:python 操作Excel 1.安装 pip install xlsxwriter or easy_install xlsxwriter or tar -zxvf xlsxwri ...

  8. python处理Excel实现自动化办公教学(数据筛选、公式操作、单元格拆分合并、冻结窗口、图表绘制等)【三】

    相关文章: python处理Excel实现自动化办公教学(含实战)[一] python处理Excel实现自动化办公教学(含实战)[二] python处理Excel实现自动化办公教学(数据筛选.公式操作 ...

  9. python自动化办公excel-Python自动化办公系列之Python操作Excel

    [作者导语]本文是鉴于有些粉丝的工作需求,有时候需要遇到这些文件的处理.因此,我写了一个文章集合,供大家参考.全篇包括三个章节,分别为:Python使用openpyxl操作excel.python使用 ...

最新文章

  1. R语言中如何计算C-Statistics?几种计算方法详解
  2. MySQL-索引优化篇(4)_索引的维护
  3. debug工具_Jupyter官方神器:可视化 Debug 工具!
  4. FactoryMethodPattern(工厂方法)
  5. php mate,[树莓派] ubuntu-mate配置nginx + php7.0环境
  6. Qt工作笔记-对QItemDelegate自定义委托的理解
  7. MSSQL数据批量插入优化详细
  8. Netty工作笔记0065---WebSocket长连接开发4
  9. 常见压缩/解压缩及打包命令
  10. (转)驱动开发之五 --- TDI之八 【译文】
  11. idea和搜狗输入法快捷键冲突_Win10 输入法简繁体快捷键与 IDEA 冲突
  12. ASP.NET2.0 ReportingServices,报表灵魂的收割者
  13. Python把视频转为 gif 图片——视频制作利器:MoviePy
  14. K3实现按虚拟件/组件发料
  15. Photoshop 2020 更新内容
  16. 服务器集群有哪些类型
  17. c语言猜单词游戏实验报告,猜单词游戏c语言源程序.doc
  18. android 微信摇一摇功能实现,android 类似微信的摇一摇功能实现思路及代码
  19. (5)Linux基础——opendir/closedir 、readdir、mkdir 、rmdir、getcwd、chdir详细含义用法及介绍(基础)
  20. mysql 全局不重复_如何批量生成MySQL不重复手机号大表实例代码

热门文章

  1. 小虎的软考辅导视频讲座有啥与众不同?
  2. JavaScript控制div的移动跟着鼠标一起移动div
  3. 中俄博览会谈下大单 云从科技“展”露头角
  4. h 链接 html,用漂亮的汤解析HTML以获得h之后的链接
  5. hrbust 1424 哈理工oj 1424 Hrbust的校车【水题】【思维】
  6. 奥塔在线:CentOS7下配置Nginx实现本地缓存
  7. open3d剩余内容有关函数详情(笔记10)
  8. 电脑故障维修大全 [1]
  9. 智慧城市排水管网监测系统解决方案
  10. 黑金AX301开发板学习(3)——动态数码管的时钟实验