将pandas DataFrame作为HTML插入邮件正文时to_html属性报错如何解决
报错原因
你代码中生成的total_fees并非DataFrame类型:dma_fees['DMA_FEE_SUBTOTAL'].sum()是对单列数据做求和计算,返回的是numpy.float64类型的数值,该类型对象没有to_html方法,仅Pandas的DataFrame、Series类对象支持to_html方法。
如果报错指向的是format参数里的product_splits/trader_splits/broker_splits,说明这三个变量的生成逻辑有误,最终得到的是数值类型而非DataFrame类型。
解决方案
分两种场景处理:
场景1:仅需要展示总费用的单个数值
不需要调用to_html方法,直接将数值转为字符串嵌入HTML模板即可,示例修改如下:
total_fees = dma_fees['DMA_FEE_SUBTOTAL'].sum() import win32com.client as win32 outlook = win32.Dispatch('outlook.application') mail = outlook.CreateItem(0) mail.To = 'patrick.oneill@example.com' mail.Subject = 'Example' mail.Body = f"Hi,\n 上月总费用为 {total_fees}" mail.HTMLBody = f"""\ <html> <head></head> <body> <p>Hi<br> 上月总费用:<br> {total_fees} <br>按产品拆分费用:<br> {product_splits.to_html(index=False)} <br>按交易员拆分费用:<br> {trader_splits.to_html(index=False)} <br>按经纪商拆分费用:<br> {broker_splits.to_html(index=False)} 此致, Patrick </p> </body> </html> """
场景2:需要total_fees为DataFrame格式插入表格
修改total_fees的生成逻辑,将求和结果转为DataFrame即可:
import pandas as pd # 将求和结果封装为DataFrame total_fees = pd.DataFrame({'上月总费用': [dma_fees['DMA_FEE_SUBTOTAL'].sum()]}) import win32com.client as win32 outlook = win32.Dispatch('outlook.application') mail = outlook.CreateItem(0) mail.To = 'patrick.oneill@example.com' mail.Subject = 'Example' mail.Body = f"Hi,\n 上月总费用为 {total_fees.iloc[0,0]}" mail.HTMLBody = """\ <html> <head></head> <body> <p>Hi<br> 上月总费用:<br> {0} <br>按产品拆分费用:<br> {1} <br>按交易员拆分费用:<br> {2} <br>按经纪商拆分费用:<br> {3} 此致, Patrick </p> </body> </html> """.format(total_fees.to_html(index=False), product_splits.to_html(index=False), trader_splits.to_html(index=False), broker_splits.to_html(index=False))
代码中的index=False参数用于移除HTML表格默认生成的索引列,展示效果更整洁。
内容的提问来源于stack exchange,提问作者paddyusa
相关产品推荐
相关产品推荐

