使用openpyxl

时间:2016-08-09 16:32:23

标签: python openpyxl

我开始使用openpyxl,我想复制一行的总和。 在Excel中,值为150,但是当我尝试打印时,我得到的输出是公式,而不是实际值:

=SUM(B1:B19)

我使用的脚本是:

print(ws["B20"].value)

使用“data_only”无效。

wb = ("First_File_b.xlsx" , data_only=True)

知道我如何解决以获得数值?非常感谢帮助。

2 个答案:

答案 0 :(得分:1)

好的,这是一个简单的例子

我创建了一个电子表格,其中包含第一个电子表格“Feuil1”(法语版),其中包含A1,...,A7 1,2,3,4,5,6,7A8=SUM(A1:A7)

这是代码,可能适用于其他运营商。也许不那么简单。例如,它还支持A1:B12的范围,未经测试且不支持像AA这样的cols,但可以完成。

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

耶!

答案 1 :(得分:0)

我使用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)