ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

用Python自动生成文件夹标签模板,批量打印告别手工排版

用Python自动生成文件夹标签模板,批量打印告别手工排版 做文件夹标签这件事听起来完全不像一个技术问题。但真正被几十个档案盒、成百上千份合同、一堆项目资料包围的时候你就会明白手工在 Word 里建表格、一个一个打字、再调整字号和位置至少要花半小时而且每个人做出来的样式还不一样。如果部门每隔一段时间就要整理一轮档案这个“小活”就会反复消耗你的时间。这篇文章要解决的就是把“文件夹名称 → 标签打印模板”这条链路压缩到一分钟以内。我的核心判断是文件夹标签制作并不需要专门的便签打印软件也不用手工排版。只要掌握“用代码把名称批量写入固定表格”的思路配合一个几十行的 Python 脚本就能自动生成任意数量的标签模板。无论你是行政、档案管理员、财务人员还是需要整理项目文档的研发工程师这套方法都适用。文章会从实际场景讲起给出可运行的脚本、数据准备方法和打印参数并分享几个使用中最容易踩坑的地方。为了让你快速判断要不要继续读下去先说结论这套方法不需要使用任何收费软件只需要一台装了 Python 的电脑。生成的标签模板是 Excel 文件打印时走的是普通 A4 纸或 A4 不干胶标签纸任何人都能上手。下面我会先解释这个方案为什么快再完整演示代码和操作过程最后给出常见问题的排查清单。1. 为什么“制作文件夹标签”会变成一个效率问题1.1 标签需求总是“批量出现”的档案整理和项目归档有一个共同特点需求一旦出现往往不是一两个标签而是一整批。比如年度审计需要把三年的合同按项目分成几十个档案盒研发团队要把产品文档按模块归档学校或医院要把资料按学期、科室分类。这时你要做的不是“一个标签”而是“几十上百个标签”。如果每次都在 Word 里人工粘贴复制光重复劳动就让人崩溃。更麻烦的是手工制作很难保持一致。张三做的标签字体大、居中偏上李四做的标签带着图标和底色放到一排档案盒上非常不整齐。标签不统一后续检索就会变慢因为人眼对不规律的视觉信息需要额外的时间处理。所以标签这件事看似不起眼实际影响的是长期使用的效率值得用一点技术手段一次性解决。这也解释了为什么简单的问题值得写成一篇文章它背后的“批量文字排版”场景在办公中太常见了。1.2 手工制作到底慢在哪里如果不用任何工具最快的手工做法是 Word 表格插入一个 3 列若干行的表格把每个文件夹名称填进去再逐格设置居中、加粗、字号。听起来十几分钟能搞定但遇到长名称换行、标签数量超过一页、打印后对不齐裁剪线就需要反复调整。批量打印时Word 的文本框方案尤其痛苦因为每个文本框的位置都要单独拖动一旦数量上了三十人的耐心和准确度都会直线下降。为了更直观地对比这里把常见制作方式放在一起看制作方式批量 50 个的大致工作量一致性下次复用手写标签高差无Word 手工表格中高中一般便签打印软件中等需配置模板好好脚本批量生成极低改清单即可最好最好从这张表能看出手写和 Word 手工方案在“单次少量”场景下够用一旦数量上到几十效率差距就非常明显。便签打印软件确实能解决问题但往往需要安装、注册、学习配置模板对一年只用几次的人来说学习成本不低。脚本批量生成的优势在于代码写一次以后每次只要改名称列表运行一下就有新的标签模板这也是本文推荐它的核心原因。1.3 多数人没意识到标签模板的本质是“表格”回到本质问题文件夹标签需要什么一是名称二是位置。名称决定内容位置决定打印后能否对齐标签纸。手工方案慢是因为它把“填写内容”和“摆放位置”混在一起每个标签都要单独处理。如果能把名称抽离成一份纯文本清单把位置抽象成固定大小的单元格那么剩下的事情就变成了“让程序把名称填进格子”而这正好是计算机最擅长的工作。2. 最快方案的核心原理用单元格模拟标签2.1 标签纸规格与表格布局常见的 A4 标签纸规格主要有几类这里给出一份参考标签纸规格每页格数单格大致尺寸适合场景3 列 × 8 行24 格约 70mm × 37mm档案盒脊背、文件夹侧签2 列 × 4 行8 格约 105mm × 74mm档案盒封面、文件封面1 列 × 5 行5 格约 200mm × 57mm大型资料盒4 列 × 6 行24 格约 48mm × 40mm小型票据夹、光盘盒这些规格对应的本质就是 A4 纸面被均分为若干矩形区域。Excel 表格天然适合这种场景把一个单元格当成一个标签设置边框后单元格就变成了虚拟标签。列宽控制标签横向尺寸行高控制纵向尺寸单元格文本控制名称内容居中和对齐控制文字位置。打印时这些边框会随内容一起输出到纸上裁剪或撕下后就能直接使用。2.2 方案的执行路径整个流程可以拆成四步准备名称清单 → 运行脚本生成 Excel → 打开模板检查样式 → 打印并剪裁。名称清单是唯一的“输入”脚本负责把清单里的每一行变成一个带边框、居中、自动折行的单元格。如果名称超过一页能容纳的数量脚本会自动追加新工作表每个工作表对应一页打印纸。这个过程不涉及手工拖动文本框也不需要逐个复制粘贴因此即使是几百个名称也能在十几秒内完成模板生成。2.3 为什么用 openpyxl 而不是 Word 宏看到这里你可能问用 Word 宏也能做为什么选 Python 加 openpyxl原因有三点。第一openpyxl 生成的是标准 xlsx 文件Excel 和 WPS 都能直接打开不依赖宏安全设置很多单位的电脑默认禁用宏打开含宏的 Word 文件会弹出安全警告反而增加沟通成本。第二Python 脚本是纯文本放在代码仓库或共享目录里就能复用改参数也很方便。第三脚本可以把名称来源扩展成 Excel 表格、数据库甚至直接扫描文件夹自动生成自动化潜力更大。3. 环境准备与数据准备3.1 安装 Python 与 openpyxl脚本需要 Python 3.6 及以上版本具体版本以你本机安装为准本文不限定特定发布版。如果电脑里已经装过 Python可以直接用 pip 安装 openpyxlpip install openpyxl如果网络较慢可以临时切换为国内镜像源pip install openpyxl -i https://pypi.tuna.tsinghua.edu.cn/simple安装完成后用下面的命令验证是否成功python -c import openpyxl; print(openpyxl.__version__)能打印出版本号说明安装成功。如果提示“python 不是内部或外部命令”说明 Python 没有加入 PATH可以在安装 Python 时勾选“Add Python to PATH”或者直接使用 Anaconda 环境。这一步是整个流程里唯一和“环境”相关的部分其余操作都不涉及复杂依赖。3.2 准备文件夹名称清单脚本读取一个文本文件每一行对应一个文件夹名称。用记事本或任意编辑器创建folder_names.txt内容示例如下2024年度合同 财务凭证-第一季度 项目A-需求文档 产品手册-2024 培训资料-技术部这里有一个实际使用中非常容易踩的坑文本编码。Windows 记事本默认保存的编码在不同版本下不一致如果名称里包含中文Python 用普通 UTF-8 方式读取时可能报错或乱码。稳妥的做法是保存时手动选择“UTF-8”编码而脚本读取时使用utf-8-sig这样即使文件带 BOM 头也能正确处理。后面提供的脚本已经内置了这个处理逻辑。3.3 从已有文件夹快速导出名称如果你的标签本来就是给现有目录用的可以不用手打清单直接用 PowerShell 批量导出名称。下面的命令会把D:\档案资料下所有子文件夹名称写入folder_names.txtGet-ChildItem -Path D:\档案资料 -Directory | Select-Object -ExpandProperty Name | Out-File -FilePath folder_names.txt -Encoding utf8这里要注意 PowerShell 版本差异Windows PowerShell 5.1 的-Encoding utf8会生成带 BOM 的 UTF-8 文件而本文脚本用utf-8-sig读取正好兼容这种情况如果你是 PowerShell 7 用户也可以写成-Encoding utf8NoBOM。这一步特别适合需要给现有档案目录成批做标签的场景等于把“盘点文件夹”和“制作标签”合并成一条命令。4. 核心代码实现自动生成文件夹标签模板4.1 脚本设计思路脚本需要完成四件事读取名称清单、计算需要多少页、把名称写入对应单元格、设置字体边框和打印参数。为了避免长名称溢出脚本按配置的字数自动折行为了避免名称顺序和标签纸读写顺序不一致脚本按照“从左到右、从上到下”的顺序填充这和多数人阅读标签纸的习惯一致。整体逻辑不复杂重点是把几个容易出错的细节提前处理好。4.2 完整脚本下面是完整的 Python 脚本保存为generate_folder_labels.py# 文件路径generate_folder_labels.py # 功能根据文件夹名称列表批量生成 Excel 标签打印模板 import math import openpyxl from openpyxl.styles import Alignment, Border, Side, Font from openpyxl.utils import get_column_letter # 配置区 INPUT_FILE folder_names.txt # 输入的名称清单每行一个 OUTPUT_FILE folder_labels.xlsx # 输出的标签模板 COLS 3 # 每页标签列数 ROWS 8 # 每页标签行数 COL_WIDTH 28 # 列宽约 70mm按实际标签纸调整 ROW_HEIGHT 90 # 行高约 31mm按实际标签纸调整 FONT_SIZE 16 # 标签字号 MAX_CHARS_PER_LINE 8 # 超过该长度自动折行 # thin Side(stylethin) BORDER Border(leftthin, rightthin, topthin, bottomthin) FONT Font(name微软雅黑, sizeFONT_SIZE, boldTrue) ALIGN Alignment(horizontalcenter, verticalcenter, wrap_textTrue) def wrap_label_text(name: str) - str: 长名称自动折行避免溢出单元格 name name.strip() if not name: return if len(name) MAX_CHARS_PER_LINE: return name lines [name[i:i MAX_CHARS_PER_LINE] for i in range(0, len(name), MAX_CHARS_PER_LINE)] return \n.join(lines) def fill_sheet(ws, names): 把名称按从左到右、从上到下的顺序填入工作表 for pos, name in enumerate(names): row pos // COLS 1 col pos % COLS 1 cell ws.cell(rowrow, columncol) cell.value wrap_label_text(name) cell.font FONT cell.alignment ALIGN cell.border BORDER def setup_sheet(ws): 设置列宽、行高和 A4 打印方向 for col in range(1, COLS 1): ws.column_dimensions[get_column_letter(col)].width COL_WIDTH for row in range(1, ROWS 1): ws.row_dimensions[row].height ROW_HEIGHT ws.page_setup.orientation portrait ws.page_setup.paperSize 9 # 9 表示 A4 def main(): with open(INPUT_FILE, r, encodingutf-8-sig) as f: names [line.strip() for line in f if line.strip()] if not names: print(f错误{INPUT_FILE} 中没有读取到任何名称请先准备数据。) return per_sheet COLS * ROWS sheet_count math.ceil(len(names) / per_sheet) print(f共读取 {len(names)} 个名称需要 {sheet_count} 页标签。) wb openpyxl.Workbook() for i in range(sheet_count): if i 0: ws wb.active else: ws wb.create_sheet() ws.title f第{i 1}页 start i * per_sheet end min(start per_sheet, len(names)) fill_sheet(ws, names[start:end]) setup_sheet(ws) wb.save(OUTPUT_FILE) print(f标签模板已生成{OUTPUT_FILE}) if __name__ __main__: main()4.3 关键代码说明读文件时使用utf-8-sig是为了兼容 Windows 下常见的 UTF-8 with BOM 文件这是脚本避免中文乱码的关键。fill_sheet函数用pos // COLS和pos % COLS计算单元格的行列号保证名称按表格顺序填入不会出现列优先错误。折行函数wrap_label_text会在名称超过 8 个字符时按 8 个字符一行切分配合单元格的wrap_textTrue实现自动换行。边框使用四个方向的细线打印时边框会随内容一起输出便于对照标签纸裁剪。这里有一个和布局相关的细节需要提醒COL_WIDTH和ROW_HEIGHT的单位并不是毫米。Excel 中列宽单位约等于一个字符宽度行高单位是磅point不同纸张规格需要微调这两个值。脚本里给的是 3 列 8 行、单格约 70mm × 37mm 标签纸的常用初值。打印样张后如果发现偏大或偏小只需要调整配置区的数值不需要改动业务逻辑。4.4 运行脚本在脚本所在目录打开命令行执行python generate_folder_labels.py运行成功后同级目录下会生成folder_labels.xlsx。脚本会在终端打印读取到的名称数量和需要打印的页数这两条输出是判断运行是否正常的最直接依据。如果名称清单为空脚本会明确提示而不是生成一个空文件避免用户拿着空白模板去打印。5. 不写代码的替代方案Word 邮件合并5.1 邮件合并在标签场景的适用性不是所有人都愿意使用 Python如果只是偶尔做几十个标签Word 的邮件合并功能其实是纯界面操作里速度最快的方案。邮件合并原本用于批量生成信函、信封但它同样支持“标签”类型原理和脚本方案一致数据源提供名称列表Word 模板提供固定布局合并时自动把名称填入每个标签位置。它最大的优点是全程点击操作不需要写任何代码最大的缺点是每次都要重新配置一遍标签样式长期复用的成本比脚本高。5.2 操作步骤邮件合并的操作路径如下建议按顺序执行准备名称清单在 Excel 或文本文件中准备一列名称首行可以是标题“名称”后续行是具体文件夹名保存为 xlsx 或 txt。新建 Word 文档点击“邮件”选项卡 → “开始邮件合并” → “标签”。在“标签选项”对话框中选择打印机类型和标签品牌规格如果没有对应规格选择“新建标签”手动输入标签尺寸、列数和行数。点击“选择收件人” → “使用现有列表”选中第 1 步准备的文件。在第一个标签位置点击“插入合并域” → “名称”然后点击“更新标签”让 Word 把域复制到同页所有标签。点击“完成并合并” → “打印文档”在打印对话框中选择“全部”即可输出整页标签。这套操作最需要注意的是第 3 步的标签规格它决定了打印后内容是否与标签纸对齐。如果购买的是没有品牌规格的通用标签纸建议用直尺量出单格宽高再在“新建标签”里精确填写。5.3 两种方案对比对比维度Python openpyxlWord 邮件合并是否需要写代码需要不需要首次准备时间约 10 分钟约 10 分钟下次复用改 txt 后直接运行需要重建标签设置自动分页脚本自动处理Word 标签功能自动处理适合人群习惯命令行的技术人员纯办公用户从实用性角度判断两个方案都能达到“快速出模板”的效果区别只在于长期成本。如果团队里已经有人能维护脚本脚本方案的长期成本更低如果只是一个人临时用一次Word 邮件合并上手更快。这篇文章主要演示脚本方案因为它的扩展性更强后面可以接入数据库、接口或者批量扫描文件夹。6. 运行结果与打印验证6.1 预期输出与检查点运行脚本后终端输出应当类似共读取 50 个名称需要 3 页标签。 标签模板已生成folder_labels.xlsx用 Excel 打开生成的文件正常情况下每个工作表对应一页单元格内有居中的文件夹名称四周有黑色细边框。第一页应有 24 个带内容的单元格最后一页按剩余数量填充。如果某个名称特别长单元格内会自动折成多行但不会撑破单元格因为行高是固定的。这里值得检查的是最后一页如果最后一页只有几个名称说明分页逻辑正常如果名称顺序错乱则需要检查 txt 文件里的换行是否符合预期。6.2 打印前必须做的三件事第一件事是预览分页。点击“打印预览”确认每页正好对应一张 A4不要让内容被拆到两页。第二件事是设置缩放。在 Excel 的“页面布局”中把“宽度”设为 1 页、“高度”设为 1 页或者直接选择“将工作表调整为一页宽”避免打印时因为页边距把右侧列挤到第二页。第三件事是确认边框会打印。脚本已经为单元格设置了细边框正常情况下边框会随内容输出如果你打开文件后发现单元格之间有空白那不是边框问题而是列宽设置过宽导致列之间有多余空间。6.3 如何验证标签纸对齐第一次使用不干胶标签纸时建议先打印一张普通 A4 纸裁下最左上角的一格贴到其中一个标签格上观察文字是否居中、是否超出边界。如果没有对齐轻微调整列宽和行高后再打印一张样张。实际调试中最常出现的问题是行高设置过小导致文字被截断因此调整时优先增大ROW_HEIGHT其次才考虑缩小字号。每调整一次只打印一张样张效率反而最高因为同时改多个参数很难判断到底是哪个设置导致了偏移。7. 常见问题与排查方法7.1 问题排查表问题现象可能原因排查方式解决方案运行脚本提示ModuleNotFoundErroropenpyxl 未安装执行 pip install openpyxl安装后重新运行生成的 Excel 里中文乱码名称清单编码不是 UTF-8用记事本打开查看“另存为”编码保存为 UTF-8脚本已用 utf-8-sig 读取第一个名称前出现不可见字符文件带 BOM 且未处理查看第一格内容是否多出符号确认使用的是本文完整脚本文字被截断或换行错乱名称太长、字号太大或行高不足打印预览观察调小 FONT_SIZE调大 ROW_HEIGHT打印内容与标签纸错位列宽行高与纸张规格不符打印普通 A4 样张按单格实际尺寸微调 COL_WIDTH 和 ROW_HEIGHT名称数量很多但只生成一页名称清单读取数量不对检查 txt 是否有空行或分隔符异常确认每行一个名称不要有多余空行7.2 关于编码问题的补充说明Windows 环境下文本文件的编码是出现频率最高的问题。同一个 txt 文件可能来自记事本、Excel 另存、PowerShell 导出或代码仓库编码可能是 ANSI、UTF-8、UTF-8 with BOM甚至是 UTF-16。本文脚本使用utf-8-sig只能兼容 UTF-8、UTF-8 with BOM 和部分工具导出的内容。如果文件实际是 UTF-16需要先用记事本打开再另存为 UTF-8。判断方法很简单用文本编辑器打开名称正常但脚本报UnicodeDecodeError或输出乱码就优先怀疑文件编码本身。7.3 打印问题的通用排查顺序打印环节出现问题不要一上来就改代码。按这个顺序排查先确认打印机设置的纸张规格是 A4再确认 Excel 的缩放设置为“一页宽”然后打印样张看位置偏移方向最后才去调整脚本里的COL_WIDTH和ROW_HEIGHT。每次只改一个参数打印一次样张。这个顺序能帮你快速定位是纸张设置、缩放策略还是模板尺寸的问题避免在错误的方向上反复调试。8. 最佳实践与工程建议8.1 名称规范先行标签统一的前提是名称统一。建议在做标签前先定义命名规则比如“年份-类别-编号”或“部门-项目-文档类型”。命名规则的价值在于标签不仅是打印出来的文字更是后续归档和检索的索引。如果允许每个人都按自己的习惯起名脚本处理得再快输出也是混乱的。对于项目团队命名规则应写进归档规范文档而不是随口约定。8.2 脚本参数做成配置文件当前脚本把列数、行数、字号等参数写在文件头部对于个人使用已经足够。如果团队要长期使用更好的做法是把这些参数抽成config.yaml或config.ini让不熟悉代码的同事只改配置文件不动脚本逻辑。更进一步可以把名称清单从 txt 换成 Excel 表脚本通过 openpyxl 直接读取指定列这样名称可以先在 Excel 里做排序、去重和清洗。这些优化都属于“小工具工程化”的范畴投入不大但能让工具真正在团队里被接受和使用。8.3 保留模板与脚本的版本痕迹脚本和名称清单建议放在共享目录或代码仓库里每次批量生成前确认数据是最新的。如果是重要档案生成 Excel 后不要立刻覆盖旧文件可以按日期命名例如folder_labels_20250115.xlsx。这样万一打印后发现某个名称写错了还能追踪到是数据问题还是排版问题。打印完成的标签纸如果有多余的空白格可以在名称清单里留空行或者只填写实际需要的数量避免浪费标签纸。8.4 安全与权限提醒如果脚本要扫描公司共享文件夹并自动生成标签请提前确认执行者对该目录有读取权限并且脚本只做“读取名称生成模板”不要对原文件夹做任何改名、移动、删除操作。从安全角度看任何批量生成文档的工具都应该遵循最小权限原则能读就不写能输出到新文件就不要覆盖原目录。在自动化处理大量文件时先在小目录上验证脚本行为再扩大到完整目录是稳妥的做法。9. 总结与后续扩展方向文件夹标签看似是一个日常杂活但它暴露了一个通用问题批量、重复、易出错的文字排版工作应该交给脚本而不是手工。本文给出的 Python openpyxl 方案用四步流程把“名称清单”变成“打印模板”准备 txt、运行脚本、检查 Excel、打印输出。核心代码只有几十行而且自动处理了中文编码、长名称折行、多页分页三个最常见的坑。如果你愿意继续深入还可以把这个思路扩展出更多用途在生成单元格时加入条形码或二维码图片实现扫码快速定位档案从数据库或 API 拉取名称让标签内容实时同步把脚本封装成带界面的小工具分发给完全不熟悉命令行的同事。原理都一样把数据从业务系统抽离出来用固定布局批量渲染。这个“数据 模板”的思维比文件夹标签本身更有长期价值。建议先按本文流程跑通一个 10 个名称的最小示例确认打印效果符合预期后再应用到整批档案。第一次调试打印对齐会花一些时间但那是整套流程里唯一需要耐心的环节一旦参数稳定这套脚本可以长期为你省下大量重复劳动。如果你所在的办公环境是 WPS脚本同样适用因为 openpyxl 生成的是标准 xlsx 文件WPS 可以直接打开编辑。
返回列表