使用Python實(shí)現(xiàn)一鍵批量生成員工名片
手動(dòng)制作幾十上百張名片是不是超崩潰?重復(fù)復(fù)制粘貼、調(diào)整字體對(duì)齊到眼瞎,還總怕漏改姓名/職位——最后出來的名片格式還參差不齊……
今天給大家分享一個(gè)「效率神器」:用幾行Python代碼,從Excel導(dǎo)入員工信息,一鍵批量生成標(biāo)準(zhǔn)統(tǒng)一的PDF名片。不用懂復(fù)雜編程,跟著步驟走,小白也能10分鐘上手!
一、先看效果:10秒生成50張標(biāo)準(zhǔn)名片
只要提前把員工信息整理成Excel表格(公司、姓名、部門、職位、電話),運(yùn)行代碼后,直接輸出A4格式的PDF——每張A4紙上自動(dòng)排列8張名片(2列4行),打印后裁剪就能用,格式100%統(tǒng)一!
Excel數(shù)據(jù)示例(列名必須和下面一致,不能錯(cuò)!):
| 公司 | 姓名 | 部門 | 職位 | 電話 |
|---|---|---|---|---|
| 某某科技有限公司 | 張三 | 產(chǎn)品部 | 產(chǎn)品經(jīng)理 | 138xxxx1234 |
| 某某科技有限公司 | 李四 | 技術(shù)部 | 前端開發(fā) | 139xxxx5678 |
| 某某科技有限公司 | 王五 | 行政部 | 行政專員 | 137xxxx9012 |
生成的PDF名片效果:
淺灰色背景+藍(lán)色分隔線,公司名、姓名、職位清晰排版,沒有多余雜亂格式,打印裁剪后就是標(biāo)準(zhǔn)名片(約90mm×54mm,代碼中可調(diào)整尺寸)。

