使用Python实现一键批量生成员工名片

 更新时间:2025年09月29日 09:12:48   作者:IT小本本  
这篇文章主要我等会详细介绍了如何使用Python从Excel导入员工信息,一键批量生成标准统一的PDF名片,文中的示例代码讲解详细,有需要的小伙伴可以了解下

手动制作几十上百张名片是不是超崩溃?重复复制粘贴、调整字体对齐到眼瞎,还总怕漏改姓名/职位——最后出来的名片格式还参差不齐……

今天给大家分享一个「效率神器」:用几行Python代码,从Excel导入员工信息,一键批量生成标准统一的PDF名片。不用懂复杂编程,跟着步骤走,小白也能10分钟上手!

一、先看效果:10秒生成50张标准名片

只要提前把员工信息整理成Excel表格(公司、姓名、部门、职位、电话),运行代码后,直接输出A4格式的PDF——每张A4纸上自动排列8张名片(2列4行),打印后裁剪就能用,格式100%统一!

Excel数据示例(列名必须和下面一致,不能错!):

公司姓名部门职位电话
某某科技有限公司张三产品部产品经理138xxxx1234
某某科技有限公司李四技术部前端开发139xxxx5678
某某科技有限公司王五行政部行政专员137xxxx9012

生成的PDF名片效果

浅灰色背景+蓝色分隔线,公司名、姓名、职位清晰排版,没有多余杂乱格式,打印裁剪后就是标准名片(约90mm×54mm,代码中可调整尺寸)。

二、核心原理:3个步骤搞定批量生成

这套代码的逻辑很简单,本质是「读数据→定格式→画名片」,核心分3个模块,我们不用深究代码细节,知道怎么用就行!

1. 准备工作:2件事要提前做

在运行代码前,先完成这2步,避免踩坑:

(1)整理Excel员工信息

按照上面的表格格式,把需要做名片的员工信息填好,保存为employee_data.xlsx(名字可以改,但后面代码里要对应)。

重点:列名必须是“公司”“姓名”“部门”“职位”“电话”,少一个或错一个,代码都会报错!

(2)安装依赖库

代码需要3个Python库来实现“读Excel”“画PDF”“找字体”,打开电脑的「命令提示符」(Windows)或「终端」(Mac),复制粘贴下面的命令,按回车安装:

pip install pandas reportlab matplotlib

如果提示“pip不是内部命令”,百度搜“Python添加环境变量”,简单设置下就行。

2. 代码解析:关键功能看这里

下面是完整代码(可以直接复制用),我标了重点,告诉大家哪些地方可以改,哪些不能动:

# 导入pandas库,用于数据处理和Excel文件读取
import pandas as pd
# 从reportlab库中导入A4页面尺寸
from reportlab.lib.pagesizes import A4
# 从reportlab库中导入canvas模块,用于创建PDF文档
from reportlab.pdfgen import canvas
# 从reportlab库中导入pdfmetrics模块,用于字体度量
from reportlab.pdfbase import pdfmetrics
# 从reportlab库中导入TTFont类,用于处理TrueType字体
from reportlab.pdfbase.ttfonts import TTFont
# 从reportlab库中导入HexColor类,用于使用十六进制颜色代码
from reportlab.lib.colors import HexColor
# 导入os模块,用于文件系统操作
import os
# 导入platform模块,用于获取系统信息
import platform
# 导入matplotlib的字体管理器,用于查找系统字体
import matplotlib.font_manager as fm

# 定义函数,获取系统中的中文字体
def get_chinese_font():
    # 获取当前操作系统名称
    system = platform.system()
    # 初始化字体列表
    fonts = []
    
    # 定义常见中文字体路径列表
    common_chinese_fonts = [
        # Windows 常用中文字体
        'C:/Windows/Fonts/simhei.ttf',  # 黑体
        'C:/Windows/Fonts/simsun.ttc',  # 宋体
        'C:/Windows/Fonts/simkai.ttf',  # 楷体
        'C:/Windows/Fonts/msyh.ttf',    # 微软雅黑
        
        # macOS 常用中文字体
        '/System/Library/Fonts/PingFang.ttc',  # 苹方
        '/Library/Fonts/Arial Unicode.ttf',
        
        # Linux 常用中文字体
        '/usr/share/fonts/truetype/arphic/uming.ttc',
        '/usr/share/fonts/truetype/droid/DroidSansFallbackFull.ttf',
    ]
    
    # 遍历常见中文字体路径列表
    for font_path in common_chinese_fonts:
        # 检查字体文件是否存在
        if os.path.exists(font_path):
            # 如果存在,返回字体路径
            return font_path
    
    # 如果上面的字体都不存在,尝试从matplotlib获取系统字体
    try:
        # 获取系统中所有存在的字体路径
        fonts = [f for f in fm.findSystemFonts() if os.path.exists(f)]
        # 遍历所有字体
        for font in fonts:
            try:
                # 检查字体名称中是否包含非ASCII字符(即中文字符)
                if any([True for c in fm.FontProperties(fname=font).get_name() if ord(c) > 127]):
                    # 如果找到中文字体,返回字体路径
                    return font
            except:
                # 如果处理出错,继续检查下一个字体
                continue
    except:
        # 如果获取系统字体出错,忽略错误
        pass
    
    # 如果找不到中文字体,返回None
    return None

