python-pptx 数据驱动生成巴西市场商业计划书英文 PPT 与自动校验 📅 发布时间:2026/9/17 13:15:47 👁 浏览次数: 简介本资源为一份英文版巴西市场商业计划书PPT面向准备进入巴西市场的汽车诊断设备从业者、外贸拓展人员及创业团队。案例以Autel产品线在巴西的落地为背景系统梳理市场进入策略可帮助读者理解新兴市场商业计划的完整结构。压缩包仅含1个ppt文件整体约703KB版式轻量便于直接打开查阅或作为同类方案的模板参考。内容围绕巴西宏观环境展开列出约2亿人口、全球第九大GDP、2007年5.4%与2008年5.2%的增速预测、汽车销量增长29.7%、14.3万家汽修店等关键数据并分析南美与亚洲市场快速增长、北美日本停滞的对比格局。方案还呈现团队资源、渠道网络与竞争分析包括圣保罗与累西腓双办公室、VPN与呼叫中心系统、26州独立销售代表配置以及Alfatest、Tecnomotor等本地竞争对手情况。目前已有81人学习适合研究出海市场调研与商业计划写作的读者参考。1. 巴西市场商业计划书-英文.ppt先别急着打开 PowerPoint拿到「巴西市场商业计划书-英文.ppt」这个文件名多数团队会先新建一个 16:9 空白演示文稿往里面贴文本框市场规模一页、税制一页、支付方式一页最后找英语好的同事润色一遍。第一轮内部沟通这样做没问题但只要数字被质疑一次整份文件就得从头对一遍。真正费时间的从来不是排版而是每个数字背后的口径雷亚尔金额用的是哪一天汇率、税率取的是哪个州、增速是名义值还是实际值。更省事的做法是把这份 PPT 当成一个由数据源驱动的构建产物汇率和通胀走巴西央行与 IBGE 的公开接口税制参数写进一份可版本管理的假设文件页面结构由脚本按节生成出稿前再跑一次自动校验。改一个假设值一小时内重新出一版英文演示稿而不是再贴一遍三十页文本框。这套流程适合两类人一是要在两三周内反复改口径、反复见投资人和渠道方的出海团队二是需要同时维护英文版演示稿和内部中文测算表的技术负责人——两边共用同一份假设文件才不会出现PPT 上一个数、模型里另一个数的经典事故。2. 用 python-pptx 把巴西市场商业计划书-英文.ppt 搭成可重建的骨架python-pptx 不是排版工具它更像一个把结构化数据灌进母版的渲染器。想清楚这一点页面的组织方式就变了不是我要做几页而是我有哪几组数据、每组数据落在哪个版式上。2.1 先把假设收进 assumptions.yaml在写任何一页之前先定义唯一事实来源。这份文件是整条流水线的入口也是评审时唯一需要 diff 的东西。# config/assumptions.yaml market: country_code: BR currency: BRL fx_usd_brl_ptax: 5.42 # 由 fetch_data.py 回填不要手改 fx_ref_date: 2025-06-30 # 口径基准日会写进页脚 inflation_ipca_12m: 0.045 tax: icms_state: 0.18 # 州级示例值按目标州替换 iss_municipal: 0.05 # 市级服务税 pis_cofins_non_cumulative: 0.0925 ipi_by_ncm: 0.10 unit_economics: arpu_brl: 79.9 cac_brl: 240.0 gross_margin: 0.62YAML 比 JSON 好在能写注释——上表里那两个示例值按目标州替换的注释半年后接手的人会感谢你。整份文件进 Git每次改动走 PR财务和业务方在 PR 里吵完再合并比在 PPT 里改数字干净得多。提示汇率和通胀字段交给脚本回填人工只维护税率、客单价、毛利这类业务假设。手改汇率的项目最后一定出现两页数字对不上。2.2 生成英文演示稿的最小可跑代码下面是骨架版构建脚本核心逻辑是版式索引 章节清单 假设键三者的映射。# src/build_deck.py from pathlib import Path import yaml from pptx import Presentation from pptx.util import Pt TPL Path(templates/br_bp_en_16x9.pptx) # 自建母版13.333in x 7.5in OUT Path(dist/brazil_market_bp_en.pptx) # (页面标题, assumptions.yaml 里的键) SECTIONS [ (Executive Summary, market), (Market Size Growth, market), (Tax Cost Structure, tax), (Go-to-Market Payments, gtm), (Unit Economics, unit_economics), ] def add_section(prs, layout, title: str): slide prs.slides.add_slide(layout) slide.shapes.title.text title body None for ph in slide.placeholders: # idx1 是内容占位符 if ph.placeholder_format.idx 1: body ph.text_frame return slide, body def fill_body(tf, lines, size14): tf.word_wrap True for i, line in enumerate(lines): p tf.paragraphs[0] if i 0 else tf.add_paragraph() run p.add_run() run.text line run.font.size Pt(size) run.font.name Arial # 覆盖葡语变音符号 return tf def main(): cfg yaml.safe_load(Path(config/assumptions.yaml).read_text(utf-8)) prs Presentation(str(TPL)) layout_body prs.slide_layouts[1] # Title and Content for title, key in SECTIONS: slide, tf add_section(prs, layout_body, title) fill_body(tf, [f{k}: {v} for k, v in cfg.get(key, {}).items()]) OUT.parent.mkdir(parentsTrue, exist_okTrue) prs.save(OUT) print(fsaved {OUT}, slides{len(prs.slides)}) if __name__ __main__: main()逻辑说明Presentation(tpl)打开的是自建母版而不是默认模板目的是把字体、页脚、配色一次性锁死。slide_layouts[1]在 Office 默认模板里对应 Title and Content但自建母版会改变索引顺序所以落地前先打印一遍版式表from pptx import Presentation for i, l in enumerate(Presentation(templates/br_bp_en_16x9.pptx).slide_layouts): print(i, l.name)参数说明placeholder_format.idx而非形状索引才能保证母版微调后代码不崩Pt(14)是投影场景的下限会议室投屏 13 英寸笔记本时 12pt 正文基本读不了word_wrap必须显式打开否则长句会在页面外溢出。页面版式索引数据来源是否含图表Executive Summary1assumptions.yaml / market否Market Size Growth5data/processed/sidra_ipca.csv是Tax Cost Structure1assumptions.yaml / tax是Unit Economics1assumptions.yaml / unit_economics是Risks Compliance1手工维护的 checklist否2.3 字体与葡语字符英文稿里最容易翻车的一页英文稿里出现 São Paulo、Brasília、Goiânia、Ceará、parcelado、boleto 这些词是必然的。葡萄牙语的 ã、õ、ç、á 如果落在没有对应字形的字体上PowerPoint 会做字体替换结果是同一页出现两种字形投影时非常明显。常见做法是只使用 Arial、Calibri、Helvetica 这类覆盖 Latin-1 补集的字体并且在脚本里显式写清 typeface别指望继承母版样式。2.3.1 让 python-pptx 同时写 latin/ea/cs 三套字体run.font.name只写a:latin中英文混排时会触发替换。补全三个标签才能锁住字形from pptx.oxml.ns import qn def set_font_all(run, nameArial): run.font.name name rPr run._r.get_or_add_rPr() for tag in (a:latin, a:ea, a:cs): el rPr.find(qn(tag)) if el is None: el rPr.makeelement(qn(tag), {}) rPr.append(el) el.set(typeface, name)参数说明a:latin管拉丁字符a:ea管中日韩字符PPT 里的小字备注会用到a:cs管复杂文种。三个都写成 Arial跨平台渲染差异最小。另外 python-pptx 不支持字体嵌入所以别选冷门字体否则对方电脑上打不开。3. 巴西市场商业计划书的取数口径税制、汇率、支付与合规字段英文演示稿里最容易被追问的永远不是愿景而是 Tax Cost 那一页。把参数按层级拆开写评审时能直接对着表问而不是问这个税率哪来的。3.1 税制参数怎么落进 Tax Cost 页巴西税制是联邦、州、市三层叠加同一家公司在圣保罗和累西腓的有效税负可能差好几个点。演示稿里不要写一个笼统的综合税率而是分层列示并在页脚注明适用州和市。参数层级常见区间示意落在哪一页取数方式ICMS州17%–20%部分品类更高Tax Cost目标州税务门户 商品 NCM 归类ISS市2%–5%Tax Cost目标市税务门户按服务类型PIS/COFINS 累计制联邦3.65%Tax Cost会计口径确认PIS/COFINS 非累计制联邦9.25%Tax Cost会计口径确认IPI联邦0%–30%按 NCMTax CostTIPI 税率表Simples Nacional统一征收按 Anexo 与收入区间递增Tax Cost会计师核算后回填AFRMM联邦海运长期航线常见为运费的 8%物流成本页货代账单实际金额两个容易踩的点。第一累计制和非累计制不是税率高低问题而是能否抵扣进项写错会让整张毛利表失真务必让当地会计师确认公司适用哪一档。第二进口环节的 ICMS、PIS/COFINS 和 IPI 是在清关时按到岸价加各项费用逐层计算不是简单相乘所以物流成本页最好单独列一张到岸成本拆解表而不是把税塞进一个百分比里。注意表中所有区间只用于说明结构正式稿必须换成目标州、目标市、目标 NCM 的实际口径并在页脚写明数据来源与基准年月。3.2 用 BCB PTAX 和 IBGE SIDRA 拉汇率与通胀汇率用巴西央行的 PTAX 收盘价这是当地商业文件最常引用的官方参考价。# src/fetch_data.py import requests, pandas as pd from pathlib import Path PTAX_URL (https://olinda.bcb.gov.br/olinda/servico/PTAX/versao/v1/odata/ CotacaoDolarPeriodo(dataInicialdataInicial, dataFinalCotacaodataFinalCotacao)) params { dataInicial: 01-01-2025, # 注意格式是 MM-DD-YYYY dataFinalCotacao: 06-30-2025, $format: json, $select: cotacaoCompra,cotacaoVenda,dataHoraCotacao, } r requests.get(PTAX_URL, paramsparams, timeout30) r.raise_for_status() fx pd.DataFrame(r.json()[value]) fx[dataHoraCotacao] pd.to_datetime(fx[dataHoraCotacao]) fx[ptax_mid] (fx[cotacaoCompra] fx[cotacaoVenda]) / 2 Path(data/raw).mkdir(parentsTrue, exist_okTrue) fx.to_parquet(data/raw/ptax_usd_brl.parquet) print(fx.tail(3)[[dataHoraCotacao, ptax_mid]])参数说明dataInicial和dataFinalCotacao必须带单引号这是 OData 的日期字面量写法日期顺序是月-日-年写成年-月-日会直接返回空数组$select只取需要的三列能显著缩短响应时间。取ptax_mid作为展示汇率同时把fx_ref_date写回 assumptions.yaml页脚显示成 FX: BCB PTAX, closing rate of 30 Jun 2025。通胀走 IBGE 的 SIDRA 接口路径形如https://apisidra.ibge.gov.br/values/t/{tabela}/n1/all/v/{variavel}/p/{periodo}。变量号会随表结构变化正式跑之前先访问 SIDRA 的 metadata 端点确认当前变量 id别把变量号硬编码在业务代码里放到配置文件更稳妥。拿到月度指数后按(1r)连乘 12 个月得到 12 个月累计值写进inflation_ipca_12m。两个数定下来整份 PPT 的雷亚尔换算和增速口径才算钉死。--asof参数的意义就在这里固定基准日输出的每一版都能复现。3.3 支付与合规字段Pix、boleto、CNPJ、LGPD 清单Go-to-Market 页写支付方式时只写支持信用卡是不够的。巴西市场的实际组合通常是 Pix 即时支付、boleto 票据、信用卡分期parcelamento常见到 6 期或 12 期和借记卡。分期直接影响现金流模型需要在 Unit Economics 页单独列一行分期对回款周期的影响。注册表单页要体现的字段校验建议在 PPT 里用一个小截图或流程框说明同时后端代码保持一致。CNPJ 校验位是最常被写错的一处import re def cnpj_is_valid(cnpj: str) - bool: d re.sub(r\D, , cnpj) if len(d) ! 14 or d d[0] * 14: return False for n in (12, 13): w ([5, 4, 3, 2, 9, 8, 7, 6, 5, 4, 3, 2] if n 12 else [6, 5, 4, 3, 2, 9, 8, 7, 6, 5, 4, 3, 2]) s sum(int(d[i]) * w[i] for i in range(n)) r s % 11 if int(d[n]) ! (0 if r 2 else 11 - r): return False return True参数说明第一个校验位的权重数组长度是 12第二个是 13混淆这两个数组是最常见的实现错误d d[0] * 14用来挡掉全同数字的假 CNPJ。同理CEP 是00000-000八位格式市政代码用 IBGE 的 7 位编码这些字段在表单页和风控页各出现一次写错会被本地合作方当场指出。合规部分不要写成空泛的一句话。落地做法是列一张四行清单数据映射表是否完成、每类个人数据的处理依据是否记录、保留期限与删除流程是否定义、数据保护负责人联系方式是否可查。这四行放进 Risks Compliance 页比写十句原则性表述有用。4. 英文版 ppt 的数字格式、图表与一键拼装流水线英文稿服务的是国际投资人和海外总部但数据来自巴西本地系统。这个落差全部体现在格式上而格式错误比数字错误更容易被当成不专业。4.1 pt-BR 与 en-US 在 PPT 里的格式对照项目pt-BR 写法en-US 写法本稿采用千分位与小数字1.234.567,891,234,567.89en-US金额R$ 1.234,56BRL 1,234.56BRL 1,234.56页脚标汇率基准日日期30/06/202506/30/202530 Jun 2025彻底避免歧义百分比18,5%18.5%18.5%统一一位小数时区BRT (UTC-3)—页脚注 America/Sao_Paulo日期这一行值得多说一句03/04/2025在巴西读作 3 月 4 日在美国读作 4 月 3 日英文演示稿里只要出现一次这种写法后面所有时间线都会被重新核对。用30 Jun 2025这种写法成本最低。另外巴西自 2019 年起不再实行夏令时America/Sao_Paulo全年 UTC-3时区换算不需要再判断季节性。4.2 用 matplotlib 出图并按母版比例贴进页面图表不要手动截图。用脚本出图尺寸按母版内容区的宽高比设置就不会被拉伸。import matplotlib matplotlib.use(Agg) import matplotlib.pyplot as plt from pptx.util import Inches def revenue_chart(months, values_brl, out_png): fig, ax plt.subplots(figsize(8, 3.6), dpi220) # 比例贴近内容区 ax.plot(months, values_brl, markero, linewidth2, color#1F6FEB) ax.yaxis.set_major_formatter(lambda x, _: fBRL {x/1e6:,.1f}M) ax.grid(axisy, linestyle:, alpha0.4) for s in (top, right): ax.spines[s].set_visible(False) fig.tight_layout() fig.savefig(out_png, facecolorwhite) plt.close(fig) def place_image(slide, png, leftInches(0.8), topInches(2.0), widthInches(11.7)): slide.shapes.add_picture(str(png), left, top, widthwidth)参数说明figsize(8, 3.6)的宽高比约 2.22接近 16:9 母版去掉标题区后的可用区域dpi220保证在 1080p 投影下线条不发虚单位写进刻度标签BRL ...M不要让读者自己换算位数。少用饼图五类以上占比用横向条形图投影后排在前面的类别一眼能读出来。4.3 三个脚本串成一条构建命令目录结构固定下来之后出稿就变成一条命令的事。# 目录结构 # br-bp/ # ├─ config/assumptions.yaml # ├─ data/raw/ data/processed/ # ├─ charts/ # ├─ templates/br_bp_en_16x9.pptx # ├─ src/fetch_data.py src/build_deck.py src/validate.py # └─ dist/ python src/fetch_data.py --asof 2025-06-30 \ python src/build_deck.py --config config/assumptions.yaml \ python src/validate.py dist/brazil_market_bp_en.pptx--asof把汇率和通胀固定在同一个基准日--config允许针对不同投资人出一版激进假设、一版保守假设而不需要复制两份 PPT。把这条命令写进 Makefile 或 CI每次假设文件变更就自动产出新稿并存档比人工维护版本号靠谱。5. 交付前的自动校验和几个能省掉返工的技巧出稿之后到发给对方之前这一段是最值得自动化的。人工检查三十页 PPT漏掉的一定是最不该漏的那页。5.1 反读 pptx数字追溯与占位符扫描python-pptx 既能写也能读用同一套库把生成的稿子再解析一遍做三类检查。# src/validate.py import re, sys from pptx import Presentation def scan(path): prs Presentation(path) issues [] bad_tokens re.compile(r\b(TODO|TBD|XXX|Lorem)\b, re.I) for i, slide in enumerate(prs.slides, 1): text \n.join(sh.text_frame.text for sh in slide.shapes if sh.has_text_frame) if bad_tokens.search(text): issues.append(fslide {i}: 残留占位符) if BRL in text and PTAX not in text: issues.append(fslide {i}: 出现 BRL 金额但未标注汇率来源) for sh in slide.shapes: if sh.has_text_frame: for p in sh.text_frame.paragraphs: for r in p.runs: if r.font.size and r.font.size.pt 12: issues.append(fslide {i}: 字号 {r.font.size.pt}pt 偏小) return issues if __name__ __main__: found scan(sys.argv[1]) print(\n.join(found) if found else OK) sys.exit(1 if found else 0)逻辑说明三类检查对应三种真实事故——占位符没删干净、金额没有口径标注、字号在投影时读不清。退出码1让这条命令能直接挂进 CI检查不通过就不产出成品。校验项判定条件失败处置占位符残留正文命中 TODO/TBD/XXX回查 build_deck.py 的填充分支金额无来源有 BRL 无 PTAX 字样检查页脚生成逻辑字号过小任意 run 小于 12pt调 fill_body 的 size 参数页数与清单不符len(prs.slides) ! len(SECTIONS)检查版式索引与循环5.2 无头转 PDF 和投屏前的检查最后一关是视觉回归。用 LibreOffice 无头模式转 PDF翻一遍就能发现溢出、错位和字形替换soffice --headless --convert-to pdf \ --outdir dist/preview dist/brazil_market_bp_en.pptx这条命令在本地和 CI 容器里行为一致代价是每次要花十几秒。转出来的 PDF 重点看三处表格是否跨页截断、图表下方注释有没有被裁掉、葡语专有名词的变音符号有没有变成方框。前两处是 python-pptx 定位精度问题通常把top参数减 0.15 英寸就够第三处是字体问题回到 2.3.1 的三套 typeface 设置。还有一个实用习惯把--asof的日期写进文件名输出成brazil_market_bp_en_20250630.pptx。下次对方问这份是哪天的口径看文件名就够了不用去翻构建日志。本文还有配套的精品资源点击获取