最详细的Excel模块Openpyxl教程(三)-使用公式

在之前的推文中,我们介绍了操作Excel的模块openpyxl的cell单元格操作,相关推文可以从本公众号的底部相关菜单获取。接下来的推文我们来学习一下openpyxl这个python模块中的其他知识,想了想还是先来学习一下怎么借助openpyxl来进行Excel的公式设置。

一.公式数量和种类

我们先看一下在openpyxl中能使用的公式有哪些,我们来看代码:

from openpyxl.utils import FORMULAE
print(len(FORMULAE))
print(FORMULAE)

输出的内容如下:

可以看出支持的公式有ROW,ABS,MAX等等。支持的公式的数量可能因为版本不同而不一样,目前我使用的openpyxl的版本是3.0.5,支持公式的数量为352。

那么我们怎么判断自己要使用的公式是否支持,则可以简单的进行判断:

print('MID' in FORMULAE)
print('minddd' in FORMULAE)

上述代码输出TrueFalse,也就是说公式“MID”支持,公式‘minddd’是不支持的。

二.在单元格中使用公式

假设我们现在有一个数据表“formulae_1.xlsx”,数据显示如下:

我们将使用公式来计算一个总值,代码如下:

wbook = load_workbook(filename='formula_1.xlsx')
wsheet = wbook['Sheet1']
wsheet["C2"] = "=SUM(A2,B2)"
print(wsheet['C2'].value)
wbook.save("formula_1.xlsx")

代码中的输出为:=SUM(A2,B2),操作后的表格显示如下,正好是两者之和。当然了上述第四行代码我们也可以这样写:wsheet["C2"] = "=SUM(10,20)",也能得到我们下图的结果:

利用for循环,我们可以将上述表格中的所有行的值:

from openpyxl import load_workbook
wbook = load_workbook(filename='formula_1.xlsx')
wsheet = wbook['Sheet1']
for j in range(2,4):
    cell_a = 'A' + str(j)
    cell_b = 'B' + str(j)
    cell_c = 'C' + str(j)
    wsheet[cell_c] = "=SUM({},{})".format(cell_a,cell_b)
wbook.save("formula_1.xlsx")

我们来看一下表格中的数据,选中单元格C2,可以看出这个单元格显示的是一个公式:

那我们重新加载这个表格并读取 这个单元格会出现什么呢?

from openpyxl import load_workbook
wbook = load_workbook(filename='formula_1.xlsx')
wsheet = wbook['Sheet1']
cell_C2 = wsheet.cell(2,3).value
print(cell_C2)
wbook.save("formula_1.xlsx")

代码中的打印输出为:=SUM(A2,B2)。那么这里就存在一个问题,我们怎么得到这个单元格中计算的值呢?也就是如何打印出30。这里就要提及到openpyxl中的一个打开文件时的参数了,我们将第二行代码更改为:

wbook = load_workbook(filename='formula_1.xlsx',data_only=True)

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

我们运行替换后的代码的后,打印cell_C2值的时候是为却为None,这是为什么呢?查询相关的资料的解释可以参考:

https://blog.51cto.com/antidarkness/1974684

那么这个问题该怎么解决呢?我们可以使用win32库进行打开关闭的操作之后,在使用openpyxl打开文件传入data_only=True即可,使用win32打开保存的代码如下:(注意filaname需要传一个全路径)

from win32com.client import Dispatch
filename = r'C:\Users\LEGION\Desktop\tweets_code\formula_1.xlsx'
xlApp = Dispatch('Excel.Application')
xlApp.Visible = False
xlBook = xlApp.Workbooks.Open()
xlBook.Save()
xlBook.Close()

当然了在计算多行值的时候如A1到A5的和的时候,可使用:"=SUM(A1:A5)"。

三.转化公式位置

将公式从一个位置转换到另一个位置在日常的工作中也是非常常见的,那么该怎么实现呢?我们先看一个代码:

from openpyxl import load_workbook
from openpyxl.formula.translate import Translator
wbook = load_workbook(filename='formula_1.xlsx')
wsheet = wbook['Sheet1']
wsheet['C3'] = Translator("=SUM(A2,B2)", origin="C2").translate_formula("C3")
print(wsheet['C3'].value)
wbook.save("formula_1.xlsx")

上述代码将"=SUM(A2,B2)"显示的公式,通过转变复制到C3单元格中了,print打印的结果为:=SUM(A3,B3)。C3单元格中的值也就变成了A3+B3的值了,是不是很有意思。官方文档对这个Translator(object)类的作用以及参数的解释为:

Modifies a formula so that it can be translated from one cell to another.
formula: The str string to translate. Must include the leading '=' character.
origin: The cell address (in A1 notation) where this formula was defined (excluding the worksheet name).

这里补充上次单元格中的一个知识点:

当我们在设置格式的时候没有自己想要的格式,那该怎么办呢?很简单,我们可以先使用Excel设置相应单元格的样式,然后使用下述代码打印格式:

cell_style = wsheet.cell(i,j).number_format
print(cell_style)

四.总结

以上就是本次的推文,推文介绍的单元格中使用公式的相关操作,大家跟着学习的时候最好也跟着实践一下。后期我们将继续介绍其他方面的知识。如进行表格的数据的筛选过滤等操作。大家在学习的时候有什么疑问,也欢迎在公众号后台留言。

  • 2
    点赞
  • 43
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
您可以在这篇博文中找到详细openpyxl配置教程:https://blog.csdn.net/hanhanwanghaha/article/details/105811544 [1] 在开始之前,您需要确保您的电脑已经安装了openpyxl库。您可以通过在命令提示符(cmd)中输入"pip install openpyxl"来安装它。 接下来,您可以使用PyCharm或其他Python开发环境打开一个新的项目,并导入openpyxl库。您可以使用以下代码来读写Excel文件: from openpyxl import Workbook, load_workbook wb = load_workbook('test.xlsx') # 打开一个workbook 如果您只需要进行只读操作,最好在load_workbook函数中加上data_only = True参数,以便正确显示计算出的结果而不是公式。如果打开大文件时速度较慢,您可以使用readonly = True参数来提高性能。 如果您需要插入图片到Excel文件中,您可以使用openpyxl库的Image模块。以下是一个示例代码: from openpyxl.drawing.image import Image img = Image(r'.\test.png') img_size = (50, 50) img.width, img.height = img_size # 设定图片大小 ws.column_dimensions['A'].width = 100 # 修改第A列的宽度 ws.row_dimensions.height = 100 # 修改第1行的高度 ws.add_image(img, 'A1') 这些是openpyxl的一些基本用法,您可以根据您的需求进行进一步学习和探索。希望对您有所帮助!<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [利用openpyxlPythonexcel读写文件](https://download.csdn.net/download/weixin_38739744/13742382)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [openpyxl详细教程](https://blog.csdn.net/jingttkx/article/details/103400955)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值