# 定义函数,读取Excel数据
def read_excel(file_path):
    try:
        # 使用pandas读取Excel文件
        df = pd.read_excel(file_path)
        # 返回数据框
        return df
    except Exception as e:
        # 如果读取出错,打印错误信息
        print(f"读取Excel文件时出错: {e}")
        # 返回None
        return None

# 定义函数,创建PDF名片
def create_business_cards(df, output_file):
    # 获取中文字体路径
    chinese_font_path = get_chinese_font()
    
    # 检查是否找到中文字体
    if chinese_font_path:
        # 设置字体名称
        font_name = 'ChineseFont'
        # 注册中文字体
        pdfmetrics.registerFont(TTFont(font_name, chinese_font_path))
        # 打印使用的字体路径
        print(f"使用中文字体: {chinese_font_path}")
    else:
        # 如果找不到中文字体,使用默认字体
        font_name = 'Helvetica'  # 默认字体
        # 打印警告信息
        print("警告: 找不到中文字体,中文可能显示为乱码")
    
    # 创建PDF文档,使用A4页面大小
    c = canvas.Canvas(output_file, pagesize=A4)
    # 获取A4页面的宽度和高度
    width, height = A4
    
    # 设置名片尺寸和布局参数
    card_width = 250  # 名片宽度
    card_height = 150  # 名片高度
    margin = 20  # 边距
    cards_per_row = 2  # 每行名片数量
    cards_per_column = 4  # 每列名片数量
    
    # 遍历数据框中的每一行
    for i, record in df.iterrows():
        # 计算当前名片在页面中的位置
        row_num = i % (cards_per_row * cards_per_column)
        col = row_num % cards_per_row  # 计算列位置
        row = row_num // cards_per_row  # 计算行位置
        
        # 计算名片在页面上的x坐标
        x = margin + col * (card_width + margin)
        # 计算名片在页面上的y坐标
        y = height - margin - (row + 1) * card_height - row * margin
        
        # 检查是否需要添加新页面
        if row_num == 0 and i > 0:
            # 添加新页面
            c.showPage()
        
        # 绘制名片背景
        c.setFillColor(HexColor('#f8f8f8'))  # 设置填充颜色
        c.roundRect(x, y, card_width, card_height, 5, fill=1, stroke=0)  # 绘制圆角矩形
        
        # 绘制名片边框
        c.setStrokeColor(HexColor('#cccccc'))  # 设置边框颜色
        c.setLineWidth(0.5)  # 设置边框宽度
        c.roundRect(x, y, card_width, card_height, 5, fill=0, stroke=1)  # 绘制圆角矩形边框
        
        # 绘制公司名称
        c.setFillColor(HexColor('#2c3e50'))  # 设置文字颜色
        c.setFont(font_name, 14)  # 设置字体和大小
        company = str(record['公司'])  # 获取公司名称
        c.drawString(x + 15, y + card_height - 25, company)  # 在名片上绘制公司名称
        
        # 绘制分隔线
        c.setStrokeColor(HexColor('#3498db'))  # 设置线条颜色
        c.setLineWidth(1)  # 设置线条宽度
        c.line(x + 15, y + card_height - 35, x + card_width - 15, y + card_height - 35)  # 绘制分隔线
        
        # 绘制姓名(较大字体)
        c.setFillColor(HexColor('#2c3e50'))  # 设置文字颜色
        c.setFont(font_name, 12)  # 设置字体和大小
        name = str(record['姓名'])  # 获取姓名
        c.drawString(x + 15, y + card_height - 60, f"姓名:{name}")  # 在名片上绘制姓名
        
        # 绘制其他信息
        c.setFont(font_name, 10)  # 设置字体和大小
        c.setFillColor(HexColor('#555555'))  # 设置文字颜色
        
        department = str(record['部门'])  # 获取部门
        c.drawString(x + 15, y + card_height - 80, f"部门:{department}")  # 在名片上绘制部门
        
        position = str(record['职位'])  # 获取职位
        c.drawString(x + 15, y + card_height - 100, f"职位:{position}")  # 在名片上绘制职位
        
        phone = str(record['电话'])  # 获取电话
        c.drawString(x + 15, y + card_height - 120, f"电话:{phone}")  # 在名片上绘制电话
    
    # 保存PDF文件
    c.save()
    # 打印成功信息
    print(f"名片已生成到文件: {output_file}")

# 主程序入口
if __name__ == "__main__":
    # 指定Excel文件路径
    excel_file = "employee_data.xlsx"  # 请根据实际情况修改
    
    # 指定输出PDF文件路径
    pdf_file = "员工名片1.pdf"
    
    # 读取Excel数据
    data = read_excel(excel_file)
    
    # 检查是否成功读取数据
    if data is not None:
        # 创建名片
        create_business_cards(data, pdf_file)

