【办公类-109-04】20250913圆形挂牌卡片(接送卡被子卡床卡入园卡_word编辑单面)
背景需求:为了发被子,我做了全校批量的圆形挂牌,可以绑在“被子包”提手上,便于再操场上发放被子时,很多老师可以协助根据学号发放。https://blog.csdn.net/reasonsummer/article/details/149755556?spm=1011.2415.3001.5331https://blog.csdn.net/reasonsummer/article/details/149755556?spm=1011.2415.3001.5331没想到,除了被子提示,领导和班主任还拓展出“家长接孩子排队卡”“床卡”“入园卡”的功能。但是问题也随之出现。9月1-8日,中班陆续插了6位孩子。班主任需要新孩子的“圆牌”“长方挂牌卡”。可是由于我做的PDF版本,而且内容本身就是图片(做成图片插入docx),所以班主任自己改不了。就只能找我来修改。(点名册已经做了PDF和excle编辑版,所以班主任没有索要)因为我也带班,所以要放学才能看到消息,然后再用程序批量做,虽然我尝试只批量几个班级(中班),但这只是快了一点点时间,加上发送,耗费我的精力和时间(来一个批量一次,很琐碎。对班主任来说,无法及时获取打印素材,增加焦虑感(这个任务实在很小,但是很需要)。所以必须做一个班主任自己可以编辑的圆牌和长方牌版本,后续就不用我再反复修改了。设计过程1,模板展位:我尝试了”形状圆形+文本框文字”,但是deepseek写了几十次代码,都无法把文本框文字合并到一起,最终会缺少或者重叠。单个docx可以但是无法合并在一个docx里(即时能合并,也不能保证一页撑满6图,因为这是文本框,会动来动去的)2、图片浮于文字下方在2列3行里插入空白圆形背景图片插入图片后,光标就移到顶部中间,我设置了浮于文字下方,但是因为是在表格里,所以默认图片占了位置。如果按回车,文字和图片会一起向下以上两种都不行,最后我只能考虑word插入背景图3、word背景图将第2次测试的模板图案(图片浮于文字上方+隐藏边框)全部复制到ppt,做成图片这个图片差不多就是A4-0.7CM边距的大小。再贴一个A4大小的蓝色背景做区分原始word,插入2*3,边框隐藏再设计里面找到页面颜色选“纹理”,不是'图片"(图片做背景会填充,就有10-18个圆)此时,六个圆形是背景图,不占文字的位置,所以单元格的光标都上下左右居中。然后蓝色填充白色,这样就是和A4一样大小的白色背景图代码部分(4次优化)1、制作一个班级的基础模板6个分组保存一个docx,把第2:5的docx的内容用win32原样复制到第1个docx里,用第1个背景图和框架。今天大部分时间都遇到“合并出错”文字的位置:通过反复的计算,确定每个文字的大小,间距、灰度。# -*- coding:utf-8 -*- ''' 制作被子圆牌(word合并)一个班级 预先再word里面页面背景-纹理,插入A4大小的图片背景(有6个园), deepseek,豆包 阿夏 20250913 ''' import os import pandas as pd from docx import Document from docx.shared import Cm from docx.enum.text import WD_PARAGRAPH_ALIGNMENT from docx.shared import Pt # 用于设置字体大小 from docx.oxml.ns import qn # 用于设置中文字体 from pypinyin import pinyin, Style from docx.enum.table import WD_CELL_VERTICAL_ALIGNMENT from docx.shared import RGBColor # 用于设置字体颜色 import shutil # ========== 1. 核心配置(仅修改此部分路径) ========== base_dir = r'c:\Users\jg2yXRZ\OneDrive\桌面\20250913文本框可编辑全校被子挂牌' excel_file = os.path.join(base_dir, "班级信息表.xlsx") # Excel数据路径 template_word = os.path.join(base_dir, "挂牌.docx") # 现有3行2列表格模板 output_dir = os.path.join(base_dir, "小2班挂牌结果") # 结果保存目录 editable_dir = os.path.join(base_dir, "word可编辑文件夹") # 新建的可编辑文件夹 os.makedirs(output_dir, exist_ok=True) # 创建结果目录 os.makedirs(editable_dir, exist_ok=True) # 创建可编辑文件夹 # ========== 2. Excel数据读取与拼音生成(保留核心逻辑) ========== def read_excel_and_generate_pinyin(file_path): """读取Excel数据,生成带声调的姓名拼音,返回{班级名: 学生数据列表}""" # 特殊姓氏读音校正(确保拼音准确性) SPECIAL_SURNAMES = { "乐": "Yuè", "单": "Shàn", "解": "Xiè", "查": "Zhā", "盖": "Gě", "仇": "Qiú", "种": "Chóng", "朴": "Piáo", "翟": "Zhái", "区": "Ōu", "繁": "Pó", "覃": "Qín", "召": "Shào", "华": "Huà", "纪": "Jǐ", "曾": "Zēng", "缪": "Miào", "员": "Yùn", "车": "Chē", "过": "Guō", "尉": "Yù", "万": "Wàn" } COMPOUND_SURNAMES = { "欧阳": "Ōu yáng", "上官": "Shàng guān", "皇甫": "Huáng fǔ", "尉迟": "Yù chí", "万俟": "Mò qí", "长孙": "Zhǎng sūn", "司徒": "Sī tú", "司空": "Sī kōng", "司马": "Sī mǎ", "诸葛": "Zhū gě", "东方": "Dōng fāng", "独孤": "Dú gū", "慕容": "Mù róng", "宇文": "Yǔ wén" } def correct_name_pinyin(name): """生成带声调的姓名拼音(姓氏校正)""" if not name or not isinstance(name, str): return "" name = name.strip() # 优先处理复姓 for compound_surn in COMPOUND_SURNAMES: if name.startswith(compound_surn): surn_pinyin = COMPOUND_SURNAMES[compound_surn] given_name = name[len(compound_surn):] given_pinyin = ' '.join([p[0] for p in pinyin(given_name, style=Style.TONE)]) return f"{surn_pinyin} {given_pinyin}" # 处理单姓多音字 first_char = name[0] if first_char in SPECIAL_SURNAMES: surn_pinyin = SPECIAL_SURNAMES[first_char] given_name = name[1:] given_pinyin = ' '.join([p[0] for p in pinyin(given_name, style=Style.TONE)]) return f"{surn_pinyin} {given_pinyin}" # 普通姓名拼音 return ' '.join([p[0] for p in pinyin(name, style=Style.TONE)]) try: # 只读取小2班工作表 df = pd.read_excel(file_path, sheet_name="小2班", usecols=range(5), header=None, dtype={0: str}) df = df.iloc[1:] # 跳过第1行标题 student_list = [] for idx, row in df.iterrows(): # 过滤无效数据(学号为空、姓名为空) raw_id = str(row[0]).strip() if pd.notna(row[0]) else "" name = str(row[3]).strip() if pd.notna(row[3]) else "" if not raw_id.isdigit() or not name: continue # 提取核心信息 student_info = { "campus": "XXX幼(" + (str(row[1]).strip() if pd.notna(row[1]) else "") + ")", # 园区 "class_name": str(row[2]).strip() if pd.notna(row[2]) else "", # 班级 "student_id": f"{int(raw_id)}号", # 学号(如:1号) "name": name, # 姓名 "name_pinyin": correct_name_pinyin(name) # 带声调拼音 } student_list.append(student_info) if student_list: print(f"读取[小2班]:{len(student_list)}个有效学生") return {"小2班": student_list} return {} except Exception as e: print(f"Excel读取失败:{str(e)}") return {} # ========== 3. 写入Word表格(3行2列,单个单元格含5种信息+回车) ========== def write_student_to_word(student_list, template_path, output_path, class_name): """ 将学生数据写入Word模板的3行2列表格 单个单元格内容:园区\n班级\n学号\n拼音\n姓名(按此顺序换行) 字体:微软雅黑;拼音大小:10pt;姓名大小:20pt;其他信息:14pt 颜色:班级、拼音、姓名为灰色,学号为黑色 """ # 按6个学生一组分割(3行2列表格可容纳6个学生) student_groups = [student_list[i:i+6] for i in range(0, len(student_list), 6)] generated_files = [] # 存储生成的文件路径 for group_idx, group in enumerate(student_groups, 1): # 复制模板文件(避免修改原模板) temp_template = os.path.join(output_path, f"temp_{group_idx}.docx") shutil.copy2(template_path, temp_template) # 打开复制后的模板,操作表格 doc = Document(temp_template) # 获取模板中的第一个表格(需确保"挂牌2.docx"的第一个表格是3行2列") if not doc.tables: print(f"模板{template_path}中未找到表格,跳过此组") os.remove(temp_template) continue table = doc.tables[0] # 清除表格原有内容 for row in table.rows: for cell in row.cells: for para in cell.paragraphs: p = para._element p.getparent().remove(p) cell._element.clear() # 完全清空单元格 # 定义字体样式 def set_paragraph_style(para, text, font_size, is_bold=False, is_gray=True, underline=False): """设置段落的字体、大小、对齐(居中)和颜色""" if not text: # 跳过空文本 return run = para.add_run(text) # 设置中文字体为微软雅黑 run.font.name = '微软雅黑' run.element.rPr.rFonts.set(qn('w:eastAsia'), '微软雅黑') run.font.size = Pt(font_size) run.font.bold = is_bold run.font.underline = underline # 设置下划线 # 设置颜色:灰色或黑色 if is_gray: run.font.color.rgb = RGBColor(169, 169, 169) # DarkGray else: run.font.color.rgb = RGBColor(0, 0, 0) # 黑色 para.alignment = WD_PARAGRAPH_ALIGNMENT.CENTER # 文字居中 # 逐个单元格写入学生信息(3行2列,共6个单元格) cell_index = 0 # 单元格索引(0-5对应3行2列的6个单元格) for row_idx, row in enumerate(table.rows): for cell_idx, cell in enumerate(row.cells): if cell_index = len(group): break # 学生不足6个时,空单元格跳过 # 添加这行代码:设置单元格垂直居中 cell.vertical_alignment = WD_CELL_VERTICAL_ALIGNMENT.CENTER # 当前学生的5种信息(按"园区→班级→学号→拼音→姓名"顺序") student = group[cell_index] info_lines = [ student["campus"], # 第1行:园区 student["class_name"], # 第2行:班级 student["student_id"], # 第3行:学号 student["name_pinyin"], # 第4行:拼音(10pt) student["name"] # 第5行:姓名(20pt,加粗) ] # 向单元格写入内容(每行单独设置字体大小和颜色) for line_idx, line in enumerate(info_lines): if line: # 只写入非空内容 para = cell.add_paragraph() if line_idx == 0: # 园区:16pt set_paragraph_style(para, line, font_size=16, is_bold=True, is_gray=True) para.paragraph_format.line_spacing = Pt(30) elif line_idx == 1: # 班级:30pt set_paragraph_style(para, line, font_size=30, is_bold=True, is_gray=True) para.paragraph_format.line_spacing = Pt(40) elif line_idx == 2: # 学号:50pt set_paragraph_style(para, line, font_size=50, is_bold=True, is_gray=False, underline=True) para.paragraph_format.line_spacing = Pt(65) elif line_idx == 3: # 拼音行:10pt set_paragraph_style(para, line, font_size=10, is_bold=True, is_gray=True) para.paragraph_format.line_spacing = Pt(25) elif line_idx == 4: # 姓名行:30pt,加粗 set_paragraph_style(para, line, font_size=30, is_bold=True, is_gray=True) para.paragraph_format.line_spacing = Pt(35) cell_index += 1 # 保存当前组的Word文件 final_word_path = os.path.join(output_path, f"{class_name}_挂牌_{group_idx:02d}.docx") doc.save(final_word_path)

