Python 3中的win32com使用教程+示例:从Excel读取数据生成Word格式报告批量发邮件

诸神缄默不语-个人技术博文与视频目录

(代码是AI写的,我没有自己跑过,但应该能跑)

文章目录

  • [什么是 win32com](#什么是 win32com)
  • 如何安装与导入
  • [基本使用 --- 操作 Excel、Word 等 Office 应用](#基本使用 — 操作 Excel、Word 等 Office 应用)
    • [操作 Excel 示例](#操作 Excel 示例)
    • [操作 Word 示例](#操作 Word 示例)
  • [win32com 的能力远不止基本读写 --- 更多高级应用 & 注意事项](#win32com 的能力远不止基本读写 — 更多高级应用 & 注意事项)
  • [适合用 win32com 的场景 / 推荐理由](#适合用 win32com 的场景 / 推荐理由)
  • [一个稍复杂的处理Excel的完整 Demo(Excel + VBA 宏 + 错误处理 + 清理)](#一个稍复杂的处理Excel的完整 Demo(Excel + VBA 宏 + 错误处理 + 清理))
  • 示例:从Excel读取数据生成Word格式报告批量发邮件
    • [🚀 准备条件](#🚀 准备条件)
    • [🧪 示例脚本:从 Excel 到 Word,再通过 Outlook 发邮件](#🧪 示例脚本:从 Excel 到 Word,再通过 Outlook 发邮件)
    • [📌 说明与注意事项](#📌 说明与注意事项)
  • [进阶示例:支持 Excel 多行/多收件人+Word 报告个性化+邮件 HTML 格式+日志/异常处理 的脚本](#进阶示例:支持 Excel 多行/多收件人+Word 报告个性化+邮件 HTML 格式+日志/异常处理 的脚本)
    • [📝 模板说明 & 你可以怎样扩展 / 改造](#📝 模板说明 & 你可以怎样扩展 / 改造)
    • [⚠️ 注意事项 / 限制 / 异常处理](#⚠️ 注意事项 / 限制 / 异常处理)
    • [✅ 总结](#✅ 总结)
  • 本文撰写过程中参考的网络资料

什么是 win32com

  • win32com 是 Python 在 Windows 平台上一种用于访问 COM(Component Object Model) 对象的库/模块。它隶属于第三方扩展包 pywin32(也就是我们通常安装的 "pywin32" 库)的一部分。
  • 借助 win32com,Python 脚本可以与 Windows 系统的底层组件或支持 COM 接口的应用程序通信,并操控它们 ------ 比如常见的办公软件(如 Excel、Word、Outlook)、以及其他支持 COM 的软件。这样就能通过 Python 自动化许多原本依赖鼠标/键盘/手动操作的流程。

简言之,win32com 让 Python "变身"为 Windows 的自动化驱动 --- 就像用 Python 写 VBA,但更灵活、功能更强大。

如何安装与导入

  1. 首先确保你的环境是 Windows + Python3。

  2. 使用 pip 安装 pywin32:

    bash 复制代码
    pip install pywin32

    安装后,就包含了 win32com 模块。

  3. 在脚本中导入需要的模块/子模块,例如:

    python 复制代码
    import win32com.client

    如果你尝试 import win32com 后报错 "No module named 'win32com'",通常是因为没有正确安装 pywin32,或安装在与当前 Python 解释器不一致的环境里。

安装完成并正确导入后,你就可以使用 win32com 来创建/连接 COM 对象。

基本使用 --- 操作 Excel、Word 等 Office 应用

下面是一些最常见、最基础的用法示例。假设你已经安装好 Microsoft Office(或兼容 Office 的软件,如 WPS),并在 Windows 系统上运行。

操作 Excel 示例

python 复制代码
import win32com.client

excel = win32com.client.Dispatch("Excel.Application")
excel.Visible = True  # 可见 Excel 窗口(方便调试/查看效果)

workbook = excel.Workbooks.Add()
sheet = workbook.Worksheets(1)

sheet.Cells(1, 1).Value = "Hello"
sheet.Cells(1, 2).Value = "World"
sheet.Cells(2, 1).Value = "Python"
sheet.Cells(2, 2).Value = "win32com"

workbook.SaveAs(r"C:\path\to\your\file.xlsx")
workbook.Close(False)
excel.Quit()

这段代码会:

  • 启动 Excel(COM 自动化方式)
  • 新建一个工作簿
  • 获取第一个工作表
  • 向若干个单元格写入数据
  • 保存为 .xlsx 文件
  • 关闭 workbook 和 Excel 应用程序

通过这种方式,你可以让 Python 完全代替人工在 Excel 中输入、保存、关闭操作。

操作 Word 示例

python 复制代码
import win32com.client

word = win32com.client.Dispatch("Word.Application")
word.Visible = True

doc = word.Documents.Add()
rng = doc.Range(0, 0)
rng.Text = "这是由 python + win32com 自动生成的 Word 文档内容。\n"

doc.SaveAs(r"C:\path\to\your\file.docx")
doc.Close(False)
word.Quit()

这会:

  • 启动 Word
  • 新建一个文档
  • 在开头插入一段文本
  • 保存为 .docx 文件
  • 关闭文档和 Word

相比于 Python 其他库(如专门操作 docx 的第三方库),使用 win32com 的优势在于可以直接操控完整的 Word 功能,包括对旧版 .doc、宏、样式、复杂格式的支持(前提是目标 Word 版本支持这些功能)。

win32com 的能力远不止基本读写 --- 更多高级应用 & 注意事项

更强的自动化/扩展能力

除了读写 Excel、Word,还可以:

  • 操控 PowerPoint、Outlook、甚至其他支持 COM 的软件。理论上,只要目标软件注册了 COM 接口,都可以通过 win32com.client.Dispatch("YourApp.ProgID") 来连接。
  • 对 Excel 文档进行宏(VBA)操作 ------ 通过 win32com 可以操控 VBA 模块,读写/导入/导出/执行宏脚本,这对于复杂自动化任务非常有用。
  • 利用 COM 的事件机制 ------ 通过 DispatchWithEvents 结合相应的事件处理类,可以让 Python 监听并处理某些应用(如 Word/Excel)的事件(例如"新建文档""退出程序"等)。
  • 用于其他 Windows 应用或第三方工具(只要其提供 COM 接口):例如科学仪器、工程软件、老旧系统等,与其内部 COM 接口对接,实现脚本自动化/数据导出/批处理等功能。

注意事项与局限

  • 仅 Windows 有效。因为 COM 是 Windows 特有的组件模型,在 Linux / macOS 下 win32com 通常无法使用。
  • 依赖目标软件是否支持 COM 自动化 ------ 如果目标程序没有对外提供 COM 接口,就无法通过 win32com 控制它。
  • 多线程时要小心。如果在多线程环境中调用 COM 对象,需要为每个线程单独初始化 COM 库,否则可能报错例如 "尚未调用 CoInitialize"。
  • COM 操作不当可能导致程序挂起 。比如启动了某个应用后忘记 Quit(),可能会导致后台进程残留。良好的资源管理和异常处理非常重要。

适合用 win32com 的场景 / 推荐理由

场景 / 需求 为什么推荐 win32com
Excel/Word 等 Office 自动化(批量生成、报表、邮件合并等) 可以通过脚本完全自动化操作 Office,效率高、功能强
老旧 Office 格式(.doc、.xls)或需要宏/VBA 支持 支持 COM/VBA,比很多现代库兼容性更好
Windows 专用软件自动化/批处理(比如批量生成报告、仪器控制、与其他软件对接) 只要软件支持 COM,就能用 Python 控制,灵活性强
不想手写 VBA/不熟悉 VBA,但熟悉 Python Python 更易读写、更便于与其他 Python 模块整合

一个稍复杂的处理Excel的完整 Demo(Excel + VBA 宏 + 错误处理 + 清理)

python 复制代码
import win32com.client
import pythoncom
import os
import sys

def main():
    try:
        excel = win32com.client.DispatchEx("Excel.Application")
        excel.Visible = False
        excel.DisplayAlerts = False

        wb = excel.Workbooks.Add()
        sheet = wb.Worksheets(1)
        sheet.Name = "Data"

        # 写一些示例数据
        for i in range(1, 6):
            sheet.Cells(i, 1).Value = f"Row {i}"
            sheet.Cells(i, 2).Value = i * 10

        # 假设你有一个 VBA 宏模块,想插入并运行
        # 例如,导出数据、生成图表、格式化等
        # wb.VBProject.VBComponents.Add(...)  # 插入模块
        # wb.Application.Run("YourMacroName")

        out_path = os.path.join(os.getcwd(), "output.xlsx")
        wb.SaveAs(out_path)
        print("Saved to", out_path)
    except Exception as e:
        print("Error:", e)
    finally:
        try:
            wb.Close(False)
        except Exception:
            pass
        try:
            excel.Quit()
        except Exception:
            pass

if __name__ == "__main__":
    # 在一些环境下,多线程或脚本打包需要初始化 COM
    pythoncom.CoInitialize()
    main()
    pythoncom.CoUninitialize()

这个脚本展示了如何:

  • 使用 DispatchEx 启动 Excel(相比 Dispatch 更独立,不会复用已有 Excel 进程)
  • 写入数据
  • (可选)插入/执行 VBA 宏
  • 捕获异常,保证出错后也能关闭/清理资源
  • 最终保存并退出

示例:从Excel读取数据生成Word格式报告批量发邮件

结合 Microsoft Excel、Microsoft Word 和 Microsoft Outlook 来实现:从 Excel 读取数据 → 生成 Word 报告 → 附件 + 发邮件。适合用于"自动生成报告 + 邮件发送"的办公自动化流程。

🚀 准备条件

  • Windows 系统 + 本地安装 Office(Excel, Word, Outlook)

  • 已安装 pywin32

    bash 复制代码
    pip install pywin32
    ```:contentReference[oaicite:5]{index=5}  
  • Excel 中有一个表格(比如 .xlsx),包含你希望写入 Word 报告并作为附件发送给某人的数据

🧪 示例脚本:从 Excel 到 Word,再通过 Outlook 发邮件

python 复制代码
import os
import win32com.client
import pythoncom  # 如果在脚本 / 多线程 /定时任务中运行,推荐初始化 COM

def make_word_report(data_rows, output_docx_path):
    """
    data_rows: list of dict,每个 dict 对应一行,key 是列名
    output_docx_path: Word 文档保存路径
    """
    word = win32com.client.Dispatch("Word.Application")
    word.Visible = False
    doc = word.Documents.Add()

    # 写入标题
    doc.Content.InsertAfter("自动生成报告\n")
    doc.Content.InsertAfter("====================\n\n")

    # 写入表格/数据(简单示例)
    for row in data_rows:
        # 假设 row 是 dict,按顺序写
        line = ", ".join(f"{k}: {v}" for k, v in row.items())
        doc.Content.InsertAfter(line + "\n")

    doc.SaveAs(output_docx_path)
    doc.Close(False)
    word.Quit()


def read_excel_data(excel_path, sheet_name=None):
    """
    简单读取 Excel,通过 COM 控件,也可以用 pandas/openpyxl,再包装成 dict list
    这里假设你能用其他方式读取 Excel,示例用 pandas 更方便
    """
    import pandas as pd
    df = pd.read_excel(excel_path, sheet_name=sheet_name)
    df = df.fillna("")  # 可选:替换空值
    records = df.to_dict(orient="records")
    return records


def send_email_with_attachment(to_email, subject, body, attachment_paths=None):
    outlook = win32com.client.Dispatch("Outlook.Application")
    mail = outlook.CreateItem(0)  # 0 表示 olMailItem
    mail.To = to_email
    mail.Subject = subject
    mail.Body = body
    if attachment_paths:
        for path in attachment_paths:
            if os.path.exists(path):
                mail.Attachments.Add(path)
            else:
                print(f"[Warning] 附件文件不存在: {path}")
    mail.Send()


def main():
    pythoncom.CoInitialize()

    # --- 配置区 ---
    excel_path = r"C:\path\to\your\data.xlsx"
    word_report_path = r"C:\path\to\your\report.docx"
    recipient = "recipient@example.com"
    email_subject = "自动生成报告 - " + os.path.basename(word_report_path)
    email_body = "你好,\n\n请查收自动生成的报告。如有问题,请回复。\n\nRegards."

    # 1. 读取 Excel
    data = read_excel_data(excel_path)

    # 2. 生成 Word 报告
    make_word_report(data, word_report_path)

    # 3. 发送邮件(带上 Word 报告作为附件)
    send_email_with_attachment(
        to_email=recipient,
        subject=email_subject,
        body=email_body,
        attachment_paths=[word_report_path]
    )

    pythoncom.CoUninitialize()


if __name__ == "__main__":
    main()

📌 说明与注意事项

  • 我用了 pythoncom.CoInitialize() / CoUninitialize() 来确保 COM 正确初始化/释放 --- 这是在脚本、服务、线程、定时任务里比较推荐的写法。
  • Excel 数据读取部分我用了 pandas + openpyxl,这样比用 COM 操作 Excel 更简单可靠。你也可以根据需要改成 COM 方式。
  • Word 报告非常基础:只是逐行插入文本。如果需要更复杂的格式、表格、样式、图片,你可以用 Word COM 对象模型进一步扩展。COM 操作 Word 的能力比较完整。
  • 发邮件部分通过 Outlook COM 自动创建邮件、添加附件并发送。这样一来你就实现了"读取数据 → 生成报告 → 邮件发送"的一条完整自动化链。

进阶示例:支持 Excel 多行/多收件人+Word 报告个性化+邮件 HTML 格式+日志/异常处理 的脚本

实现以下功能 ------ 从 Excel 读取多条记录 → 为每条记录生成特定附件 (Excel/Word) 或内容 → 通过 Microsoft Outlook 群发带附件/HTML 正文邮件 → 支持日志与异常处理。你可以直接拿来改造/运行。

python 复制代码
import os
import traceback
import pandas as pd
import win32com.client
import pythoncom
from pathlib import Path

# --- 配置区 ---
EXCEL_DATA_FILE = r"C:\path\to\your\recipients_and_data.xlsx"
OUTPUT_DIR = r"C:\path\to\output"   # 存放生成的附件、报告等
LOG_FILE = os.path.join(OUTPUT_DIR, "send_mail.log")

EMAIL_COLUMN = "email"      # Excel 表格中收件人邮箱地址所在列名
CC_COLUMN = "cc"            # 可选:抄送人列名(若无,可设为 None)
SUBJECT_COLUMN = "subject"  # 邮件主题列名
BODY_COLUMN = "body_html"   # 邮件 HTML 正文列名(可设 body_text 替代纯文本)
ATTACHMENT_COLUMN = "attachment_path"  
# 如果每行有自己附件路径,可放在这一列;也可以留空,然后你自己动态生成

# --- 辅助函数 ---
def log(msg):
    with open(LOG_FILE, 'a', encoding='utf-8') as f:
        f.write(msg + "\n")
    print(msg)

def ensure_folder(path: str):
    if not os.path.isdir(path):
        os.makedirs(path, exist_ok=True)

def read_data():
    df = pd.read_excel(EXCEL_DATA_FILE, dtype=str)
    df = df.fillna("")  # 将 NaN 转为空字符串
    return df.to_dict(orient="records")

def create_custom_attachment(row: dict) -> str:
    """
    如果你希望根据每行数据生成自定义附件(Excel、Word、PDF...等),
    在这里实现生成逻辑,并返回文件路径;若已有附件路径,可直接返回 row[ATTACHMENT_COLUMN]
    """
    # 示例:假设已有附件路径
    path = row.get(ATTACHMENT_COLUMN, "").strip()
    if path and os.path.isfile(path):
        return path
    # 否则 ------ 举例,生成一个简单 txt 报告
    fn = os.path.join(OUTPUT_DIR, f"report_for_{row.get('id', '')}.txt")
    with open(fn, 'w', encoding='utf-8') as f:
        f.write("Report for: " + row.get(EMAIL_COLUMN, "") + "\n")
        # 根据实际字段写内容
        for k, v in row.items():
            f.write(f"{k} = {v}\n")
    return fn

def send_mail_via_outlook(to_addr: str, subject: str, body_html: str,
                          cc_addr: str = None, attachments: list = None,
                          send_on_behalf: str = None):
    outlook = win32com.client.Dispatch("Outlook.Application")
    mail = outlook.CreateItem(0)  # 0 = olMailItem
    mail.To = to_addr
    if cc_addr:
        mail.CC = cc_addr
    if send_on_behalf:
        mail.SentOnBehalfOfName = send_on_behalf  # 使用指定发件邮箱(如有权限)
    mail.Subject = subject
    # 设置 html 正文
    mail.BodyFormat = 2  # 2 = HTML
    mail.HTMLBody = body_html
    # 添加附件
    if attachments:
        for fp in attachments:
            if os.path.isfile(fp):
                mail.Attachments.Add(fp)
            else:
                log(f"[WARN] 附件不存在: {fp}")
    mail.Send()

def main():
    pythoncom.CoInitialize()
    ensure_folder(OUTPUT_DIR)
    data_rows = read_data()
    log("开始处理,共 {} 行".format(len(data_rows)))

    success = 0
    fail = 0

    for idx, row in enumerate(data_rows, start=1):
        try:
            to_addr = row.get(EMAIL_COLUMN, "").strip()
            if not to_addr:
                log(f"[SKIP #{idx}] 收件人地址为空,跳过")
                continue

            subject = row.get(SUBJECT_COLUMN, "(无主题)")
            body_html = row.get(BODY_COLUMN, "")
            cc_addr = row.get(CC_COLUMN, "").strip() or None

            # 准备附件
            att = create_custom_attachment(row)
            attachments = [att] if att else None

            send_mail_via_outlook(to_addr=to_addr,
                                  subject=subject,
                                  body_html=body_html,
                                  cc_addr=cc_addr,
                                  attachments=attachments)

            log(f"[OK #{idx}] 发送邮件 到: {to_addr}, 附件: {attachments}")
            success += 1
        except Exception as e:
            log(f"[ERROR #{idx}] 收件人: {row.get(EMAIL_COLUMN)} 异常: {e}\n" + traceback.format_exc())
            fail += 1

    log(f"完成。成功: {success}, 失败: {fail}")
    pythoncom.CoUninitialize()

if __name__ == "__main__":
    main()

📝 模板说明 & 你可以怎样扩展 / 改造

  • Excel 表格中每一行代表一封邮件:包含收件人、抄送(可选)、主题、HTML 正文、附件路径/附件生成所需字段等。这样适合"批量群发 + 个性化内容"。
  • 我把生成附件与邮件发送逻辑分离。create_custom_attachment(...) 用于生成或获取附件 --- 你可以改成生成 Word/Excel 报告、PDF、图片、文本等。
  • 邮件正文支持 HTML。如果你希望插入图片、表格、样式、公司 logo、个性化布局,都可以通过 HTML 实现。很多人通过该方式,将公司模板/ html 模板 + Excel 数据融合后发送。关于这一点,用 pandas 读取数据 + HTML 模板 + win32com 发邮件,是常见方案。
  • 脚本中包含 日志记录 + 异常捕获 + 附件存在性检查。 如果你每天/定期运行这个脚本(比如用 Windows 任务调度器),日志能帮你追踪哪些邮件发失败,哪些发成功。
  • 如果你需要针对不同收件人生成不同附件(例如针对每个客户生成单独报表/合同/发票),只需要把 create_custom_attachment(...) 改成你的生成逻辑 --- 比如读取数据行内容,生成 Excel/Word 或 PDF,再返回其路径。

⚠️ 注意事项 / 限制 / 异常处理

  • 脚本依赖本地 Outlook 客户端配置。如果没有正确登录或权限,可能抛出 COM 错误。很多文章指出,当 Outlook 配置为现代安全模式、或组织策略限制自动发送时,脚本可能失败。
  • 如果批量邮件数量较多,建议有适当间隔、不要一次性发送过快 ------ 避免被当作垃圾邮件或触发 Outlook 安全提示。
  • 附件路径/生成附件逻辑要保证正确,避免因路径问题导致发送失败。
  • HTML 正文如果包含图片、内嵌资源等,要注意附件与 HTML 的引用关系 ------ 有时候直接附件 + HTML 不一定能保证收件人看到正确格式/嵌入图片 (取决于 Outlook 客户端设置)。

✅ 总结

这个模板基本可以构成一个"通用的批量发邮件 + 附件 + 个性化内容 + 日志 + 错误处理"工具。你可以根据具体业务(比如日报、自动报表、客户通知、合同发送等)------把 Excel 作为"驱动表格"(包含收件人、内容、参数、附件路径/数据等),然后运行脚本自动完成所有工作。

本文撰写过程中参考的网络资料

  1. 详细分析Python中的win32com(附Demo)_python win32com-CSDN博客
  2. python win32com 详解-CSDN博客
  3. Python3安装win32com:轻松实现Windows自动化,掌握必备步骤攻略 - 云原生实践
  4. Python win32com模块操作Excel:VBA模块读写 - 格致
  5. Python如何操作office实现自动化及win32com.client的运用 - 开发技术 - 亿速云
  6. Python 使用 win32com 模块对 word 文件进行操作_pywin32添加word复选框-CSDN博客
  7. 如何使用 win32com 库_win32com.client-CSDN博客
  8. GitHub - hornlaszlomark/python_outlook: Microsoft Outlook manipulation with Python
  9. 解决python提示No module named 'win32com'-百度经验
  10. Research on Application Automation Operations Based on Win32com
  11. COM Automation
  12. How to Text to Speech with Python Using win32com | by Gradient Drift | Medium:这个调的是TTS API,有点牛逼的嗷
  13. 【Python】 自动发邮件 - 锦绣良缘 - 博客园
  14. How to Automate Outlook Emails With Python - UMA Technology
  15. Managing Multiple Mailboxes in Outlook Using Python and
  16. 在 Python 中解决 Outlook COM 电子邮件发送错误
  17. 如何使用 Excel VBA 在 Outlook
  18. How to Automate Outlook Emails With Python
  19. A simple python script to send emails on Outlook · GitHub
  20. Python办公自动化基础:Excel、Word、PDF、PPT与邮件自动化_51CTO学堂_专业的IT技能学习平台
  21. 用Python中Pywin32 win32com操作outlook总结 | 读-查-发-存邮件_if email.sender.emailaddress-CSDN博客
  22. 利用Python调用outlook自动发送邮件_python outlook发邮件-CSDN博客
  23. 利用Python调用outlook自动发送邮件 - Smilecoc - 博客园
  24. Python 在自动化办公汇总和脚本示例 - 技术栈
  25. Sending mail from local machine using Python and win32com.client library · GitHub
  26. GitHub - Hridai/Automating_Outlook: Automating Outlook Using Python win32com Library
  27. GitHub - purduevin/OutlookExport: This Python script uses pywin32 to export emails and attachments from Outlook into organized directories on your computer. It saves emails by received time and includes subject, body, and attachments, ideal for email backup and archiving.
  28. How to Send Emails using Python: Tutorial with examples - Just into Data
  29. Automation - How to Send Email Programmatically with Python - DEV Community
  30. Sending mail from local machine using Python and win32com.client library · GitHub
  31. python监控outlook如何调用 | PingCode智库
  32. Sending Emails With Python -- Real Python
  33. Shaun Adkins - Sending Emails with Attachments using Python
  34. python - win32com.client to send different attachments instead of fixed file path - Stack Overflow
  35. 利用Python的win32com库控制Excel自动化-CSDN博客
  36. Python多线程下调用win32com包报错:pywintypes.com_error: (-2147221008, '尚未调用 CoInitialize。',处理方法
  37. python安装win32com模块 - 知乎
  38. Pythoncom安装及用法介绍-千锋教育
  39. Python八个自动化办公的技巧_51CTO博客_python 办公自动化
  40. python如何提高办公效率的 -- PingCode
  41. python如何集成到office | PingCode智库
相关推荐
你挚爱的强哥43 分钟前
【sgSelectExportDocumentType】自定义组件:弹窗dialog选择导出文件格式word、pdf,支持配置图标和格式名称,触发导出事件
vue.js·pdf·word
草莓熊Lotso2 小时前
unordered_map/unordered_set 使用指南:差异、性能与场景选择
java·开发语言·c++·人工智能·经验分享·python·网络协议
二川bro7 小时前
量子计算入门:Python量子编程基础
python
夏天的味道٥8 小时前
@JsonIgnore对Date类型不生效
开发语言·python
tsumikistep8 小时前
【前后端】接口文档与导入
前端·后端·python·硬件架构
小白学大数据8 小时前
Python爬虫伪装策略:如何模拟浏览器正常访问JSP站点
java·开发语言·爬虫·python
头发还在的女程序员10 小时前
三天搞定招聘系统!附完整源码
开发语言·python
温轻舟10 小时前
Python自动办公工具06-设置Word文档中表格的格式
开发语言·python·word·自动化工具·温轻舟
花酒锄作田10 小时前
[python]FastAPI-Tracking ID 的设计
python·fastapi