在邮件中查看时,包含由python openpyxl创建的公式的单元格显示为空

在邮件中查看时,包含由python openpyxl创建的公式的单元格显示为空,python,excel,email,outlook,openpyxl,Python,Excel,Email,Outlook,Openpyxl,我需要做一个周报,我选择使用openpyxl python模块创建它,并通过邮件发送,当我打开收到的邮件(outlook)时,带有公式的单元格显示为空,但是当下载文件并打开它时,数据显示,OS fedora 20。部分守则: # imported modules from openpyxl ... wb = Workbook() ws = wb.active counter = 3 ws.append(row) for day in data : row = ['']*(len(host

我需要做一个周报,我选择使用openpyxl python模块创建它,并通过邮件发送,
当我打开收到的邮件(outlook)时,带有公式的单元格显示为空,
但是当下载文件并打开它时,数据显示,
OS fedora 20。部分守则:

# imported modules from openpyxl ...
wb = Workbook()
ws = wb.active
counter = 3
ws.append(row)
for day in data :
    row = ['']*(len(hosts)*2 +5)
    row[0] = day.dayDate

    row[1] ='=SUM(F'+str(counter)+':'+get_column_letter(len(hosts)+5)+str(counter)+\
            ')/(COUNT(F'+str(counter)+':'+get_column_letter(len(hosts)+5)+str(counter)+'))'

    row[2] = '=SUM('+get_column_letter(len(hosts)+6)+str(counter)+':'+\
            get_column_letter(len(hosts)*2+5)+str(counter)+')/COUNT('+\
            get_column_letter(len(hosts)+6)+str(counter)+':'+\
            get_column_letter(len(hosts)*2+5)+str(counter)+')'

    row[3] = '=MAX('+get_column_letter(len(hosts)+6)+str(counter)+':'+\
            get_column_letter(len(hosts)*2+5)+str(counter)+')'

    row[4] = '=_xlfn.STDEV.P('+get_column_letter(len(hosts)+6)+str(counter)\
            +':'+get_column_letter(len(hosts)*2+5)+str(counter)+')'

   counter += 1
然后,我根据日期创建一些图表等。。并保存,然后通过邮件发送:

wb.save(pathToFile+fileName+'.xlsx')
os.system('echo -e "'+msg+'" | mail -s "'+fileName+'" -a '+\
                        pathToFile+fileName+'.xlsx -r '+myUsr+' '+ppl2send2)

这些都是实际代码的一部分,有人知道为什么电子邮件没有在单元格中显示公式的结果吗
提前感谢:)

openpyxl不会为插入电子表格的公式计算结果;如果使用excel打开并保存工作表,则结果中会填入值。

opepyxl的公式有问题,更新excel文件后,需要打开并保存它以获得生成的值。有两种方法可以解决这个问题

  • (除非你真的想要,否则我不会建议你使用这个。)
  • 您可以在读取文件之前自动打开文件并从python保存它。您可以使用win32com模块来实现这一点

        import win32com.client
        wb.save('PUT YOUR FILE PATH HERE')
        ab = win32com.client.Dispatch("Excel.Application")
        wb2 = ab.Workbooks.Open('PUT YOUR FILE PATH HERE')
        ws = ab.Sheets('PUT THE SHEET NAME HERE')
        ab.DisplayAlerts = False
        wb2.Save()
        wb2.Close()
        ab.Application.Quit()
        #Now you can read from the file and you can see the values generated from the formula
    
  • 或者您可以使用xlwings而不是openpyxl。如果使用此模块,则不必担心保存excel文件。模块将为您完成此任务

    import xlwings
    wb= xlwings.Book('PUT YOUR FILE PATH HERE')
    ws =  wb.sheets[0]
    #Do your update here example ws.range(2, 8).value = 34 
    wb.save()
    wb.close()
    

  • 好啊我可以通过脚本解决这个问题吗?!。。p、 在美国,运行脚本的操作系统没有Microsoft office,我在保存文件(第一次)后尝试重新打开并再次保存。。但是它没有帮助我看不到openpyxl的方法(我可能会错过它),但是我认为xlsxwriter允许您提供一个值来显示公式。您必须自己计算该值,但对于您的示例来说,这似乎没问题。