二、核心原理:3個(gè)步驟搞定批量生成
這套代碼的邏輯很簡單,本質(zhì)是「讀數(shù)據(jù)→定格式→畫名片」,核心分3個(gè)模塊,我們不用深究代碼細(xì)節(jié),知道怎么用就行!
1. 準(zhǔn)備工作:2件事要提前做
在運(yùn)行代碼前,先完成這2步,避免踩坑:
(1)整理Excel員工信息
按照上面的表格格式,把需要做名片的員工信息填好,保存為employee_data.xlsx(名字可以改,但后面代碼里要對(duì)應(yīng))。
重點(diǎn):列名必須是“公司”“姓名”“部門”“職位”“電話”,少一個(gè)或錯(cuò)一個(gè),代碼都會(huì)報(bào)錯(cuò)!
(2)安裝依賴庫
代碼需要3個(gè)Python庫來實(shí)現(xiàn)“讀Excel”“畫PDF”“找字體”,打開電腦的「命令提示符」(Windows)或「終端」(Mac),復(fù)制粘貼下面的命令,按回車安裝:
pip install pandas reportlab matplotlib
如果提示“pip不是內(nèi)部命令”,百度搜“Python添加環(huán)境變量”,簡單設(shè)置下就行。
2. 代碼解析:關(guān)鍵功能看這里
下面是完整代碼(可以直接復(fù)制用),我標(biāo)了重點(diǎn),告訴大家哪些地方可以改,哪些不能動(dòng):
# 導(dǎo)入pandas庫,用于數(shù)據(jù)處理和Excel文件讀取
import pandas as pd
# 從reportlab庫中導(dǎo)入A4頁面尺寸
from reportlab.lib.pagesizes import A4
# 從reportlab庫中導(dǎo)入canvas模塊,用于創(chuàng)建PDF文檔
from reportlab.pdfgen import canvas
# 從reportlab庫中導(dǎo)入pdfmetrics模塊,用于字體度量
from reportlab.pdfbase import pdfmetrics
# 從reportlab庫中導(dǎo)入TTFont類,用于處理TrueType字體
from reportlab.pdfbase.ttfonts import TTFont
# 從reportlab庫中導(dǎo)入HexColor類,用于使用十六進(jìn)制顏色代碼
from reportlab.lib.colors import HexColor
# 導(dǎo)入os模塊,用于文件系統(tǒng)操作
import os
# 導(dǎo)入platform模塊,用于獲取系統(tǒng)信息
import platform
# 導(dǎo)入matplotlib的字體管理器,用于查找系統(tǒng)字體
import matplotlib.font_manager as fm
# 定義函數(shù),獲取系統(tǒng)中的中文字體
def get_chinese_font():
# 獲取當(dāng)前操作系統(tǒng)名稱
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獲取系統(tǒng)字體
try:
# 獲取系統(tǒng)中所有存在的字體路徑
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:
# 如果處理出錯(cuò),繼續(xù)檢查下一個(gè)字體
continue
except:
# 如果獲取系統(tǒng)字體出錯(cuò),忽略錯(cuò)誤
pass
# 如果找不到中文字體,返回None
return None
# 定義函數(shù),讀取Excel數(shù)據(jù)
def read_excel(file_path):
try:
# 使用pandas讀取Excel文件
df = pd.read_excel(file_path)
# 返回?cái)?shù)據(jù)框
return df
except Exception as e:
# 如果讀取出錯(cuò),打印錯(cuò)誤信息
print(f"讀取Excel文件時(shí)出錯(cuò): {e}")
# 返回None
return None
# 定義函數(shù),創(chuàng)建PDF名片
def create_business_cards(df, output_file):
# 獲取中文字體路徑
chinese_font_path = get_chinese_font()
# 檢查是否找到中文字體
if chinese_font_path:
# 設(shè)置字體名稱
font_name = 'ChineseFont'
# 注冊(cè)中文字體
pdfmetrics.registerFont(TTFont(font_name, chinese_font_path))
# 打印使用的字體路徑
print(f"使用中文字體: {chinese_font_path}")
else:
# 如果找不到中文字體,使用默認(rèn)字體
font_name = 'Helvetica' # 默認(rèn)字體
# 打印警告信息
print("警告: 找不到中文字體,中文可能顯示為亂碼")
# 創(chuàng)建PDF文檔,使用A4頁面大小
c = canvas.Canvas(output_file, pagesize=A4)
# 獲取A4頁面的寬度和高度
width, height = A4
# 設(shè)置名片尺寸和布局參數(shù)
card_width = 250 # 名片寬度
card_height = 150 # 名片高度
margin = 20 # 邊距
cards_per_row = 2 # 每行名片數(shù)量
cards_per_column = 4 # 每列名片數(shù)量
# 遍歷數(shù)據(jù)框中的每一行
for i, record in df.iterrows():
# 計(jì)算當(dāng)前名片在頁面中的位置
row_num = i % (cards_per_row * cards_per_column)
col = row_num % cards_per_row # 計(jì)算列位置
row = row_num // cards_per_row # 計(jì)算行位置
# 計(jì)算名片在頁面上的x坐標(biāo)
x = margin + col * (card_width + margin)
# 計(jì)算名片在頁面上的y坐標(biāo)
y = height - margin - (row + 1) * card_height - row * margin
# 檢查是否需要添加新頁面
if row_num == 0 and i > 0:
# 添加新頁面
c.showPage()
# 繪制名片背景
c.setFillColor(HexColor('#f8f8f8')) # 設(shè)置填充顏色
c.roundRect(x, y, card_width, card_height, 5, fill=1, stroke=0) # 繪制圓角矩形
# 繪制名片邊框
c.setStrokeColor(HexColor('#cccccc')) # 設(shè)置邊框顏色
c.setLineWidth(0.5) # 設(shè)置邊框?qū)挾?
c.roundRect(x, y, card_width, card_height, 5, fill=0, stroke=1) # 繪制圓角矩形邊框
# 繪制公司名稱
c.setFillColor(HexColor('#2c3e50')) # 設(shè)置文字顏色
c.setFont(font_name, 14) # 設(shè)置字體和大小
company = str(record['公司']) # 獲取公司名稱
c.drawString(x + 15, y + card_height - 25, company) # 在名片上繪制公司名稱
# 繪制分隔線
c.setStrokeColor(HexColor('#3498db')) # 設(shè)置線條顏色
c.setLineWidth(1) # 設(shè)置線條寬度
c.line(x + 15, y + card_height - 35, x + card_width - 15, y + card_height - 35) # 繪制分隔線
# 繪制姓名(較大字體)
c.setFillColor(HexColor('#2c3e50')) # 設(shè)置文字顏色
c.setFont(font_name, 12) # 設(shè)置字體和大小
name = str(record['姓名']) # 獲取姓名
c.drawString(x + 15, y + card_height - 60, f"姓名:{name}") # 在名片上繪制姓名
# 繪制其他信息
c.setFont(font_name, 10) # 設(shè)置字體和大小
c.setFillColor(HexColor('#555555')) # 設(shè)置文字顏色
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" # 請(qǐng)根據(jù)實(shí)際情況修改
# 指定輸出PDF文件路徑
pdf_file = "員工名片1.pdf"
# 讀取Excel數(shù)據(jù)
data = read_excel(excel_file)
# 檢查是否成功讀取數(shù)據(jù)
if data is not None:
# 創(chuàng)建名片
create_business_cards(data, pdf_file)
3. 一步一步用:小白也能會(huì)
1.復(fù)制代碼:把上面的代碼復(fù)制到記事本里,然后把文件后綴改成.py(比如生成名片.py)。
2.改路徑:打開.py文件,找到if __name__ == "__main__":下面的兩行:
excel_file:改成你的Excel文件的完整路徑(比如"D:/工作/員工信息.xlsx");pdf_file:改成你想保存PDF的路徑(比如"D:/工作/新員工名片.pdf")。- 路徑里的斜杠要寫
/,不是\!比如C:/Files/,不是C:\Files\。
3.運(yùn)行代碼:雙擊.py文件,或在終端里輸入python 生成名片.py,等待幾秒。
4.看結(jié)果:如果提示“搞定!名片在:xxx”,就去對(duì)應(yīng)的路徑找PDF;如果出錯(cuò),看提示(比如“讀Excel出錯(cuò)”,可能是Excel路徑錯(cuò)了)。
三、避坑指南:這些問題別踩
1.中文亂碼:
代碼會(huì)自動(dòng)找中文字體,如果還是亂碼,手動(dòng)指定字體路徑:
找到common_chinese_fonts列表,在里面加一行你電腦里的中文字體路徑(比如Windows的C:/Windows/Fonts/msyh.ttc,Mac的/Library/Fonts/華文黑體.ttf)。
2.Excel列名錯(cuò)了:
必須是“公司”“姓名”“部門”“職位”“電話”,少一個(gè)字、多一個(gè)字都不行(比如“公司名稱”就會(huì)報(bào)錯(cuò))。
3.PDF保存不了:
檢查pdf_file的路徑是否存在(比如你寫了"D:/工作/名片.pdf",但“工作”文件夾不存在,就會(huì)保存失?。?,先建好文件夾再運(yùn)行。
4.想改名片樣式:
- 改尺寸:調(diào)
card_width和card_height(比如想做更大的名片,改成card_width=300,card_height=180); - 改顏色:把
HexColor('#xxx')里的xxx換成顏色代碼(百度“顏色代碼查詢”,比如紅色是#ff0000); - 加logo:在畫背景后加一行
c.drawImage("logo.png", x+15, y+10, width=50, height=50),把logo.png換成你的logo路徑和尺寸。
以上就是使用Python實(shí)現(xiàn)一鍵批量生成員工名片的詳細(xì)內(nèi)容,更多關(guān)于Python生成員工名片的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
python統(tǒng)計(jì)mysql數(shù)據(jù)量變化并調(diào)用接口告警的示例代碼
這篇文章主要介紹了python統(tǒng)計(jì)mysql數(shù)據(jù)量變化并調(diào)用接口告警的示例代碼,幫助大家更好的利用python操作數(shù)據(jù)庫,感興趣的朋友可以了解下2020-09-09
Python設(shè)計(jì)模式中的結(jié)構(gòu)型適配器模式
這篇文章主要介紹了Python設(shè)計(jì)中的結(jié)構(gòu)型適配器模式,適配器模式即Adapter?Pattern,將一個(gè)類的接口轉(zhuǎn)換成為客戶希望的另外一個(gè)接口,下文內(nèi)容具有一定的參考價(jià)值,需要的小伙伴可以參考一下2022-02-02
解決Python中報(bào)錯(cuò)TypeError: must be str, not bytes問題
這篇文章主要介紹了解決Python中報(bào)錯(cuò)TypeError: must be str, not bytes問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-04-04
Python Ellipsis的使用實(shí)戰(zhàn)
Ellipsis是Python中的一個(gè)內(nèi)置常量,本文主要介紹了Python Ellipsis的使用實(shí)戰(zhàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2025-07-07
Python訪問PostgreSQL數(shù)據(jù)庫詳細(xì)操作
postgresql是常用的關(guān)系型數(shù)據(jù)庫,并且postgresql目前還保持著全部開源的狀態(tài),這篇文章主要給大家介紹了關(guān)于Python訪問PostgreSQL數(shù)據(jù)庫的相關(guān)資料,需要的朋友可以參考下2023-11-11
python中Tkinter詳細(xì)基礎(chǔ)教學(xué)實(shí)例代碼
這篇文章主要給大家介紹了關(guān)于python中Tkinter詳細(xì)基礎(chǔ)教學(xué)的相關(guān)資料,文中介紹了如Label、Button、Entry、Text、Frame、Menu、Canvas、Messagebox等的基本屬性和用法,并介紹了布局管理器pack、grid和place的使用方法,需要的朋友可以參考下2024-12-12

