使用openpyxl

时间:2017-12-28 18:17:32

标签: python openpyxl

我目前正在学习Python,以便以自动方式创建excel文件。 但是我对 openpyxl 库的条件格式化部分遇到了一些麻烦。

以下是不起作用的代码:

import openpyxl as xl
wb = xl.Workbook()
ws = wb.active
red_color = "ffc7ce"
red_color_font = "9c0103"
red_font = xl.styles.fonts.Font(size=14, bold=True, color=red_color_font)
red_fill = xl.styles.fills.PatternFill(start_color=red_color, end_color=red_color, fill_type="solid")
#------
for i in range(3,131,1):
        ws["B"+str(i)] = "=SUM(C{}:D{})".format(str(i),str(i))
        ws["C"+str(i)] = 0
        ws["D"+str(i)] = 0
        ws["E"+str(i)] = "=SUM(F{}:G{})".format(str(i),str(i))
        ws["F"+str(i)] = 0
        ws["G"+str(i)] = 0
        # conditional formating - putting red cells if second applications have been forgotten
        if i==4:
            threshold = [str(int(ws["B"+str(i-1)].value))]
            ws.conditional_formatting.add("B4",xl.formatting.rule.CellIsRule(operator="lessThan",formula=threshold,fill=red_fill,font=red_font))
        if i>=5:
            threshold = [str(int(ws["B"+str(i-1)].value)-int(ws["B"+str(i-2)].value))]
            ws.conditional_formatting.add("B{}".format(str(i)),xl.formatting.rule.CellIsRule(operator="lessThan",formula=threshold,fill=red_fill,font=red_font))

正如您所看到的,问题来自 threshold 变量。 当我运行代码时,我收到以下错误消息:

ValueError: invalid literal for int() with base 10: '=SUM(C3:D3)'

有人知道如何从用于B列的公式中提取值吗?

提前感谢!

1 个答案:

答案 0 :(得分:0)

这取决于是否打开了excel。在您的情况下,excel似乎是您从python生成的,因此excel中没有存储任何评估值。

您可以做什么:

A。由于您使用python生成代码,因此您知道将哪些值分配给了这些单元格。您无需从excel读取这些值。您可以创建一个数据框来存储结构,如果要查看C [3]的值,请调用df ['C']。iloc [3]

B。在尝试访问单元格的评估值之前,您需要打开excel并将其保存。这样,Mircosoft Excel将保存有关该单元格的公式和评估值的信息。然后,您可以在python代码中读回excel。更具体地说,您可以同时读取单元格的公式和值:

wb_values = load_workbook(path_xlsx+wb_name,data_only=True)
wb_formulas = load_workbook(path_xlsx+wb_name)