3. 一步一步用:小白也能会

1.复制代码:把上面的代码复制到记事本里,然后把文件后缀改成.py(比如生成名片.py)。

2.改路径:打开.py文件,找到if __name__ == "__main__":下面的两行:

  • excel_file:改成你的Excel文件的完整路径(比如"D:/工作/员工信息.xlsx");
  • pdf_file:改成你想保存PDF的路径(比如"D:/工作/新员工名片.pdf")。
  • 路径里的斜杠要写/,不是\!比如C:/Files/,不是C:\Files\

3.运行代码:双击.py文件,或在终端里输入python 生成名片.py,等待几秒。

4.看结果:如果提示“搞定!名片在:xxx”,就去对应的路径找PDF;如果出错,看提示(比如“读Excel出错”,可能是Excel路径错了)。

三、避坑指南:这些问题别踩

1.中文乱码

代码会自动找中文字体,如果还是乱码,手动指定字体路径:

找到common_chinese_fonts列表,在里面加一行你电脑里的中文字体路径(比如Windows的C:/Windows/Fonts/msyh.ttc,Mac的/Library/Fonts/华文黑体.ttf)。

2.Excel列名错了

必须是“公司”“姓名”“部门”“职位”“电话”,少一个字、多一个字都不行(比如“公司名称”就会报错)。

3.PDF保存不了

检查pdf_file的路径是否存在(比如你写了"D:/工作/名片.pdf",但“工作”文件夹不存在,就会保存失败),先建好文件夹再运行。

4.想改名片样式

  • 改尺寸:调card_widthcard_height(比如想做更大的名片,改成card_width=300card_height=180);
  • 改颜色:把HexColor('#xxx')里的xxx换成颜色代码(百度“颜色代码查询”,比如红色是#ff0000);
  • 加logo:在画背景后加一行c.drawImage("logo.png", x+15, y+10, width=50, height=50),把logo.png换成你的logo路径和尺寸。

以上就是使用Python实现一键批量生成员工名片的详细内容,更多关于Python生成员工名片的资料请关注脚本之家其它相关文章!

相关文章

  • 使用Python构建一个高效的日志处理系统

    使用Python构建一个高效的日志处理系统

    这篇文章主要为大家详细讲解了如何使用Python开发一个专业的日志分析工具,能够自动化处理、分析和可视化各类日志文件,大幅提升运维效率,需要的可以了解下
    2025-07-07
  • Python qrcode 生成一个二维码的实例详解

    Python qrcode 生成一个二维码的实例详解

    在本篇文章里小编给大家整理的是关于Python qrcode 生成一个二维码的实例内容,需要的朋友们可以学习参考下。
    2020-02-02
  • Python函数作用域示例详解

    Python函数作用域示例详解

    本文介绍了Python中的LEGB作用域规则,详细解析了变量查找的四个层级,通过具体代码示例,展示了各层级的变量访问规则和特性,对python函数作用域相关知识感兴趣的朋友一起看看吧
    2025-07-07
  • 详解解决jupyter不能使用pytorch的问题

    详解解决jupyter不能使用pytorch的问题

    这篇文章主要介绍了详解解决jupyter不能使用pytorch的问题,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-02-02
  • Pytorch数据拼接与拆分操作实现图解

    Pytorch数据拼接与拆分操作实现图解

    这篇文章主要介绍了Pytorch数据拼接与拆分操作实现图解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-04-04
  • PyQt教程之自定义组件Switch Button的实现

    PyQt教程之自定义组件Switch Button的实现

    这篇文章主要为大家详细介绍了PyQt中如何实现自定义组件Switch Button,文中的示例代码简洁易懂,具有一定的学习价值,感兴趣的可以了解一下
    2023-05-05
  • Python中的线程同步的常用方法总结

    Python中的线程同步的常用方法总结

    在Python多线程编程中,我们常常需要处理多个线程同时访问共享数据的情况,为了防止数据在多线程之间出现冲突,我们需要对线程进行同步。本文将详细介绍Python中的线程同步的几种常用方法,需要的朋友可以参考下
    2023-06-06
  • python 虚拟环境详解

    python 虚拟环境详解

    这篇文章主要为大家介绍了python 虚拟环境,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助<BR>
    2021-12-12
  • Python实现创建词云的示例详解

    Python实现创建词云的示例详解

    词云一般是根据输入的大量词语生成的,如果某个词语出现的次数越多,那么相应的大小就会越大,本文将利用wordcloud模块实现词云生成,需要的可以参考下
    2023-10-10
  • python在linux系统下获取系统内存使用情况的方法

    python在linux系统下获取系统内存使用情况的方法

    这篇文章主要介绍了python在linux系统下获取系统内存使用情况的方法,涉及Python在Linux平台下获取系统硬件信息的相关技巧,需要的朋友可以参考下
    2015-05-05

最新评论