Python 使用openpyxl获取Excel工作表中总和的绝对值
我开始使用openpyxl,我想复制一行的总和。 在Excel中,值为150,但当我尝试打印它时,得到的输出是公式,而不是实际值:Python 使用openpyxl获取Excel工作表中总和的绝对值,python,openpyxl,Python,Openpyxl,我开始使用openpyxl,我想复制一行的总和。 在Excel中,值为150,但当我尝试打印它时,得到的输出是公式,而不是实际值: =SUM(B1:B19) 我使用的脚本是: print(ws["B20"].value) 使用“仅限数据”不起作用 wb = ("First_File_b.xlsx" , data_only=True) 你知道我怎么解才能得到数值吗?非常感谢您的帮助 好的,这里有一个简单的例子 我用第一个电子表格“Feuil1”(法语版本)创建了一个电子表格,其中包含A1,…
=SUM(B1:B19)
我使用的脚本是:
print(ws["B20"].value)
使用“仅限数据”不起作用
wb = ("First_File_b.xlsx" , data_only=True)
你知道我怎么解才能得到数值吗?非常感谢您的帮助 好的,这里有一个简单的例子 我用第一个电子表格“Feuil1”(法语版本)创建了一个电子表格,其中包含
A1,…,A7
as1,2,3,4,5,6,7
和A8=SUM(A1:A7)
这是代码,可能适用于其他操作员。也许不是那么简单。例如,它还支持A1:B12的范围,未经测试,并且不支持对COL(如AA
)的解析,尽管可以这样做
import openpyxl,re
fre = re.compile(r"=(\w+)\((\w+):(\w+)\)$")
cre = re.compile(r"([A-Z]+)(\d+)")
def the_sum(a,b):
return a+b
d=dict()
d["SUM"] = the_sum
def get_evaluated_value(w,sheet_name,cell_name):
result = w[sheet_name][cell_name].value
if isinstance(result,int) or isinstance(result,float):
pass
else:
m = fre.match(result)
if m:
g = m.groups()
operator=d[g[0]] # ATM only sum is supported
# compute range
mc1 = cre.match(g[1])
mc2 = cre.match(g[2])
start_col = ord(mc1.group(1))
end_col = ord(mc2.group(1))
start_row = int(mc1.group(2))
end_row = int(mc2.group(2))
result = 0
for i in range(start_col,end_col+1):
for j in range(start_row,end_row+1):
c = chr(i)+str(j)
result = operator(result,w["Feuil1"][c].value)
return result
w = openpyxl.load_workbook(r"C:\Users\dartypc\Desktop\test.xlsx")
print(get_evaluated_value(w,"Feuil1","A2"))
print(get_evaluated_value(w,"Feuil1","A8"))
输出:
2
28
耶 我使用openpyxl和pandas的组合解决了这个问题:
import pandas as pd
import openpyxl
from openpyxl import Workbook , load_workbook
source_file = "Test.xlsx"
# write to file
wb = load_workbook (source_file)
ws = wb.active
ws.title = "hello world"
ws.append ([10,10])
wb.save(source_file)
# read from file
df = pd.read_excel(source_file)
sum_jan = df ["Jan"].sum()
print (sum_jan)
副本。简而言之,你不能!有解决方法吗?你可以试着解析表达式。对于像
SUM
这样的简单表达式,只要B1:B19行包含真实数据,而不是公式,它就可以工作!如果你有兴趣的话,我可以试着为你写一些变通方法。珍,如果不占用你太多时间的话,那就太好了。谢谢你,简,谢谢你的帮助。这真的很有用。我几个月前才开始编程,非常感谢您的帮助。告诉我它是否有效,如果有效,请不要忘记接受答案:)