相关新闻

【小程序毕业设计】基于 SpringBoot 的校园日常服务综合平台 大学生校园生活便民服务小程序的设计与实现(源码+文档+远程调试,全bao定制等)

【小程序毕业设计】基于 SpringBoot 的校园日常服务综合平台 大学生校园生活便民服务小程序的设计与实现(源码+文档+远程调试,全bao定制等)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

2026/10/18 3:17:06 阅读更多 →
Java面试1000+题全集(2026版),附详细答案解析,从JVM到微服务全覆盖

Java面试1000+题全集(2026版),附详细答案解析,从JVM到微服务全覆盖

前言 金九银十招聘旺季马上就到了,不知道大家是否准备好了,面对金九银十的招聘旺季,如果没有精心准备那笔者认为那是对自己不负责任;就我们 Java 程序员来说,多数的公司总体上面试都是以自我介绍项目介绍项目细节/难点…

2026/10/18 21:27:21 阅读更多 →
【小程序毕业设计】私家车车位分时共享租赁管理小程序 智慧小区车位资源共享调度系统(源码+文档+远程调试,全bao定制等)

【小程序毕业设计】私家车车位分时共享租赁管理小程序 智慧小区车位资源共享调度系统(源码+文档+远程调试,全bao定制等)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

2026/10/21 23:09:05 阅读更多 →

