资讯动态

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

发布时间:2026/9/1 19:46:29 来源:尧图企业网站定制
就像术与业有着各自专门的钻研方向一样, 每一类工具、每一项岗位都会存在资深玩家, 千万别因为每个人都能使用Excel就轻视那些Excel运用得极为熟练的朋友。对于运营场景而言, 能够与具体业务紧密结合, 从而轻松达成目的, 这样的便是极具实力的玩家, 不过要是从精于提升技能水平角度来讲, 或许需要拓展技术的应用场景, 着重突出通用性。借助辅助办公工具得以在Excel基础上实现效率提升从而产生, 因此没必要去纠结某一种工具无法达成什么, 而是要观察它能够达成什么, 对于无法达成的部分就寻觅其他工具作出弥补, 将问题解决了不就可以了吗?上一篇讲了怎样用读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(rD:\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 #直接将值赋给工作表指定单元格地址就可以。中括号表示切片里面是字符串一定记住要加引号字母表示列号数字表示行号。我想把第六列的值求和怎么办可以直接在单元格输入公式print(输入公式之前G10单元格值,wso[G10].value) wso[G10] SUM(F1:F10) print(输入公式之后G10单元格值,wso[G10].value)预先输入时, 单元格G5实际不存在值, 故而返回None, 输入公式后却返回了其内容。原因何在? 我们期望达成公式运算后得出的结果, 于此条件下就必定要施行一连串操作, 在读取文件之际设置True参数, 而后保存文件, 如此这般公式方能生效。存有较多属性的方法, 其中涵盖了, , , 等。此方法用于读取cell里的值, 在单元格中的值为公式时, 会返回经计算得出的结果。它还能控制带有公式的单元格, 使其呈现公式设置的默认值或者展现上次Excel读取工作表时所存储的值。wbo load_workbook(rD:\testOrders1.xlsx,data_onlyTrue) 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), origincell_G).translate_formula(cell_H)去瞧那能够轻松将所有跟公式相关的内容搞定的情况之时, 大家是能够把这一篇进行收藏的, 要是碰到运用公式的那一刻, 复制一下稍作修改便行了呢。要是我想对单元格进行排序怎么实现呢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列, 后面列表是要选择的关键字, 为指定单元格范围添加排序条件的是第三行代码。运行代码后的数据截图样式如上图所示, 能发现表格已增添了相应筛选按钮, 并且点击筛选按钮。拥有排序以及过滤的功能设定, 然而实际上并不会切实发挥作用, 由于仅仅能够进行配置, 需在诸如 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)将筛选替换功能予以实现了, 然而要达成排序该如何去做呢? 于此处暂时是不可以的了, 故而在这个时候能够借助另一个颇具强大力量的库来加以处理:5. 排序5.1 简单排序import pandas as pd wso2 pd.read_excel(rD:\4_MySQL\AdventureWorksDW2012\testOrders.xlsx) df wso2.iloc[1:10,:] # 用SalesAmount列的值大小来进行升序 dfn df.sort_values(SalesAmount,ascendingTrue)5.2 多值排序import pandas as pd wso2 pd.read_excel(rD:\testOrders.xlsx) df wso2.iloc[1:10,:] # 用多列的值大小来进行升序 dfn df.sort_values([TerritoryKey,SalesAmount],ascendingTrue)筛选替换和排序都实现了现在希望插入一列怎么办呢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), rows0, cols-2)能瞧见, 倒数第一列被挪动至倒数第二列那儿了, 在此需留意的是, 不可径直移至对应的地方, 不然会将原数据给覆盖掉, 得要在目标位置新增一列后再进行移动哦。所有步骤都处理完了如何保存呢很简单只需要一下代码wbo.save(testOrders.xlsx)以上便是运用添加公式来计算, 进行筛选替换, 实施排序移动从而处理数据之际的常用步骤, 从读取, 到修改, 再至写入文件的代码以及实现结果均在此处, 倘若大家需要数据集或者存在任何不明之处, 能够关注名为“二八Data”的同名项, 秘密地戳我。下一篇文章会讲解对工作表的格式予以怎样的调整。最后, 诚挚地欢迎各位来关注我, 我呢, 是名为拾陆的那个人, 还请关注那个和我名字一样叫做“二八Data”的账号, 后续会有更多干货持续不断地为你们奉献出来。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价