ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

创业之星实训报告:从Excel清洗到指标分析与PDF导出全流程

2026/9/17 22:48:03 拓冰建站 浏览量
创业之星实训报告:从Excel清洗到指标分析与PDF导出全流程 简介《创业之星实训报告总结.pdf》是一份面向参加“创业之星”企业经营模拟实训的学生与指导教师的文档资料重点解决实训流程不熟悉、报告不知如何组织等问题。内容按“实训认识—实训内容—实训心得—扩展阅读”展开既有对总裁、财务、技术、市场、销售、生产等角色的职责梳理也有八季度模拟经营的实战复盘如产品研发周期调整、北京/上海/广州市场需求分析、实用型与商务型手机的原料与定价策略等还总结了技术总监的岗位心得与团队协作经验可作为撰写实训报告、备赛复盘和课程结业展示的参考模板。资源共1个PDF文件约613KB目前已吸引200人学习下载适合正在修读创业基础、企业管理类课程或备战相关实训竞赛的读者快速了解完整报告框架。1. 创业之星实训报告卡你的不是写作是数据“创业之星实训报告总结.pdf”这个名字看起来像一份结课作业的文件名但交上去之后被批“没有分析含量”的往往不是文笔问题而是数字没对齐。创业之星这类模拟经营系统按季度推进每个季度要决策研发、生产、广告、定价、贷款系统算完就生成一张资金报表。多数人的实训报告就是把系统里的期末数抄一遍再配上截图结论全靠“我觉得”。问题在于系统的原始报表是二维的只有当期金额没有趋势、没有比率、没有对比而老师想看到的是“这个季度权益为什么涨、下一个季度现金流会不会断”。所以这个标题真正值得研究的不是 PDF 格式是怎么把散落在各季度报表里的数据变成能解释决策的复盘。按一条可复现的链路往下走先把每季度导出的 Excel 整理成一张宽表用 pandas 算经营指标用 matplotlib 画趋势最后用 HTML 转 PDF 合成带书名签的报告。适合正在写实训报告的学生也适合想统一批改口径的指导老师。2. 先把每季度导出的 Excel 攒成一张宽表创业之星数据清洗清单实训报告的第一道坑不是分析是数据源。创业之星系统多数版本支持把经营结果导出成 Excel但导出方式因机房电脑和系统版本而异有的整赛季一张表有的每个季度单独一个文件。要写总结第一步不是急着画图而是先把所有季度的数字装进同一个 DataFrame。常见做法是每个季度存一个文件自己按固定规则重命名然后一次性读入。别指望原始文件名有规律机房导出的文件通常叫“比赛结果(1).xlsx”“导出20240101.xlsx”之类直接 glob 会读出一堆顺序错乱的数据。2.1 文件命名先统一季度编号就是唯一主键我一般会在拿到导出文件后先手工或脚本批量重命名成“季报_1.xlsx”“季报_2.xlsx”这种格式。不要依赖 Excel 内部的 sheet 名也不要让文件名里出现“第一季”“第1期”这种二义性文本解析时容易踩坑。文件名里的数字就是主键后续所有分析和图表都靠它排序。for f in 比赛结果*.xlsx; do n$(echo $f | grep -oE [0-9] | head -1) mv $f 季报_${n}.xlsx done这段脚本的作用是从原文件名里提取第一个数字作为季度编号再统一改名为季报_N.xlsx。改完名之后再读取就稳定了。注意grep -oE [0-9] | head -1只抓第一个数字如果文件名里同时出现了年份和季度号比如“比赛结果20240102第一季.xlsx”提取出来的可能是 20240102 而不是 1这种文件最好手工改不值得为一个文件写更复杂的正则。再看读取和纵向拼接的代码import glob import pandas as pd files sorted( glob.glob(季报_*.xlsx), keylambda x: int(x.split(_)[1].split(.)[0]) ) df_list [] for f in files: tmp pd.read_excel(f, header0) tmp[季度] f df_list.append(tmp) df pd.concat(df_list, ignore_indexTrue) print(df.head())split(_)[1].split(.)[0]是把“季报_3.xlsx”里的“3”取出来做排序关键字保证季度 10 不会排在季度 2 前面。字符串排序下“10”会小于“2”不处理的话数据顺序是乱的后面画趋势图会出错。每次读取时把文件名存进“季度”列是为了让拼接后的数据还能追溯到来源。pd.concat 用ignore_indexTrue重新生成行索引避免多个 Excel 的索引重复。提示如果系统导出的是整个赛季一张总表跳过这一步直接看 2.2 的字段分类。2.2 导出表的字段先分四类再决定哪些进分析创业之星导出的报表字段名称在不同版本里略有出入但大体可以分成四类资金类、存货类、收入类、费用类。整理字段的意义不在于精确记账而在于知道每个数字是“期末值”还是“本期发生值”。很多人在报告里把期末现金和当季销售收入混在一起算出来的指标就歪了。我见过比较常见的导出字段映射如下类别常见字段名取值含义备注资金类现金、期末现金期末余额报告里画现金流曲线用资金类短期贷款、银行借款期末余额用于流动比率计算存货类原材料库存、成品库存期末数量或金额数量与金额要看表头单位收入类销售收入、中标金额本期发生额有的表给的是“累计”费用类广告费、研发费、培训费本期发生额按字段名判断不猜权益类所有者权益、净资产期末余额排名核心指标字段名的判断口诀带“期末”“余额”“结存”的是存量带“本期”“当月”的是流量“累计”开头的要先做环比才能写进分析。如果字段叫“销售收入”但没有标明是累计还是当月去系统界面交叉看一下或者对比两行数字的差异——累计值在增长当期值会波动一眼能分辨。2.3 两个高频清洗点字符串数字和合并单元格机房导出的 Excel 有两个特征最容易让 pandas 读出来的数据是“脏”的。第一个是数字以文本格式存储读进来是 object 类型求和时报错第二个是报表有合并单元格比如“所有者权益”这一列只有每个季度的最后一行有值其余是 NaN。处理方式如下df[现金] pd.to_numeric(df[现金], errorscoerce) df[所有者权益] pd.to_numeric(df[所有者权益], errorscoerce) df[[季度编号]] df[季度].str.extract(r(\d)).astype(int)to_numeric配合errorscoerce把中文逗号、千分位、空格这类文本直接转成 NaN后续再用fillna处理。这样至少不会因为一个格式问题中断整个脚本。正则提取季度编号时源数据是“季报_3.xlsx”提取结果是 3类型转成 int后面按编号排序、做 diff 都依赖这一列。合并单元格造成的 NaN要看是哪个字段纵向维度的缺失可以ffill()但金额字段缺失就要回系统核对不能盲目填充。真实项目里最容易翻车的就是“应收账款”这种科目有的季度确实没有发生额填 0 和填上一期值结果完全不同。3. 用 pandas 把经营指标算出来ROE、毛利率、现金周转的取数口径数据清洗完了下一步是算指标。实训报告里最容易出现的算式错误是把“期末所有者权益”当“净利润”用或者用累计销售收入除以期末权益算 ROE出来一个数值巨大且毫无意义的比率。沙盘经营里最常被写进报告的指标是 ROE、毛利率、存货周转和流动比率关键不在于公式本身而在于取哪一列的数。3.1 先把累计值拆成当期值再看趋势如果导出表里的销售收入是累计数直接画折线图是一条单调上升的线看不出经营转折。要靠季度编号做 diff把累计值还原成当期值再分析。for col in [销售收入, 直接成本, 毛利]: df[f{col}_当期] ( df.groupby(季度编号)[col] .diff() .fillna(df[col]) )这段代码的含义是对每个季度编号分组diff()计算当前行与上一行的差值第一行因为前面没有值diff 结果为 NaN用原始值填充就得到了第一季度的发生额。为什么用groupby而不是直接df[col].diff()因为数据可能没有严格按季度排序分组后 diff 才能保证算的是同一条经营线的差值。如果所有文件已经排好了序这里直接df[col].diff()也能跑但多一个分组不会错。3.2 ROE 先问口径用的是累计还是当期创业之星这类系统里季末排名通常直接比“所有者权益”绝对值。但权益绝对值受初始资金和融资影响很大写进报告的解释力有限真正能说明经营效率的是 ROE。实训报告里一般用两种口径口径公式适用场景累计 ROE累计净利润 ÷ 期末所有者权益解释排名变化的长期效率当期 ROE当季净利润 ÷ 期初所有者权益回顾单个季度的决策质量代码上两种口径分别是df[累计ROE] df[税后净利润].cumsum() / df[所有者权益] df[当期ROE] df[税后净利润_当期] / df[所有者权益].shift(1)cumsum()算的是从第一季到当前的净利润累计值。shift(1)取上一季度的期末权益作为本季的期初权益。如果导出表里没有“税后净利润”字段只有“利润总额”就按利润总额 * (1 - 25%)估算并在报告的图注里注明估算方式。注意累计 ROE 的分母在亏损季度可能很小甚至接近 0算出来的值会异常大这时要人工判断是不是把分母取错了而不是照抄数值。3.3 毛利率、存货周转、流动比率每个指标的取数位置这三个指标是实训报告里最容易写但最容易算错的。给一张常用的取数对照表指标分子分母常见错误毛利率毛利累计损益表销售收入用“直接成本”当“毛利”存货周转率当期直接材料消耗期初存货期末存货÷2用了存货金额却忘了材料消耗流动比率流动资产现金应收账款成品短期贷款应付账款漏掉应收账款则比率偏低df[存货周转率] ( df[直接成本当期] / ((df[存货期初] df[存货期末]) / 2) ) df[存货周转率] df[存货周转率].replace( [float(inf), float(-inf)], None ).fillna(0)存货周转率的含义是这个季度消耗的原料相当于平均存货的几倍。如果期初和期末存货都为 0分母为 0 会出现 inf这里显式替换成 0并在报告中标注“该季度无存货周转”。流动比率要用“短期贷款”而不是“长期贷款”沙盘里长期贷款通常不参与一年内的偿付压力计算。有一个常见误用是把系统报表里的“所有者权益”直接当流动资产用这会让流动比率虚高到几倍以上一眼就是错的。4. 给报告配趋势图创业之星经营曲线的三种画法与中文字体图表是实训报告里最能体现“复盘感”的部分但也是技术细节最碎的部分。多数人卡在第一关matplotlib 默认字体画不出中文图里全是方块。另外还有选图问题——什么指标画什么图画错了一样的数据也看不出结论。4.1 中文字体配置SimHei 不是唯一选择机房电脑和本地电脑的字体环境不一样SimHei在 macOS 上通常没有Linux 服务器上一般也没有。我一般建议用系统字体列表加备选的方式配置import matplotlib matplotlib.use(Agg) import matplotlib.pyplot as plt plt.rcParams[font.sans-serif] [ Noto Sans CJK SC, PingFang SC, SimHei ] plt.rcParams[axes.unicode_minus] Falsefont.sans-serif列表里的字体按顺序查找第一个不存在的会自动落到第二个。axes.unicode_minus设置为 False是为了让负号显示成短横而不是方框否则所有负数坐标轴都会出现乱码。如果设置了字体列表仍然有警告用fc-list :langzh查看系统里实际可用的中文字体把存在的字体名放到列表最前面。matplotlib.use(Agg)放在import pyplot之前是为了在无图形界面环境比如服务器下不弹窗直接保存图片。4.2 现金流曲线跟着崩盘点找决策失误现金流曲线是实训报告里必画的图。很多沙盘局的崩盘不是利润问题是现金断了前期扩张太快、贷款到期、应收账款没到账三个因素叠在一起就会在某一季度集中爆雷。画法用普通折线加数据点fig, ax plt.subplots(figsize(10, 4.5)) ax.plot(df[季度编号], df[现金], markero, linewidth1.6) ax.axhline(0, colorgray, linewidth0.8, linestyle--) ax.set_xlabel(季度) ax.set_ylabel(期末现金) ax.set_title(各季度期末现金变化) fig.tight_layout() fig.savefig(chart_cash.png, dpi160)axhline(0)这条水平虚线很重要它标出了“现金为 0”的位置如果曲线出现了 0 以下的点说明该季度资产负债率可能已经到临界值。保存图片时dpi160是为了保证放进 PDF 后清晰实训报告通常用 A4 排版160dpi 足够打印也不至于让 PDF 体积太大。4.3 所有者权益曲线看斜率而不是绝对值所有者权益曲线的价值在“增长加速度”而不在绝对高度。连续几季增长平缓说明是产能爬坡期某季度开始斜率变陡通常对应新产线上线或大订单交付。画权益图时建议同时画一张差分图equity df.set_index(季度编号)[所有者权益] diff equity.diff().fillna(equity.iloc[0]) fig, axes plt.subplots(1, 2, figsize(12, 4)) axes[0].plot(equity.index, equity.values, markero) axes[0].set_title(所有者权益变化) axes[1].bar(diff.index, diff.values) axes[1].set_title(权益环比增量) fig.tight_layout() fig.savefig(chart_equity.png, dpi160)左图看趋势右图看增量。如果右图出现负数说明这个季度的经营亏损或资产减值抵消了之前的积累写总结时要单独解释。差分图比折线图更容易让老师看出“哪个季度出了问题”。4.4 毛利率与广告费率双轴对照解释亏损季的常见原因亏损季度最常见的两个解释是“广告费投多了”和“毛利率被压低了”但这两件事经常同时发生。双轴图可以直观看出哪一个是主因fig, ax1 plt.subplots(figsize(10, 4.5)) ax1.plot(df[季度编号], df[毛利率], markero, colortab:blue) ax1.set_ylabel(毛利率 (%)) ax2 ax1.twinx() ax2.plot(df[季度编号], df[广告费率], markers, colortab:red) ax2.set_ylabel(广告费用率 (%)) fig.tight_layout() fig.savefig(chart_margin_ad.png, dpi160)毛利率用百分比广告费率用广告费除以销售收入。两个指标画在同一个图里量纲不同所以要用twinx()生成共享 x 轴的第二 y 轴。看图时如果毛利率下行但广告费率平稳解释方向是“价格战或原材料成本上升”如果广告费率大幅上升而毛利率稳定解释方向是“获客效率下降”。这两句话可以直接写进报告的总结段落比空泛的“本期利润下降”具体得多。5. 用 HTML WeasyPrint 把报告合成 PDF中文、页码、书签一次配好报告写到最后要交 PDF常见做法是把 Word 导出成 PDF或者用 LaTeX 排版。但实训报告里穿插了大量图表和表格LaTeX 上手成本高Word 导出后样式在不同电脑上容易错位。我一般用 WeasyPrint它是 Python 库把 HTML 加 CSS 渲染成 PDF排版逻辑和网页一致中文支持通过系统字体完成页码、目录、书签都能自动生成。5.1 为什么选 WeasyPrint 而不是 reportlabreportlab 也能生成 PDF但它属于底层绘图库画一个表格要手动控制每个单元格的坐标中文字体还得单独注册开发成本高。WeasyPrint 的处理方式是写 HTML 模板CSS 控制样式逻辑更清晰且对中文字体支持友好——只要系统里有中文字体CSS 里设置font-family就行。安装命令pip install weasyprint。注意 Linux 服务器上要先装系统依赖pango、cairomacOS 上如果用 Homebrew 装的 Python一般可以直接跑。5.2 最少能跑通的 HTML 模板与生成脚本先准备一个 HTML 模板包含 A4 页面、页脚页码、中文字体设置!DOCTYPE html html langzh-CN head meta charsetutf-8 style page { size: A4; margin: 2cm 2cm 1.8cm 2cm; bottom-center { content: counter(page) / counter(pages); } } body { font-family: Noto Sans CJK SC, PingFang SC, sans-serif; font-size: 10.5pt; line-height: 1.8; } h1 { font-size: 16pt; bookmark-level: 1; } img { max-width: 100%; } table { border-collapse: collapse; width: 100%; margin: 0.8em 0; } th, td { border: 0.5pt solid #666; padding: 4pt 6pt; text-align: left; } /style /head body !-- 报告内容插入位置 -- /body /htmlpage定义页面尺寸和页边距bottom-center里的counter(page)和counter(pages)是 WeasyPrint 的 CSS 计数器分别表示当前页码和总页数。bookmark-level会把 h1 标题自动生成 PDF 侧边栏书签整份报告导出后左侧直接有导航目录。Python 侧把图表和表格拼进模板再导出from pathlib import Path from weasyprint import HTML charts [ chart_cash.png, chart_equity.png, chart_margin_ad.png, ] img_tags for chart in charts: uri Path(chart).resolve().as_uri() img_tags fimg src{uri} alt趋势图br html_template Path(report_template.html).read_text(encodingutf-8) html_content html_template.replace(!-- 报告内容插入位置 --, img_tags) HTML(stringhtml_content).write_pdf(创业之星实训报告总结.pdf)这段代码的核心是把本地图片路径转换成file://协议的 URI。Path.resolve().as_uri()在 Windows 上会处理盘符和反斜杠避免字符串拼接时出现路径错误。HTML(string...)接受完整 HTML 字符串替换模板里的占位注释一次 write_pdf 就完成渲染。如果图片很多可以把图片标签写在一个循环里拼起来避免手写无数个img。提示拼字符串的时候注意转义HTML 模板里的图片路径如果不转成 URI包含中文目录时会渲染失败。5.3 生成带页码的目录页WeasyPrint 支持target-counter可以在文档内生成一页真目录并自动填充每个章节的页码a.xref { text-decoration: none; color: black; } a.xref::after { content: target-counter(attr(href url), page); }HTML 里写目录条目时这样写pa classxref href#ch2第2章 Excel 数据整理/a/p:after伪元素会把目标元素所在页码追加到链接文字后面效果是“第2章 Excel 数据整理 3”。如果章节标题之前写的是“## 2.”记得给对应的 h2 加上 id例如h2 idch2。这比手工填页码可靠报告结构调整后重新生成一次 PDF页码自动更新不会出现“目录写第5页实际已到第7页”的尴尬。6. 实训报告总结怎么写才有复盘感指标、决策、结果三层的套话替代方案很多实训报告的四季度总结写成一个模板“第一季度我们做了什么……第二季度我们做了什么……”这是流水账。复盘感的写法是把每个季度拆成三层看到了什么指标变化做了什么决策结果如何。一句话公式是“因为看到了 X 数字在 Y 季度做了 Z 决策结果是 W 指标变成了多少”。下面给出三个常见场景的写法对照场景平庸写法复盘写法毛利率下滑“本期利润下降是因为成本上升。”“毛利率由 38% 降至 31%主因是原材料成本上涨Q4 将材料账期从现货采购改为按季度批量采购预计可回升至 34%。”广告费高企“我们加大了广告投放。”“广告费用率达 22% 但中标率同比下降单均获客成本增加Q3 已把广告预算转向高毛利市场。”现金紧张“本期现金较少。”“期末现金仅 8.4 万低于安全线原因是应收账款账期 2 期未回款已通过短期贷款缓解下季度需控制产线扩张节奏。”写作时注意每个结论都要落到前几章算出来的指标上。比如写“盈利能力下降”后面必须跟上“毛利率具体下降了几个点”写“营销效率差”必须说明广告费用率变化和中标数量。这样老师能看到你的总结不是抄系统的报表而是真的理解了数字背后的经营含义。pdftotext 创业之星实训报告总结.pdf - | grep -c 季度报告提交前用这一条命令验证 PDF 内容完整性解析 PDF 的文本层统计“季度”关键词出现次数。如果数字不等于实际季度数说明有章节没渲染进去或图片遮挡了文字需要回头检查模板中的内容占位符是否全部替换成真实数据。本文还有配套的精品资源点击获取