最新新闻

Electron桌面应用开发实战:从环境搭建到打包发布全流程

Electron桌面应用开发实战:从环境搭建到打包发布全流程

做前端这些年,我大部分时间都在跟浏览器标签页打交道,直到第一次把桌面应用跑起来,才发现原来自己一直被限制在地址栏和刷新按钮围起来的框框里。Electron这个词,最开始是在某段时间频繁出现在同事的讨论里,一个用HTML…

2026/10/21 9:32:40 阅读更多 →
滑盖智能锁T109深度解析:结构原理、安装调试与故障排查

滑盖智能锁T109深度解析:结构原理、安装调试与故障排查

简介:亚太天能T109滑盖智能锁产品说明书是一份PDF格式的官方技术文档,主要面向智能锁安装人员、终端用户及售后维护者,帮助快速掌握产品安装、配置与常见故障处理。全包仅1个PDF文件,大小4.37MB,内容结构清晰&#xff…

2026/10/21 9:32:40 阅读更多 →
PMSM弱磁控制原理与Simulink建模:高速AGV驱动系统设计指南

PMSM弱磁控制原理与Simulink建模:高速AGV驱动系统设计指南

上个月我在调试一台高速AGV的驱动系统,整车要求空载跑到8m/s,电机转速已经拉到额定点,驱动器的输出电压也顶到了母线电压极限附近。再往上踩速度指令,转速纹丝不动,三相电流反而开始震荡。那会儿我的第一反应就是&…

