【问题标题】:Table HTML output displays as single column iin python表格 HTML 输出在 python 中显示为单列
【发布时间】:2019-12-18 11:28:01
【问题描述】:
import csv
from tabulate import tabulate
from openpyxl import load_workbook
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
import smtplib
me = 'xxx@gmail.com'
password = 'yyyzzz!!2'
server = 'smtp.gmail.com:587'
you = 'qqq@gmail.com'


text = """
Hello, Friend.
{table}

Regards,

Me"""

html = """
<html><body><p>Hello, Friend.</p>
<p>Here is your data:</p>
{table}
<p>Regards,</p>
<p>Me</p>
</body></html>
"""
filepath="D:/Development_Avecto/Python/Associate_AppLens_Defaulters_Nov1-Dec4.xlsx"
data_list=[]
temp_csv=""
workbook = load_workbook(filepath)
sheet_data = workbook[str('%')]
Ws_range= sheet_data['A':'D']
for row in Ws_range:
for cell in row:
    print(cell.value)
    temp_csv = temp_csv + str(cell.value) + "~"
    data_list.append(temp_csv)



 text = text.format(table=tabulate(data_list, headers="firstrow", tablefmt="grid"))
 html = html.format(table=tabulate(data_list, headers="firstrow", tablefmt="html"))

 message = MIMEMultipart(
   "alternative", None, [MIMEText(text), MIMEText(html,'html')])

 message['Subject'] = "Your data"
 message['From'] = me
 message['To'] = you
 server = smtplib.SMTP(server)
 server.ehlo()
 server.starttls()
 server.login(me, password)
 server.sendmail(me, you, message.as_string())
 server.quit()

需要有关如何在多列中显示数据的帮助,因为我在 excel 中有四列,但现在所有四列都显示为单列。

目前它正在从 excel 中读取数据并邮寄内容,但它显示为单列

请帮我解决我用的是python 3.6。

【问题讨论】:

  • 为什么要在temp_csv = temp_csv + str(cell.value) + "~"的一个字符串中转换一行数据?
  • 追加?是不是错了请指教
  • 我没有检查tabulate 的工作原理,但它可能会将单个字符串视为表格中的单个单元格。我宁愿它转换为列表列表(而不是字符串列表)

标签: python excel


【解决方案1】:

您应该将其转换为列表列表,如

data_list = [['A', 'B', 'C'], [1, 2, 3]]

使用类似的东西

data_list = []

for row in Ws_range:

    row_list = []

    for cell in row:
        print(cell.value)
        row_list.append(cell.value)

    data_list.append(row_list)

最小的工作示例

from tabulate import tabulate

html = """
<html><body><p>Hello, Friend.</p>
<p>Here is your data:</p>
{table}
<p>Regards,</p>
<p>Me</p>
</body></html>
"""

data_list = [['A', 'B', 'C'], [1, 2, 3]]

print(html.format(table=tabulate(data_list, headers="firstrow", tablefmt="html")))

print(tabulate(data_list, headers="firstrow", tablefmt="text"))

结果:

<html><body><p>Hello, Friend.</p>
<p>Here is your data:</p>
<table>
<thead>
<tr><th style="text-align: right;">  A</th><th style="text-align: right;">  B</th><th style="text-align: right;">  C</th></tr>
</thead>
<tbody>
<tr><td style="text-align: right;">  1</td><td style="text-align: right;">  2</td><td style="text-align: right;">  3</td></tr>
</tbody>
</table>
<p>Regards,</p>
<p>Me</p>
</body></html>

  A    B    C
---  ---  ---
  1    2    3

编辑:对于pandas.DataFrame,您还必须转换为列出的列表,但DataFrame 具有此功能。

到 numpy 数组,它也可以与 tabulate 一起使用

 data_list = df.values

或到列表列表

 data_list = df.values.tolist()

from tabulate import tabulate
import pandas as pd

html = """
<html><body><p>Hello, Friend.</p>
<p>Here is your data:</p>
{table}
<p>Regards,</p>
<p>Me</p>
</body></html>
"""

df = pd.DataFrame([['A', 'B', 'C'], [1, 2, 3]])

data_list = df.values

print(html.format(table=tabulate(data_list, headers="firstrow", tablefmt="html")))

print(tabulate(data_list, headers="firstrow", tablefmt="text"))

【讨论】:

  • 我已经通过使用熊猫实现了你能告诉我如何将数据格式化为正确的表格。
  • 您必须将 DataFrame 转换为列表列表 - 就像使用 excel 一样。但是DataFrame 具有此df.values 的功能,它转换为 numpy.array 并且它的行为类似于列表列表。或者您可以使用df.values.tolist() 转换为列表列表
  • 非常感谢您的帮助。其中一列中有 % 值,但在阅读后显示分数如 (=C2/176) 任何读取方式与在 excel 中相同。跨度>
  • excel 可能已配置为将此分数显示为%,但您必须自行将所有值=C2/176 转换为数字并使用% 格式化。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-07-31
  • 2021-09-30
  • 2017-06-09
  • 2010-10-02
  • 1970-01-01
  • 1970-01-01
  • 2020-08-01
相关资源
最近更新 更多