当前位置: 首页 > article >正文

从想法到实践:Excel 转 PPT 应用的诞生之旅

2024 年 11 月,我着手开发了一款exe应用,其主要功能是读取 Excel 文件中的数据,并生成 PPT 文件。
在这里插入图片描述

这款应用看似简单,却给我的商业认知带来了深刻的启发。此前,我与一位老师合作,为其处理 Excel 转 PPT 的工作。当时,我的认知局限于只能在本地为他完成此项任务,若他想自行操作,还需在本地搭建 Python 环境。
后来,我阅读了《一人公司》这本书,从中领悟到若要赚钱,应尽可能将自身行为商业化,而商业化的首要条件是拥有自己的产品。恰在此时,我在抖音上看到了 Cursor 的视频,深受触动,于是果断着手开发。
整个 exe 应用程序的制作过程较为简便。我先是融入了之前相对简陋的代码,同时附上自己绘制的原型图,在短短一小时内便完成了这款应用。完成之后,仿佛开启了一扇全新的大门。
我突然意识到,在工作中若想让自身工作成果更出众,就应多做能为老板创造更多收益的事。比如开发完这个脚本,如果只是在本地调试,或分享给程序员调试,而未将其打造成应用程序或通过其他方式推广运行,其价值远低于将其制作为 exe 应用程序。在生活中,若能将利己之事转化为利他之事,也能为自己增添更多的赚钱渠道。
整个小工具的开发难点,主要并非在于脚本的开发,而是对 PPT 模板的理解。代码的核心逻辑

import argparse
from openpyxl import load_workbook
from pptx import Presentation
import os

VERSION = "1.0.0"

def generate_ppt(ppt_template, excel_file, output_file="output.pptx", max_row=None, fonts=None):
    """
    生成PPT文件
    
    参数:
    ppt_template: PPT模板文件路径
    excel_file: Excel数据文件路径
    output_file: 输出文件路径,默认为'output.pptx'
    max_row: 处理的最大行数,默认为None(处理所有行)
    fonts: 字体设置列表,默认为None(使用默认字体设置)
    """
    try:
        # 默认字体设置
        default_fonts = [
            ('Arial', True),           # 位置1
            ('微软雅黑', False),        # 位置2
            ('康熙字典體試用版', False), # 位置3
            ('微软雅黑', False)         # 位置4
        ]
        fonts = fonts or default_fonts
        
        print("正在加载文件...")
        
        # 加载文件
        wb = load_workbook(excel_file)
        ws = wb.active
        prs = Presentation(ppt_template)
        
        # 删除模板中的第一页(母版)
        rId = prs.slides._sldIdLst[0].rId
        prs.part.drop_rel(rId)
        del prs.slides._sldIdLst[0]
        
        print("正在生成PPT...")
        
        # 生成PPT
        row_count = 0
        for row in ws.iter_rows(min_row=2, values_only=True):
            # 检查是否达到最大行数
            row_count += 1
            if max_row and row_count > max_row:
                break
                
            if row[0] and row[1] and row[2] and row[3]:
                if len(row[1]) <= 4:  # 检查第二列的文字长度
                    slide = prs.slides.add_slide(prs.slide_layouts[0])
                    placeholders = slide.shapes.placeholders
                    
                    for i, pl in enumerate(placeholders):
                        if i < 4:  # 确保不超出范围
                            pl.text = str(row[i])
                            font = pl.text_frame.paragraphs[0].runs[0].font
                            font.name = fonts[i][0]
                            font.bold = fonts[i][1]
            
            if row_count % 10 == 0:
                print(f"已处理 {row_count} 行...")
        
        print("正在保存文件...")
        prs.save(output_file)
        
        processed_rows = min(row_count, max_row) if max_row else row_count
        print(f"处理完成!\n处理了 {processed_rows} 行数据\n文件保存在:{os.path.abspath(output_file)}")
        
    except Exception as e:
        print(f"错误:{str(e)}")
        raise

PPT 母版的参考链接:
https://zhuanlan.zhihu.com/p/5579902474


http://www.kler.cn/a/452730.html

相关文章:

  • 【LLM论文日更】| 训练大型语言模型在连续潜在空间中进行推理
  • gitlab克隆仓库报错fatal: unable to access ‘仓库地址xxxxxxxx‘
  • 参数名在不同的SpringBoot版本中,处理方案不同
  • JZ31 栈的压入、弹出序列
  • 《战神:诸神黄昏》游戏运行时提示找不到gamede.dll文件怎么办?gamede.dll丢失的修复指南
  • 事件抽取tr、ti、ar 和 ai的意思(触发词、事件类型、事件参数、参数的类型)
  • vscode+编程AI配置、使用说明
  • 【Spring 全家桶】 Spring IOC DI 保姆式教学, 教你不用new也能获取到对象的依赖注入方式, 建议收藏 . . .
  • BP分类-反向传播神经网络(Backpropagation Neural Network)
  • qt实现socketCAN
  • hive常用函数有哪些
  • HCIE-day9-OSPF
  • 亚远景-ISO 21434标准涵盖了哪些方面?
  • 基于深度学习(HyperLPR3框架)的中文车牌识别系统-搭建开发环境
  • 01.HTTPS的实现原理-HTTPS的概念
  • 【华为OD-E卷-MVP争夺战 100分(python、java、c++、js、c)】
  • Chrome+Postman做接口测试
  • 海格通信嵌入式面试题及参考答案
  • Ubuntu系统下 npm install -g tauri 报错问题处理
  • pnpm、Yarn 和 npm 的区别?
  • MySQL用表组织数据
  • 面试经典问题 —— 最大/小前K个数问题(top - K)问题
  • postgresql ERROR: cannot drop the currently open database
  • Java处理视频思路
  • 【接口自动化连载】使用yaml配置文件自动生成接口case
  • Postman最新接口自动化持续集成