[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"site-settings":3,"tag-posts-openpyxl":48,"tag-projects-openpyxl":101,"footer-friends":105,"sidebar-tags":118,"sidebar-donations":263,"ad-sidebar_top":270,"ad-sidebar_mid":272,"ad-sidebar_bottom":274},{"alipayQr":4,"beianNumber":5,"commentsRequireApproval":6,"contactEmail":7,"copyrightNotice":5,"donationEnabled":6,"emailCodeExpireMinutes":8,"enableRegistration":6,"followBilibiliUrl":9,"followGithubUrl":10,"followQqGroup":11,"followQqQr":12,"followWechatQr":13,"footerHtml":5,"gaTrackingId":5,"heroEnabled":6,"heroSearchPlaceholder":5,"heroSubtitle":14,"heroTitle":15,"homeCategoryTabsCount":16,"homePageSize":17,"homeProjectsCount":18,"homeSpecialsCount":19,"homeToolsCount":18,"icpNumber":20,"inviteDefaultQuota":21,"inviteRequired":22,"logoUrl":23,"mailPasswordChangedBody":24,"mailPasswordChangedSubject":25,"mailRegisterCodeBody":26,"mailRegisterCodeSubject":27,"mailResetCodeBody":28,"mailResetCodeSubject":29,"mailWelcomeBody":30,"mailWelcomeSubject":31,"miniappAppid":32,"miniappEnabled":6,"profileAvatar":33,"profileBio":34,"profileName":35,"profileWechatQr":36,"promoteEnabled":6,"promoteNotice":5,"promoteWechat":5,"requireEmailVerify":6,"sectionArticleEnabled":6,"sectionArticleTitle":37,"sectionProjectsEnabled":6,"sectionProjectsTitle":38,"sectionSpecialEnabled":6,"sectionSpecialTitle":39,"sectionToolsEnabled":6,"sectionToolsTitle":40,"seoAuthor":41,"seoBaiduTongjiId":5,"seoBaiduVerify":5,"seoCanonicalEnabled":6,"seoDescription":42,"seoGoogleVerify":5,"seoKeywords":5,"seoOgImage":23,"seoRobots":5,"seoSitemapEnabled":6,"seoTitle":43,"seoTitleTemplate":44,"showHeroStats":6,"showSidebarDonations":6,"showSidebarFeedback":6,"showSidebarFollowUs":6,"showSidebarProfile":6,"showSidebarTagCloud":6,"siteDescription":42,"siteFavicon":45,"siteName":41,"siteUrl":46,"wechatQr":47},"\u002Fstatic\u002Fuploads\u002Fimages\u002F2026\u002F09\u002F29\u002F1790628031878385634.png","","true","enghin110@qq.com","10","https:\u002F\u002Fspace.bilibili.com\u002F470616503","https:\u002F\u002Fgithub.com\u002Fitwuge","606262780","\u002Fstatic\u002Fuploads\u002Fimages\u002F2026\u002F09\u002F29\u002F1790627647190853446.png","\u002Fstatic\u002Fuploads\u002Fimages\u002F2026\u002F09\u002F29\u002F1790627638856258082.jpg","精选 AI 教程、开源项目与实用工具，助你从入门到精通","探索人工智能的无限可能","6","7","4","3","赣ICP备2023014108号-2","5","false","\u002Fimages\u002Flogo\u002Flogo.png","\u003C!DOCTYPE html>\n\u003Chtml lang=\"zh-CN\">\n\u003Chead>\u003Cmeta charset=\"UTF-8\">\u003Cmeta name=\"viewport\" content=\"width=device-width,initial-scale=1.0\">\u003C\u002Fhead>\n\u003Cbody style=\"margin:0;padding:24px 0;background:#f1f5f9;font-family:'Microsoft YaHei','PingFang SC',Helvetica,Arial,sans-serif;\">\n  \u003Ctable role=\"presentation\" width=\"100%\" cellpadding=\"0\" cellspacing=\"0\" style=\"background:#f1f5f9;\">\n    \u003Ctr>\n      \u003Ctd align=\"center\" style=\"padding:0 16px;\">\n        \u003Ctable role=\"presentation\" width=\"600\" cellpadding=\"0\" cellspacing=\"0\" style=\"max-width:600px;width:100%;\">\n          \u003C!-- 品牌头部 -->\n          \u003Ctr>\n            \u003Ctd style=\"background:#3b82f6;border-radius:12px 12px 0 0;padding:20px 28px;\">\n              \u003Cspan style=\"font-size:18px;font-weight:bold;color:#ffffff;\">\u003Ca href=\"{site_url}\" style=\"color:#ffffff;text-decoration:none;\">{site_name}\u003C\u002Fa>\u003C\u002Fspan>\n              \u003Cspan style=\"float:right;font-size:12px;color:#dbeafe;line-height:26px;\">{site_description}\u003C\u002Fspan>\n            \u003C\u002Ftd>\n          \u003C\u002Ftr>\n          \u003C!-- 正文卡片 -->\n          \u003Ctr>\n            \u003Ctd style=\"background:#ffffff;padding:32px 28px;border-radius:0 0 12px 12px;box-shadow:0 2px 8px rgba(15,23,42,0.06);\">\n              \n  \u003Ch2 style=\"margin:0 0 16px;font-size:20px;color:#1e293b;\">🔒 账户密码修改成功\u003C\u002Fh2>\n  \u003Cp style=\"margin:0 0 16px;font-size:14px;line-height:1.8;color:#475569;\">\n    你好，\u003Cstrong style=\"color:#1e293b;\">{username}\u003C\u002Fstrong>，你的账户密码已于刚刚修改成功。\n  \u003C\u002Fp>\n  \u003Ctable role=\"presentation\" width=\"100%\" cellpadding=\"0\" cellspacing=\"0\" style=\"background:#f8fafc;border-radius:10px;margin:8px 0 4px;\">\n    \u003Ctr>\u003Ctd style=\"padding:14px 18px;font-size:13px;line-height:2;color:#475569;\">\n      账户用户名：\u003Cstrong style=\"color:#1e293b;\">{username}\u003C\u002Fstrong>\u003Cbr>\n      账户邮箱：\u003Cstrong style=\"color:#1e293b;\">{email}\u003C\u002Fstrong>\u003Cbr>\n      修改时间：\u003Cstrong style=\"color:#1e293b;\">{change_time}\u003C\u002Fstrong>\n    \u003C\u002Ftd>\u003C\u002Ftr>\n  \u003C\u002Ftable>\n  \u003Cp style=\"margin:16px 0 0;font-size:13px;line-height:1.8;color:#64748b;\">\n    如果这是你本人的操作，请忽略本邮件；\u003Cstrong style=\"color:#dc2626;\">如果不是你本人操作，说明账户密码可能已泄露\u003C\u002Fstrong>，\n    请立即使用「忘记密码」功能重置密码，并通过页脚联系邮箱告知站长。\n  \u003C\u002Fp>\n  \n  \u003Cp style=\"text-align:center;margin:28px 0 8px;\">\n    \u003Ca href=\"{site_url}\" style=\"display:inline-block;padding:12px 36px;background:#3b82f6;color:#ffffff;font-size:15px;font-weight:bold;text-decoration:none;border-radius:8px;\">进入{site_name}\u003C\u002Fa>\n  \u003C\u002Fp>\n            \u003C\u002Ftd>\n          \u003C\u002Ftr>\n          \u003C!-- 页脚 -->\n          \u003Ctr>\n            \u003Ctd align=\"center\" style=\"padding:20px 16px 0;\">\n              \n              \u003Cp style=\"margin:6px 0 0;font-size:12px;color:#94a3b8;\">联系邮箱：\u003Ca href=\"mailto:{contact_email}\" style=\"color:#64748b;text-decoration:none;\">{contact_email}\u003C\u002Fa>\u003C\u002Fp>\n              \u003Cp style=\"margin:6px 0 0;font-size:12px;color:#94a3b8;\">此邮件由系统自动发送，请勿直接回复 · © {year} {site_name}\u003C\u002Fp>\n            \u003C\u002Ftd>\n          \u003C\u002Ftr>\n        \u003C\u002Ftable>\n      \u003C\u002Ftd>\n    \u003C\u002Ftr>\n  \u003C\u002Ftable>\n\u003C\u002Fbody>\n\u003C\u002Fhtml>","【{site_name}】你的账户密码已修改","\u003C!DOCTYPE html>\n\u003Chtml lang=\"zh-CN\">\n\u003Chead>\u003Cmeta charset=\"UTF-8\">\u003Cmeta name=\"viewport\" content=\"width=device-width,initial-scale=1.0\">\u003C\u002Fhead>\n\u003Cbody style=\"margin:0;padding:24px 0;background:#f1f5f9;font-family:'Microsoft YaHei','PingFang SC',Helvetica,Arial,sans-serif;\">\n  \u003Ctable role=\"presentation\" width=\"100%\" cellpadding=\"0\" cellspacing=\"0\" style=\"background:#f1f5f9;\">\n    \u003Ctr>\n      \u003Ctd align=\"center\" style=\"padding:0 16px;\">\n        \u003Ctable role=\"presentation\" width=\"600\" cellpadding=\"0\" cellspacing=\"0\" style=\"max-width:600px;width:100%;\">\n          \u003C!-- 品牌头部 -->\n          \u003Ctr>\n            \u003Ctd style=\"background:#3b82f6;border-radius:12px 12px 0 0;padding:20px 28px;\">\n              \u003Cspan style=\"font-size:18px;font-weight:bold;color:#ffffff;\">\u003Ca href=\"{site_url}\" style=\"color:#ffffff;text-decoration:none;\">{site_name}\u003C\u002Fa>\u003C\u002Fspan>\n              \u003Cspan style=\"float:right;font-size:12px;color:#dbeafe;line-height:26px;\">{site_description}\u003C\u002Fspan>\n            \u003C\u002Ftd>\n          \u003C\u002Ftr>\n          \u003C!-- 正文卡片 -->\n          \u003Ctr>\n            \u003Ctd style=\"background:#ffffff;padding:32px 28px;border-radius:0 0 12px 12px;box-shadow:0 2px 8px rgba(15,23,42,0.06);\">\n              \n  \u003Ch2 style=\"margin:0 0 16px;font-size:20px;color:#1e293b;\">注册邮箱验证码\u003C\u002Fh2>\n  \u003Cp style=\"margin:0 0 16px;font-size:14px;line-height:1.8;color:#475569;\">欢迎注册 \u003Cstrong>{site_name}\u003C\u002Fstrong>！感谢你的加入，请使用下方验证码完成邮箱验证：\u003C\u002Fp>\n  \u003Ctable role=\"presentation\" width=\"100%\" cellpadding=\"0\" cellspacing=\"0\" style=\"margin:8px 0 4px;\">\n    \u003Ctr>\n      \u003Ctd align=\"center\" style=\"background:#f8fafc;border:1px dashed #cbd5e1;border-radius:10px;padding:22px 0;\">\n        \u003Cspan style=\"font-size:32px;font-weight:bold;letter-spacing:10px;color:#3b82f6;font-family:Consolas,Menlo,monospace;\">{code}\u003C\u002Fspan>\n      \u003C\u002Ftd>\n    \u003C\u002Ftr>\n  \u003C\u002Ftable>\n  \u003Cp style=\"margin:12px 0 0;font-size:13px;color:#64748b;\">\n    验证码 \u003Cstrong style=\"color:#dc2626;\">{expire} 分钟\u003C\u002Fstrong> 内有效，为保障账户安全，请勿向他人泄露。\n  \u003C\u002Fp>\n  \u003Chr style=\"border:none;border-top:1px solid #e2e8f0;margin:24px 0;\">\n  \n  \u003Cp style=\"margin:0 0 12px;font-size:14px;line-height:1.8;color:#475569;\">\n    这里是 \u003Cstrong style=\"color:#1e293b;\">{site_name}\u003C\u002Fstrong>，{site_description}\n  \u003C\u002Fp>\n  \u003Ctable role=\"presentation\" width=\"100%\" cellpadding=\"0\" cellspacing=\"0\" style=\"margin:8px 0 4px;\">\n    \u003Ctr>\n      \u003Ctd width=\"33%\" valign=\"top\" style=\"padding:6px;\">\n        \u003Cdiv style=\"background:#eff6ff;border-radius:8px;padding:14px 10px;text-align:center;\">\n          \u003Cdiv style=\"font-size:15px;\">📚\u003C\u002Fdiv>\n          \u003Cdiv style=\"font-size:13px;font-weight:bold;color:#1e40af;margin-top:4px;\">精选教程\u003C\u002Fdiv>\n          \u003Cdiv style=\"font-size:12px;color:#64748b;margin-top:2px;\">从入门到实战\u003C\u002Fdiv>\n        \u003C\u002Fdiv>\n      \u003C\u002Ftd>\n      \u003Ctd width=\"33%\" valign=\"top\" style=\"padding:6px;\">\n        \u003Cdiv style=\"background:#ecfdf5;border-radius:8px;padding:14px 10px;text-align:center;\">\n          \u003Cdiv style=\"font-size:15px;\">🚀\u003C\u002Fdiv>\n          \u003Cdiv style=\"font-size:13px;font-weight:bold;color:#065f46;margin-top:4px;\">开源项目\u003C\u002Fdiv>\n          \u003Cdiv style=\"font-size:12px;color:#64748b;margin-top:2px;\">精选可部署方案\u003C\u002Fdiv>\n        \u003C\u002Fdiv>\n      \u003C\u002Ftd>\n      \u003Ctd width=\"34%\" valign=\"top\" style=\"padding:6px;\">\n        \u003Cdiv style=\"background:#fff7ed;border-radius:8px;padding:14px 10px;text-align:center;\">\n          \u003Cdiv style=\"font-size:15px;\">🧰\u003C\u002Fdiv>\n          \u003Cdiv style=\"font-size:13px;font-weight:bold;color:#9a3412;margin-top:4px;\">在线工具\u003C\u002Fdiv>\n          \u003Cdiv style=\"font-size:12px;color:#64748b;margin-top:2px;\">即开即用提效\u003C\u002Fdiv>\n        \u003C\u002Fdiv>\n      \u003C\u002Ftd>\n    \u003C\u002Ftr>\n  \u003C\u002Ftable>\n  \u003Cp style=\"margin:20px 0 0;font-size:12px;line-height:1.8;color:#94a3b8;\">\n    如果这不是你本人的操作，请忽略本邮件，你的账户安全不会受到影响。\n  \u003C\u002Fp>\n            \u003C\u002Ftd>\n          \u003C\u002Ftr>\n          \u003C!-- 页脚 -->\n          \u003Ctr>\n            \u003Ctd align=\"center\" style=\"padding:20px 16px 0;\">\n              \n              \u003Cp style=\"margin:6px 0 0;font-size:12px;color:#94a3b8;\">联系邮箱：\u003Ca href=\"mailto:{contact_email}\" style=\"color:#64748b;text-decoration:none;\">{contact_email}\u003C\u002Fa>\u003C\u002Fp>\n              \u003Cp style=\"margin:6px 0 0;font-size:12px;color:#94a3b8;\">此邮件由系统自动发送，请勿直接回复 · © {year} {site_name}\u003C\u002Fp>\n            \u003C\u002Ftd>\n          \u003C\u002Ftr>\n        \u003C\u002Ftable>\n      \u003C\u002Ftd>\n    \u003C\u002Ftr>\n  \u003C\u002Ftable>\n\u003C\u002Fbody>\n\u003C\u002Fhtml>","【{site_name}】注册验证码","\u003C!DOCTYPE html>\n\u003Chtml lang=\"zh-CN\">\n\u003Chead>\u003Cmeta charset=\"UTF-8\">\u003Cmeta name=\"viewport\" content=\"width=device-width,initial-scale=1.0\">\u003C\u002Fhead>\n\u003Cbody style=\"margin:0;padding:24px 0;background:#f1f5f9;font-family:'Microsoft YaHei','PingFang SC',Helvetica,Arial,sans-serif;\">\n  \u003Ctable role=\"presentation\" width=\"100%\" cellpadding=\"0\" cellspacing=\"0\" style=\"background:#f1f5f9;\">\n    \u003Ctr>\n      \u003Ctd align=\"center\" style=\"padding:0 16px;\">\n        \u003Ctable role=\"presentation\" width=\"600\" cellpadding=\"0\" cellspacing=\"0\" style=\"max-width:600px;width:100%;\">\n          \u003C!-- 品牌头部 -->\n          \u003Ctr>\n            \u003Ctd style=\"background:#3b82f6;border-radius:12px 12px 0 0;padding:20px 28px;\">\n              \u003Cspan style=\"font-size:18px;font-weight:bold;color:#ffffff;\">\u003Ca href=\"{site_url}\" style=\"color:#ffffff;text-decoration:none;\">{site_name}\u003C\u002Fa>\u003C\u002Fspan>\n              \u003Cspan style=\"float:right;font-size:12px;color:#dbeafe;line-height:26px;\">{site_description}\u003C\u002Fspan>\n            \u003C\u002Ftd>\n          \u003C\u002Ftr>\n          \u003C!-- 正文卡片 -->\n          \u003Ctr>\n            \u003Ctd style=\"background:#ffffff;padding:32px 28px;border-radius:0 0 12px 12px;box-shadow:0 2px 8px rgba(15,23,42,0.06);\">\n              \n  \u003Ch2 style=\"margin:0 0 16px;font-size:20px;color:#1e293b;\">找回密码验证码\u003C\u002Fh2>\n  \u003Cp style=\"margin:0 0 16px;font-size:14px;line-height:1.8;color:#475569;\">你正在找回账户密码，请使用下方验证码完成重置操作：\u003C\u002Fp>\n  \u003Ctable role=\"presentation\" width=\"100%\" cellpadding=\"0\" cellspacing=\"0\" style=\"margin:8px 0 4px;\">\n    \u003Ctr>\n      \u003Ctd align=\"center\" style=\"background:#f8fafc;border:1px dashed #cbd5e1;border-radius:10px;padding:22px 0;\">\n        \u003Cspan style=\"font-size:32px;font-weight:bold;letter-spacing:10px;color:#3b82f6;font-family:Consolas,Menlo,monospace;\">{code}\u003C\u002Fspan>\n      \u003C\u002Ftd>\n    \u003C\u002Ftr>\n  \u003C\u002Ftable>\n  \u003Cp style=\"margin:12px 0 0;font-size:13px;color:#64748b;\">\n    验证码 \u003Cstrong style=\"color:#dc2626;\">{expire} 分钟\u003C\u002Fstrong> 内有效，为保障账户安全，请勿向他人泄露。\n  \u003C\u002Fp>\n  \u003Chr style=\"border:none;border-top:1px solid #e2e8f0;margin:24px 0;\">\n  \n  \u003Cp style=\"margin:0 0 12px;font-size:14px;line-height:1.8;color:#475569;\">\n    这里是 \u003Cstrong style=\"color:#1e293b;\">{site_name}\u003C\u002Fstrong>，{site_description}\n  \u003C\u002Fp>\n  \u003Ctable role=\"presentation\" width=\"100%\" cellpadding=\"0\" cellspacing=\"0\" style=\"margin:8px 0 4px;\">\n    \u003Ctr>\n      \u003Ctd width=\"33%\" valign=\"top\" style=\"padding:6px;\">\n        \u003Cdiv style=\"background:#eff6ff;border-radius:8px;padding:14px 10px;text-align:center;\">\n          \u003Cdiv style=\"font-size:15px;\">📚\u003C\u002Fdiv>\n          \u003Cdiv style=\"font-size:13px;font-weight:bold;color:#1e40af;margin-top:4px;\">精选教程\u003C\u002Fdiv>\n          \u003Cdiv style=\"font-size:12px;color:#64748b;margin-top:2px;\">从入门到实战\u003C\u002Fdiv>\n        \u003C\u002Fdiv>\n      \u003C\u002Ftd>\n      \u003Ctd width=\"33%\" valign=\"top\" style=\"padding:6px;\">\n        \u003Cdiv style=\"background:#ecfdf5;border-radius:8px;padding:14px 10px;text-align:center;\">\n          \u003Cdiv style=\"font-size:15px;\">🚀\u003C\u002Fdiv>\n          \u003Cdiv style=\"font-size:13px;font-weight:bold;color:#065f46;margin-top:4px;\">开源项目\u003C\u002Fdiv>\n          \u003Cdiv style=\"font-size:12px;color:#64748b;margin-top:2px;\">精选可部署方案\u003C\u002Fdiv>\n        \u003C\u002Fdiv>\n      \u003C\u002Ftd>\n      \u003Ctd width=\"34%\" valign=\"top\" style=\"padding:6px;\">\n        \u003Cdiv style=\"background:#fff7ed;border-radius:8px;padding:14px 10px;text-align:center;\">\n          \u003Cdiv style=\"font-size:15px;\">🧰\u003C\u002Fdiv>\n          \u003Cdiv style=\"font-size:13px;font-weight:bold;color:#9a3412;margin-top:4px;\">在线工具\u003C\u002Fdiv>\n          \u003Cdiv style=\"font-size:12px;color:#64748b;margin-top:2px;\">即开即用提效\u003C\u002Fdiv>\n        \u003C\u002Fdiv>\n      \u003C\u002Ftd>\n    \u003C\u002Ftr>\n  \u003C\u002Ftable>\n  \u003Cp style=\"margin:20px 0 0;font-size:12px;line-height:1.8;color:#94a3b8;\">\n    如果这不是你本人的操作，请忽略本邮件，你的账户安全不会受到影响。\n  \u003C\u002Fp>\n            \u003C\u002Ftd>\n          \u003C\u002Ftr>\n          \u003C!-- 页脚 -->\n          \u003Ctr>\n            \u003Ctd align=\"center\" style=\"padding:20px 16px 0;\">\n              \n              \u003Cp style=\"margin:6px 0 0;font-size:12px;color:#94a3b8;\">联系邮箱：\u003Ca href=\"mailto:{contact_email}\" style=\"color:#64748b;text-decoration:none;\">{contact_email}\u003C\u002Fa>\u003C\u002Fp>\n              \u003Cp style=\"margin:6px 0 0;font-size:12px;color:#94a3b8;\">此邮件由系统自动发送，请勿直接回复 · © {year} {site_name}\u003C\u002Fp>\n            \u003C\u002Ftd>\n          \u003C\u002Ftr>\n        \u003C\u002Ftable>\n      \u003C\u002Ftd>\n    \u003C\u002Ftr>\n  \u003C\u002Ftable>\n\u003C\u002Fbody>\n\u003C\u002Fhtml>","【{site_name}】找回密码验证码","\u003C!DOCTYPE html>\n\u003Chtml lang=\"zh-CN\">\n\u003Chead>\u003Cmeta charset=\"UTF-8\">\u003Cmeta name=\"viewport\" content=\"width=device-width,initial-scale=1.0\">\u003C\u002Fhead>\n\u003Cbody style=\"margin:0;padding:24px 0;background:#f1f5f9;font-family:'Microsoft YaHei','PingFang SC',Helvetica,Arial,sans-serif;\">\n  \u003Ctable role=\"presentation\" width=\"100%\" cellpadding=\"0\" cellspacing=\"0\" style=\"background:#f1f5f9;\">\n    \u003Ctr>\n      \u003Ctd align=\"center\" style=\"padding:0 16px;\">\n        \u003Ctable role=\"presentation\" width=\"600\" cellpadding=\"0\" cellspacing=\"0\" style=\"max-width:600px;width:100%;\">\n          \u003C!-- 品牌头部 -->\n          \u003Ctr>\n            \u003Ctd style=\"background:#3b82f6;border-radius:12px 12px 0 0;padding:20px 28px;\">\n              \u003Cspan style=\"font-size:18px;font-weight:bold;color:#ffffff;\">\u003Ca href=\"{site_url}\" style=\"color:#ffffff;text-decoration:none;\">{site_name}\u003C\u002Fa>\u003C\u002Fspan>\n              \u003Cspan style=\"float:right;font-size:12px;color:#dbeafe;line-height:26px;\">{site_description}\u003C\u002Fspan>\n            \u003C\u002Ftd>\n          \u003C\u002Ftr>\n          \u003C!-- 正文卡片 -->\n          \u003Ctr>\n            \u003Ctd style=\"background:#ffffff;padding:32px 28px;border-radius:0 0 12px 12px;box-shadow:0 2px 8px rgba(15,23,42,0.06);\">\n              \n  \u003Ch2 style=\"margin:0 0 4px;font-size:20px;color:#1e293b;\">🎉 欢迎加入 {site_name}！\u003Cspan style=\"display:inline-block;margin-left:8px;padding:2px 8px;background:#dcfce7;color:#15803d;font-size:12px;border-radius:10px;vertical-align:middle;\">邮箱已验证\u003C\u002Fspan>\u003C\u002Fh2>\n  \u003Cp style=\"margin:0 0 16px;font-size:14px;line-height:1.8;color:#475569;\">\n    你好，\u003Cstrong style=\"color:#1e293b;\">{username}\u003C\u002Fstrong>，你的账户已注册成功。\n  \u003C\u002Fp>\n  \u003Ctable role=\"presentation\" width=\"100%\" cellpadding=\"0\" cellspacing=\"0\" style=\"background:#f8fafc;border-radius:10px;margin:8px 0 4px;\">\n    \u003Ctr>\u003Ctd style=\"padding:14px 18px;font-size:13px;line-height:2;color:#475569;\">\n      账户用户名：\u003Cstrong style=\"color:#1e293b;\">{username}\u003C\u002Fstrong>\u003Cbr>\n      注册邮箱：\u003Cstrong style=\"color:#1e293b;\">{email}\u003C\u002Fstrong>\u003Cbr>\n      注册奖励：\u003Cstrong style=\"color:#dc2626;\">+{register_points} 积分\u003C\u002Fstrong>已发放\n    \u003C\u002Ftd>\u003C\u002Ftr>\n  \u003C\u002Ftable>\n  \u003Chr style=\"border:none;border-top:1px solid #e2e8f0;margin:24px 0;\">\n  \n  \u003Cp style=\"margin:0 0 12px;font-size:14px;line-height:1.8;color:#475569;\">\n    这里是 \u003Cstrong style=\"color:#1e293b;\">{site_name}\u003C\u002Fstrong>，{site_description}\n  \u003C\u002Fp>\n  \u003Ctable role=\"presentation\" width=\"100%\" cellpadding=\"0\" cellspacing=\"0\" style=\"margin:8px 0 4px;\">\n    \u003Ctr>\n      \u003Ctd width=\"33%\" valign=\"top\" style=\"padding:6px;\">\n        \u003Cdiv style=\"background:#eff6ff;border-radius:8px;padding:14px 10px;text-align:center;\">\n          \u003Cdiv style=\"font-size:15px;\">📚\u003C\u002Fdiv>\n          \u003Cdiv style=\"font-size:13px;font-weight:bold;color:#1e40af;margin-top:4px;\">精选教程\u003C\u002Fdiv>\n          \u003Cdiv style=\"font-size:12px;color:#64748b;margin-top:2px;\">从入门到实战\u003C\u002Fdiv>\n        \u003C\u002Fdiv>\n      \u003C\u002Ftd>\n      \u003Ctd width=\"33%\" valign=\"top\" style=\"padding:6px;\">\n        \u003Cdiv style=\"background:#ecfdf5;border-radius:8px;padding:14px 10px;text-align:center;\">\n          \u003Cdiv style=\"font-size:15px;\">🚀\u003C\u002Fdiv>\n          \u003Cdiv style=\"font-size:13px;font-weight:bold;color:#065f46;margin-top:4px;\">开源项目\u003C\u002Fdiv>\n          \u003Cdiv style=\"font-size:12px;color:#64748b;margin-top:2px;\">精选可部署方案\u003C\u002Fdiv>\n        \u003C\u002Fdiv>\n      \u003C\u002Ftd>\n      \u003Ctd width=\"34%\" valign=\"top\" style=\"padding:6px;\">\n        \u003Cdiv style=\"background:#fff7ed;border-radius:8px;padding:14px 10px;text-align:center;\">\n          \u003Cdiv style=\"font-size:15px;\">🧰\u003C\u002Fdiv>\n          \u003Cdiv style=\"font-size:13px;font-weight:bold;color:#9a3412;margin-top:4px;\">在线工具\u003C\u002Fdiv>\n          \u003Cdiv style=\"font-size:12px;color:#64748b;margin-top:2px;\">即开即用提效\u003C\u002Fdiv>\n        \u003C\u002Fdiv>\n      \u003C\u002Ftd>\n    \u003C\u002Ftr>\n  \u003C\u002Ftable>\n  \u003Cp style=\"margin:16px 0 0;font-size:14px;line-height:1.8;color:#475569;\">登录后你可以：\u003C\u002Fp>\n  \u003Cul style=\"margin:8px 0 0;padding-left:22px;font-size:14px;line-height:2;color:#475569;\">\n    \u003Cli>浏览、收藏优质内容与实用工具\u003C\u002Fli>\n    \u003Cli>投稿教程与项目，审核通过后获得积分奖励\u003C\u002Fli>\n    \u003Cli>参与评论、打分，与其他用户交流\u003C\u002Fli>\n    \u003Cli>通过签到、投稿、互动持续累积积分与等级\u003C\u002Fli>\n  \u003C\u002Ful>\n  \n  \u003Cp style=\"text-align:center;margin:28px 0 8px;\">\n    \u003Ca href=\"{site_url}\" style=\"display:inline-block;padding:12px 36px;background:#3b82f6;color:#ffffff;font-size:15px;font-weight:bold;text-decoration:none;border-radius:8px;\">进入{site_name}\u003C\u002Fa>\n  \u003C\u002Fp>\n            \u003C\u002Ftd>\n          \u003C\u002Ftr>\n          \u003C!-- 页脚 -->\n          \u003Ctr>\n            \u003Ctd align=\"center\" style=\"padding:20px 16px 0;\">\n              \n              \u003Cp style=\"margin:6px 0 0;font-size:12px;color:#94a3b8;\">联系邮箱：\u003Ca href=\"mailto:{contact_email}\" style=\"color:#64748b;text-decoration:none;\">{contact_email}\u003C\u002Fa>\u003C\u002Fp>\n              \u003Cp style=\"margin:6px 0 0;font-size:12px;color:#94a3b8;\">此邮件由系统自动发送，请勿直接回复 · © {year} {site_name}\u003C\u002Fp>\n            \u003C\u002Ftd>\n          \u003C\u002Ftr>\n        \u003C\u002Ftable>\n      \u003C\u002Ftd>\n    \u003C\u002Ftr>\n  \u003C\u002Ftable>\n\u003C\u002Fbody>\n\u003C\u002Fhtml>","【{site_name}】欢迎加入{site_name}，账户注册成功","7111479@qq.com","\u002Fstatic\u002Fuploads\u002Fimages\u002F2026\u002F09\u002F29\u002F1790627623420492239.jpg","全栈开发者，专注 AI 应用与效率工具","武哥","\u002Fstatic\u002Fuploads\u002Fimages\u002F2026\u002F09\u002F29\u002F1790629453503799753.png","热门爆款","精选项目","精选专题","精选工具","AI导航工具站","精选优质 AI 教程、AI 工具与开源项目，助力开发者快速上手人工智能","AI导航工具站 - AI 教程 · AI 项目 · AI 工具","%s - AI导航工具站","\u002Fimages\u002Flogo\u002Ffavicon.ico","https:\u002F\u002Fwuge.fun","\u002Fstatic\u002Fuploads\u002Fimages\u002F2026\u002F09\u002F29\u002F1790628026196296604.png",{"items":49,"pagination":99},[50],{"id":51,"title":52,"slug":53,"summary":54,"content":55,"coverImage":56,"categoryId":57,"authorId":58,"viewCount":59,"likeCount":59,"commentCount":59,"isTop":59,"isRecommend":59,"status":58,"rejectReason":5,"publishedAt":60,"createdAt":61,"updatedAt":62,"category":63,"author":67,"tags":75},17,"用 Python 操作 Excel：openpyxl 与 pandas 实战对比","excel","还在手动复制粘贴处理 Excel？用 Python 三分钟搞定。openpyxl 精细控制 vs pandas 批量分析，附批量合并 100 个文件的实战案例。","## 两个库怎么选\n\nPython 操作 Excel 主要用这两个库，分工不同：\n\n| | pandas | openpyxl |\n|---|--------|----------|\n| 定位 | 数据分析 | Excel 文件读写控制 |\n| 擅长 | 批量数据处理、统计、筛选 | 单元格样式、合并、公式、图表 |\n| 操作粒度 | 整表\u002F整行\u002F整列 | 精确到每个单元格 |\n| 学习成本 | 低 | 中 |\n\n**经验法则**：\n\n- 「处理数据」用 pandas（读进来 → 算 → 写出去）\n- 「操作格式」用 openpyxl（改样式、加批注、做模板报表）\n- 两者经常配合使用：pandas 算数据，openpyxl 美化输出\n\n```bash\npip install pandas openpyxl\n```\n\n## pandas 读写 Excel\n\n**读取**：\n\n```python\nimport pandas as pd\n\n# 读单个工作表\ndf = pd.read_excel(\"销售数据.xlsx\", sheet_name=\"1月\")\n\n# 读所有工作表，返回 {表名: DataFrame} 字典\nall_sheets = pd.read_excel(\"销售数据.xlsx\", sheet_name=None)\n\n# 实用参数\npd.read_excel(\"data.xlsx\", skiprows=2)       # 跳过前2行标题说明\npd.read_excel(\"data.xlsx\", usecols=\"A:C\")    # 只读A到C列\npd.read_excel(\"data.xlsx\", dtype={\"工号\": str})  # 工号按字符串读，防止前导零丢失\n```\n\n**写入**：\n\n```python\n# 单表写入\ndf.to_excel(\"结果.xlsx\", index=False)\n\n# 多表写入一个文件\nwith pd.ExcelWriter(\"汇总.xlsx\", engine=\"openpyxl\") as writer:\n    df1.to_excel(writer, sheet_name=\"汇总\", index=False)\n    df2.to_excel(writer, sheet_name=\"明细\", index=False)\n```\n\n## openpyxl 精细控制\n\n**基本读写**：\n\n```python\nfrom openpyxl import Workbook, load_workbook\n\n# 读已有文件\nwb = load_workbook(\"模板.xlsx\")\nws = wb[\"Sheet1\"]           # 按名取工作表\nws = wb.active              # 或取活动表\n\nprint(ws[\"A1\"].value)       # 读单元格\nws[\"B2\"] = \"hello\"          # 写单元格\nws.cell(row=3, column=2, value=100)  # 按行列写\n\n# 遍历数据区\nfor row in ws.iter_rows(min_row=2, max_row=100, values_only=True):\n    print(row)  # 每行是一个元组\n\nwb.save(\"输出.xlsx\")\n```\n\n**设置样式**（做正式报表必备）：\n\n```python\nfrom openpyxl.styles import Alignment, Border, Font, PatternFill, Side\n\nws = wb.active\n\n# 表头样式：加粗白字深蓝底，居中\nheader_font = Font(bold=True, color=\"FFFFFF\", size=12)\nheader_fill = PatternFill(\"solid\", start_color=\"2F5597\")\nfor cell in ws[1]:\n    cell.font = header_font\n    cell.fill = header_fill\n    cell.alignment = Alignment(horizontal=\"center\", vertical=\"center\")\n\n# 边框\nthin = Side(style=\"thin\", color=\"999999\")\nborder = Border(left=thin, right=thin, top=thin, bottom=thin)\nfor row in ws.iter_rows(min_row=1, max_row=ws.max_row, max_col=5):\n    for cell in row:\n        cell.border = border\n\n# 列宽行高\nws.column_dimensions[\"A\"].width = 20\nws.row_dimensions[1].height = 28\n\n# 冻结首行（滚动时表头不动）\nws.freeze_panes = \"A2\"\n```\n\n**公式与合并**：\n\n```python\nws[\"E10\"] = \"=SUM(E2:E9)\"          # 写公式，Excel 打开时自动计算\nws.merge_cells(\"A1:E1\")            # 合并单元格做标题\n```\n\n## 实战：批量合并 100 个 Excel 文件\n\n真实场景：每月底收到 30 个分公司发来的同格式报表，要合并成一个总表。\n\n```python\nfrom pathlib import Path\n\nimport pandas as pd\n\ndef merge_excels(folder: str, output: str) -> None:\n    \"\"\"合并目录下所有 xlsx 的第一个工作表\"\"\"\n    files = list(Path(folder).glob(\"*.xlsx\"))\n    if not files:\n        print(\"目录下没有 xlsx 文件\")\n        return\n\n    frames = []\n    for f in files:\n        try:\n            df = pd.read_excel(f)\n            df[\"来源文件\"] = f.stem  # 加一列标记数据来源，方便追溯\n            frames.append(df)\n            print(f\"已读取：{f.name}（{len(df)} 行）\")\n        except Exception as e:\n            print(f\"读取失败 {f.name}：{e}\")  # 某个文件坏了不影响整体\n\n    result = pd.concat(frames, ignore_index=True)\n    result.to_excel(output, index=False)\n    print(f\"\\n合并完成：{len(result)} 行 → {output}\")\n\nmerge_excels(\".\u002F分公司报表\", \".\u002F合并结果.xlsx\")\n```\n\n## 实战：生成带样式的月度报表\n\n数据分析完，输出一份「拿得出手」的报表：\n\n```python\nimport pandas as pd\nfrom openpyxl import load_workbook\nfrom openpyxl.styles import Alignment, Font, PatternFill\n\n# 第一步：pandas 算数据\ndf = pd.read_excel(\"原始数据.xlsx\")\nsummary = df.groupby(\"部门\").agg(\n    总销售额=(\"销售额\", \"sum\"),\n    订单数=(\"订单号\", \"count\"),\n).reset_index()\n\n# 第二步：写入文件\nsummary.to_excel(\"月度报表.xlsx\", index=False, sheet_name=\"汇总\")\n\n# 第三步：openpyxl 美化\nwb = load_workbook(\"月度报表.xlsx\")\nws = wb.active\n\n# 标题行样式\nfor cell in ws[1]:\n    cell.font = Font(bold=True, color=\"FFFFFF\")\n    cell.fill = PatternFill(\"solid\", start_color=\"305496\")\n    cell.alignment = Alignment(horizontal=\"center\")\n\n# 数字格式：千分位 + 保留两位小数\nfor row in ws.iter_rows(min_row=2, min_col=2, max_col=2):\n    for cell in row:\n        cell.number_format = \"#,##0.00\"\n\n# 自适应列宽（按内容长度估算）\nfor col in ws.columns:\n    max_len = max(len(str(c.value or \"\")) for c in col)\n    ws.column_dimensions[col[0].column_letter].width = max_len * 2 + 4\n\nwb.save(\"月度报表.xlsx\")\n```\n\n## 常见坑\n\n**1. xls 与 xlsx 要分清**\n\n- `.xlsx`（2007 后的格式）→ openpyxl\n- `.xls`（老格式）→ 需要 `xlrd` 库，且 xlrd 2.0+ 只支持 xls\n- 简单办法：先用 Excel 把 xls 另存为 xlsx\n\n**2. 大文件内存爆炸**\n\n十万行以上的文件，openpyxl 普通模式会很吃内存，用只读模式：\n\n```python\nwb = load_workbook(\"大文件.xlsx\", read_only=True)\n```\n\npandas 则分块读（仅限 CSV；Excel 大文件建议先转 CSV）。\n\n**3. 数字变科学计数法 \u002F 丢失前导零**\n\n身份证号、手机号、工号这些「数字字符串」，读的时候指定 `dtype=str`，写的时候设置单元格为文本格式：\n\n```python\ncell.number_format = \"@\"  # 文本格式，18位身份证不会被转成科学计数\n```\n\n**4. 公式不计算**\n\nopenpyxl 写的公式，只有用 Excel\u002FWPS 打开时才会计算。如果程序里要读公式结果，先用 Excel 打开保存一次，或读取时用 `data_only=True`（前提是文件被 Excel 保存过）。\n\n## 写在最后\n\n办公自动化的回报是立竿见影的：昨天还花一下午的合并报表，今天一个脚本 30 秒跑完。从你身边最烦的那个重复性 Excel 工作开始——那就是你的第一个自动化脚本最好的题材。\n","\u002Fstatic\u002Fuploads\u002Fimages\u002F2026\u002F09\u002F29\u002F1790636138623334148.png",8,1,0,"2026-09-29T06:56:34.579061313+08:00","2026-09-29T06:55:38.623451323+08:00","2026-09-29T06:56:34.579126509+08:00",{"id":57,"name":64,"slug":65,"description":64,"icon":5,"sortOrder":59,"postCount":59,"parentId":59,"createdAt":66,"updatedAt":66},"Python专题","Python","2026-09-29T06:55:05.938571812+08:00",{"id":58,"username":68,"email":32,"phone":5,"nickname":69,"avatarUrl":70,"bio":5,"role":58,"status":58,"points":59,"lastLoginAt":71,"loginCount":72,"createdAt":73,"updatedAt":74},"wuge","站长","\u002Fstatic\u002Fuploads\u002Favatars\u002F2026\u002F09\u002F29\u002F1790630804049538805.jpg","2026-09-29T05:22:12.192245111+08:00",3,"2026-09-29T04:25:29.170055083+08:00","2026-09-29T05:26:46.960829427+08:00",[76,81,85,89,94],{"id":77,"name":65,"slug":78,"color":79,"postCount":59,"createdAt":80},6,"python","#e2e8f0","2026-09-29T04:25:30.347030306+08:00",{"id":82,"name":83,"slug":53,"color":79,"postCount":59,"createdAt":84},139,"Excel","2026-09-29T06:55:38.596869557+08:00",{"id":86,"name":87,"slug":87,"color":79,"postCount":59,"createdAt":88},140,"openpyxl","2026-09-29T06:55:38.603778674+08:00",{"id":90,"name":91,"slug":92,"color":79,"postCount":59,"createdAt":93},141,"pandas","pandas-2","2026-09-29T06:55:38.611186815+08:00",{"id":95,"name":96,"slug":97,"color":79,"postCount":59,"createdAt":98},142,"办公自动化","ban-gong-zi-dong-hua","2026-09-29T06:55:38.617834232+08:00",{"page":58,"pageSize":100,"total":58,"totalPages":58},12,{"items":102,"pagination":103,"tag":104},[],{"page":58,"pageSize":100,"total":59,"totalPages":58},{"id":86,"name":87,"slug":87,"color":79,"postCount":59,"createdAt":88},[106,113],{"id":107,"name":108,"url":109,"logo":110,"description":108,"sortOrder":59,"status":58,"createdAt":111,"updatedAt":112},2,"哔哩哔哩","https:\u002F\u002Fwww.bilibili.com\u002F","\\images\\social\\bilibili.png","0001-01-01T00:00:00Z","2026-09-29T04:44:41.867019475+08:00",{"id":58,"name":114,"url":115,"logo":116,"description":114,"sortOrder":59,"status":58,"createdAt":117,"updatedAt":117},"GitHub","https:\u002F\u002Fgithub.com","\\images\\social\\github.png","2026-09-29T04:32:39.65740234+08:00",[119,124,129,134,139,144,149,154,159,164,169,174,179,184,189,194,198,203,208,213,218,223,224,229,234,239,243,248,253,258],{"id":120,"name":121,"slug":122,"color":79,"postCount":59,"createdAt":123},150,"AI","ai","2026-09-29T06:55:38.743861502+08:00",{"id":125,"name":126,"slug":127,"color":79,"postCount":59,"createdAt":128},53,"AI 绘画","ai-hui-hua","2026-09-29T04:25:30.70107663+08:00",{"id":130,"name":131,"slug":132,"color":79,"postCount":59,"createdAt":133},94,"AIGC","aigc","2026-09-29T06:46:13.817043541+08:00",{"id":135,"name":136,"slug":137,"color":79,"postCount":59,"createdAt":138},81,"AI入门","ai-ru-men","2026-09-29T06:46:13.646321088+08:00",{"id":140,"name":141,"slug":142,"color":79,"postCount":59,"createdAt":143},113,"AI写作","ai-xie-zuo","2026-09-29T06:46:14.098797917+08:00",{"id":145,"name":146,"slug":147,"color":79,"postCount":59,"createdAt":148},95,"AI工具","ai-gong-ju","2026-09-29T06:46:13.849105815+08:00",{"id":150,"name":151,"slug":152,"color":79,"postCount":59,"createdAt":153},87,"AI技巧","ai-ji-qiao","2026-09-29T06:46:13.717351439+08:00",{"id":155,"name":156,"slug":157,"color":79,"postCount":59,"createdAt":158},92,"AI绘画","ai-hui-hua-2","2026-09-29T06:46:13.800506851+08:00",{"id":160,"name":161,"slug":162,"color":79,"postCount":59,"createdAt":163},88,"AI编程","ai-bian-cheng","2026-09-29T06:46:13.748934007+08:00",{"id":165,"name":166,"slug":167,"color":79,"postCount":59,"createdAt":168},104,"API","api","2026-09-29T06:46:13.964167454+08:00",{"id":170,"name":171,"slug":172,"color":79,"postCount":59,"createdAt":173},24,"Agent","agent","2026-09-29T04:25:30.481917452+08:00",{"id":175,"name":176,"slug":177,"color":79,"postCount":59,"createdAt":178},15,"Apache-2.0","apache-2-0","2026-09-29T04:25:30.413130076+08:00",{"id":180,"name":181,"slug":182,"color":79,"postCount":59,"createdAt":183},124,"BeautifulSoup","beautifulsoup","2026-09-29T06:55:38.372320794+08:00",{"id":185,"name":186,"slug":187,"color":79,"postCount":59,"createdAt":188},71,"C++","c","2026-09-29T04:25:30.832723566+08:00",{"id":190,"name":191,"slug":192,"color":79,"postCount":59,"createdAt":193},9,"C\u002FC++","c-c","2026-09-29T04:25:30.367438818+08:00",{"id":57,"name":195,"slug":196,"color":79,"postCount":59,"createdAt":197},"CPU 推理","cpu-tui-li","2026-09-29T04:25:30.360161464+08:00",{"id":199,"name":200,"slug":201,"color":79,"postCount":59,"createdAt":202},82,"ChatGPT","chatgpt","2026-09-29T06:46:13.65246271+08:00",{"id":204,"name":205,"slug":206,"color":79,"postCount":59,"createdAt":207},43,"ChatGPT 界面","chatgpt-jie-mian","2026-09-29T04:25:30.631791206+08:00",{"id":209,"name":210,"slug":211,"color":79,"postCount":59,"createdAt":212},109,"Coze","coze","2026-09-29T06:46:14.04772698+08:00",{"id":214,"name":215,"slug":216,"color":79,"postCount":59,"createdAt":217},89,"DeepSeek","deepseek","2026-09-29T06:46:13.756746391+08:00",{"id":219,"name":220,"slug":221,"color":79,"postCount":59,"createdAt":222},103,"Embedding","embedding","2026-09-29T06:46:13.931530378+08:00",{"id":82,"name":83,"slug":53,"color":79,"postCount":59,"createdAt":84},{"id":225,"name":226,"slug":227,"color":79,"postCount":59,"createdAt":228},132,"FastAPI","fastapi","2026-09-29T06:55:38.496902061+08:00",{"id":230,"name":231,"slug":232,"color":79,"postCount":59,"createdAt":233},107,"Fine-tuning","fine-tuning","2026-09-29T06:46:14.010861283+08:00",{"id":235,"name":236,"slug":237,"color":79,"postCount":59,"createdAt":238},97,"Gamma","gamma","2026-09-29T06:46:13.863615311+08:00",{"id":72,"name":240,"slug":241,"color":79,"postCount":59,"createdAt":242},"Go","go","2026-09-29T04:25:30.324360969+08:00",{"id":244,"name":245,"slug":246,"color":79,"postCount":59,"createdAt":247},98,"Kimi","kimi","2026-09-29T06:46:13.871065157+08:00",{"id":249,"name":250,"slug":251,"color":79,"postCount":59,"createdAt":252},7,"LLM","llm","2026-09-29T04:25:30.353458642+08:00",{"id":254,"name":255,"slug":256,"color":79,"postCount":59,"createdAt":257},31,"LLMOps","llmops","2026-09-29T04:25:30.534990482+08:00",{"id":259,"name":260,"slug":261,"color":79,"postCount":59,"createdAt":262},101,"LangChain","langchain","2026-09-29T06:46:13.916898801+08:00",[264],{"id":58,"userId":265,"donorName":35,"amount":266,"message":267,"paymentMethod":268,"isAnonymous":59,"status":58,"createdAt":269},null,128,"加油","wechat","2026-09-29T04:45:44+08:00",{"materials":271},[],{"materials":273},[],{"materials":275},[]]