2026/10/21 9:32:40 阅读更多 →
C++核心知识点:从内存管理到STL的实战指南

C++核心知识点:从内存管理到STL的实战指南

C 这门语言我前前后后折腾了十几年,用它写过嵌入式驱动、做过游戏服务端,也搭过基础组件库。每次看到新人一头扎进"C 核心知识点"这个搜索词,我其实挺感慨的——这门语言的难点从来不是语法多,而是知识点之间的耦合太深…

2026/10/21 9:32:40 阅读更多 →
T109滑盖智能锁怎么装?安装调试与故障排查全攻略

T109滑盖智能锁怎么装?安装调试与故障排查全攻略

简介:亚太天能T109滑盖智能锁产品说明书以PDF格式发布,适合智能锁用户、安装人员与售后维修人员阅读。内容围绕T109系列指纹密码刷卡锁展开,先介绍前面板、后面板、锁体、机械钥匙、电池盒盖等部件名称与功能,再给出完整安装步骤&…

2026/10/21 9:32:40 阅读更多 →
LLM知识降熵:从信息垄断到理解权下放

LLM知识降熵:从信息垄断到理解权下放

你有没有过这种经历:翻开源码注释、论文摘要或者一份专业报告,每个字都认识,连在一起却像天书。想找人聊聊,身边要么没人懂,要么懂的懒得跟你解释。后来我试着把同一段内容丢给一个大语言模型,几秒钟之后&a…

2026/10/21 9:31:32 阅读更多 →

日新闻

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/22 1:47:45 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/21 21:32:28 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/22 5:12:39 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/21 21:50:56 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/21 21:51:55 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/21 16:24:48 阅读更多 →