iT邦幫忙

0

outlook 報表的應用

  • 分享至 

  • xImage

請教
有個報表信件需要每周寄送, 但郵件的內容(顏色標示的地方)需要去參考某個excel 的資訊, 能否在outlook 做個報表模組讓他自動抓取excel 指定的欄位或做運算, 然後就能來寄信 謝謝
https://ithelp.ithome.com.tw/upload/images/20260819/20003705bSSUcocEed.png

樓主要的,建議適用AI代理自動發送會比較容易達成,怎麼弄,問問ai 吧
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 個回答

0
Pod042A
iT邦新手 1 級 ‧ 2026-08-23 03:00:36
  1. 能否透過 Outlook 模組讀取 Excel 檔案內容?

不能,Outlook 模組無法讀取本機檔案。

  1. 如何實現定時抓取 Excel 檔案內容,製作成報表電郵?

撰寫程式,先讀取 Excel 檔案內容、然後在程式中處理數值、並使用數值渲染報表模板、接上寄送電郵的功能,最後定時觸發程式,即可實現定時寄送報表電郵。

以 Python 為例:

from openpyxl import load_workbook
from jinja2 import Environment, FileSystemLoader
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
import smtplib
import ssl


# -------------------------
# 1. 讀取 Excel
# -------------------------

def load_report_data(excel_path):
    wb = load_workbook(excel_path, data_only=True)
    ws = wb["Report"]

    return {
        "sales": ws["B2"].value,
        "orders": ws["B3"].value,
        "avg_order_value": ws["B4"].value,
    }


# -------------------------
# 2. Jinja2 渲染 HTML
# -------------------------

def render_email(template_name, data):
    env = Environment(
        loader=FileSystemLoader("templates"),
        autoescape=True,
    )

    template = env.get_template(template_name)

    return template.render(**data)


# -------------------------
# 3. SMTP 寄送
# -------------------------

def send_email(
    smtp_host,
    smtp_port,
    username,
    password,
    sender,
    recipients,
    subject,
    html_body,
):
    message = MIMEMultipart("alternative")

    message["From"] = sender
    message["To"] = ", ".join(recipients)
    message["Subject"] = subject

    html_part = MIMEText(html_body, "html", "utf-8")
    message.attach(html_part)

    context = ssl.create_default_context()

    with smtplib.SMTP(smtp_host, smtp_port) as server:
        server.starttls(context=context)

        server.login(username, password)

        server.sendmail(
            sender,
            recipients,
            message.as_string(),
        )


# -------------------------
# 4. Main
# -------------------------

if __name__ == "__main__":

    report_data = load_report_data("report.xlsx")

    html = render_email(
        "report_email.html",
        report_data,
    )

    send_email(
        smtp_host="smtp.example.com",
        smtp_port=587,
        username="report@example.com",
        password="YOUR_PASSWORD",
        sender="report@example.com",
        recipients=[
            "user1@example.com",
            "user2@example.com",
        ],
        subject="每週報表",
        html_body=html,
    )

    print("Email sent")

Jinja 2 模板的渲染結果為 HTML,可以直接作為電郵內容發送。

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
</head>

<body style="font-family: Arial, sans-serif;">

    <h2>每週報表</h2>

    <table
        cellpadding="8"
        cellspacing="0"
        border="1"
        style="border-collapse: collapse;"
    >

        <tr>
            <th>指標</th>
            <th>數值</th>
        </tr>

        <tr>
            <td>營收</td>
            <td>
                {{ "{:,.0f}".format(sales) }}
            </td>
        </tr>

        <tr>
            <td>訂單數</td>
            <td>
                {{ "{:,}".format(orders) }}
            </td>
        </tr>

        <tr>
            <td>平均客單價</td>
            <td>
                {{ "{:,.0f}".format(avg_order_value) }}
            </td>
        </tr>

    </table>

    <p>
        本郵件由系統自動產生,請勿直接回覆。
    </p>

</body>
</html>

我要發表回答

立即登入回答