尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

Excel + Access 搭建人事管理系统教程:从零开始管理员工信息

Excel + Access 搭建人事管理系统教程:从零开始管理员工信息 企业人事管理很多中小团队还在用纯 Excel 表格来回传。员工信息一个表、工资一个表、考勤又一个表版本一多就分不清谁是最新的。这个教程要解决的就是这类问题不换昂贵 ERP不写复杂代码只用 Excel Access 数据库这两个 Office 自带工具搭建一套能长期维护、能查数、能避免重复录入的人事信息管理系统。这套方案尤其适合 0-20 人的小型团队、HR 岗位的日常工作以及学习 Office 数据管理的学生。相比单纯 Excel 文件Access 提供真正的数据库表结构可以设置主键、约束、关系而 Excel 负责日常录入、展示、公式计算和数据透视分析两者互补。整个系统不需要额外安装开发环境在一台装有 Office 的 Windows 电脑上就能完成。标题说“10 分钟学会”如果目标只是搭出最小骨架建一个 Access 库、建员工表、做一个 Excel 模板、用公式提取身份证信息10 分钟确实够用。但真正能支撑日常使用的系统还需要导入历史数据、跑通同步流程、做报表和排查错误这部分建议按本文的步骤走一遍多花 30 到 60 分钟也很值得。下面就从数据库设计开始。1. 核心能力速览能力项说明系统类型本地单机/局域网共享式人事信息管理系统主要组件Excel录入、公式、报表 Access数据库存储开发门槛零基础可上手不需要编程经验进阶可用 VBA 自动化硬件要求任意能运行 Office 的 Windows 电脑无独立显卡要求软件要求Office 2016 及以上版本建议 64 位 Office数据容量Access 文件大小上限约 2GB.accdb 格式日常人事数据量完全够用核心功能员工档案、部门岗位、考勤、薪资、统计报表、生日提醒批量任务支持 Excel 批量导入、Access 查询更新、定时 VBA 同步接口能力通过 ODBC / ADO 可被 Python、C#、WinCC 等工具调用适合场景中小企业人事数据管理、日常 Excel 办公、教学演示这个表格里最关键的一点是这套方案几乎没有额外成本和学习曲线。Access 负责“存得住、查得对”Excel 负责“填得快、算得准”。本文后续所有操作都围绕这两件事展开。2. 适用场景与使用边界先说适合什么场景。如果你是小公司 HR日常要维护几十到几百人的员工档案每个月底要统计部门人数、算工龄、筛生日、查合同到期这套 Excel Access 系统非常合适。Access 可以保存结构化的员工信息Excel 可以快速录入和做数据透视表两者的数据还能互相导入导出。也适合做教学演示。很多课程讲数据库设计时会用 Access 作为入门工具因为它自带图形界面不需要写太多 SQL 就能建表、建关系、做查询。在这个系统里读者能直观看到“Excel 工作表”和“Access 数据表”之间的区别理解为什么要用数据库而不是把所有东西堆在一个工作簿里。再说边界。如果公司人数超过几百或者需要多人同时在线录入、复杂权限审计、移动端高频访问Access 的并发能力会明显不足。局域网共享 Access 文件时多个人同时写入容易造成锁库、卡顿、数据冲突这时候建议转向专业 HR 系统或 Web 端数据库。另外Access 本身不是为大规模高并发设计的不要把它当成 MySQL 或 SQL Server 的替代品。还有一个容易被忽略的合规问题。员工身份证号、手机号、银行账号、薪资属于个人信息保存和传输都要符合个人信息保护要求。这套系统不建议直接放在完全开放的共享文件夹里更不建议把含完整身份信息的 Excel 随意转发。如果必须共享尽量用 Windows 权限控制或者只共享脱敏后的统计报表。3. 环境准备与前置条件3.1 操作系统与 Office系统建议使用 Windows 10 或 Windows 11。Excel 和 Access 属于 Office 套件需要确认本机安装的 Office 里包含 Access 组件。很多电脑只装了 Word、Excel、PPT没有 Access这种情况需要打开 Office 安装程序选择“添加组件”把 Access 补装上。建议使用 64 位 Office。原因是后续连接 Access 数据库时如果 Office 是 32 位又装了 64 位数据库引擎会产生位数不匹配的报错。相对稳妥的做法是系统用 64 位Office 装 64 位Access 数据库引擎也装 64 位三者保持一致。3.2 Access 数据库引擎连接 Access 数据库时常见的报错是“未找到提供程序”或“请先安装 Access 数据库 64 位系统驱动程序”。这是因为系统缺少 Microsoft Access Database EngineACE 引擎。这个组件可以从微软官网下载安装选择 “AccessDatabaseEngine_x64.exe” 即可。安装时有几个注意点32 位和 64 位 ACE 引擎不能同时安装需要先卸载旧版本。如果本机 Office 是 32 位却强装了 64 位 ACE 引擎Access 连接也可能失败。安装后一般不需要重启但如果 VBA 或 ODBC 仍然识别不到建议重启电脑再试。3.3 目录规划建议提前建好目录避免数据库文件、导入文件、备份文件混在一起HRSystem/ ├── ACCESS_DB/ # Access 数据库文件 │ └── HR_System.accdb ├── EXCEL_FILES/ # Excel 出入库模板 │ ├── 员工信息录入模板.xlsx │ ├── 工资表模板.xlsx │ └── 月度统计报表.xlsx ├── IMPORT_FILES/ # 批量导入的临时表格 ├── EXPORT_FILES/ # 导出报表 └── BACKUP/ # 数据库备份目录规范越早定越好后期做批量导入、备份恢复时能省很多事。4. Access 人事数据库设计表结构与字段规范Access 的优势在于把数据按表存储每张表有明确的字段和主键。这里不要求一次性把所有表设计完美但至少要把“员工信息表”建好因为后面 Excel 模板和导入导出都围绕它展开。4.1 新建数据库打开 Access选择“空数据库”文件名填HR_System.accdb保存到HRSystem\ACCESS_DB目录。Access 会自动生成一个名为“表1”的表不用它直接进入“创建 表设计”自己建表。4.2 员工信息表字段设计字段名数据类型说明员工编号短文本主键唯一编号如 E001姓名短文本必填性别短文本男/女出生日期日期/时间可由身份证提取也可手工录入身份证号短文本必须按文本保存避免科学计数法手机号短文本统一存文本邮箱短文本可以不填部门短文本建议用下拉统一岗位短文本如 Java 开发、行政专员入职日期日期/时间用于工龄计算合同到期日日期/时间用于到期提醒学历短文本高中/大专/本科/硕士/博士户籍地址长文本可选在职状态短文本在职/试用期/离职备注长文本可选员工编号必须设为主键。主键的意义是保证每一条记录唯一后续考勤表、薪资表都通过员工编号关联避免“重名导致数据串行”。4.3 部门表与岗位表如果公司部门较多建议单独建部门表字段名数据类型部门编号自动编号部门名称短文本部门负责人短文本再建岗位表字段为岗位编号、岗位名称。这样员工表里的部门和岗位都引用各自的表能减少录入时的错别字。4.4 考勤表与薪资表考勤表至少包含考勤编号、员工编号、日期、出勤状态、加班小时。薪资表至少包含薪资编号、员工编号、月份、基本工资、绩效、奖金、扣款、实发工资。这两张表都以员工编号与员工信息表建立关系查询某人某月工资时直接关联。4.5 建立表关系Access 里选择“数据库工具 关系”把员工信息表的“员工编号”拖到考勤表、薪资表的“员工编号”上。建立关系后Access 可以阻止录入不存在的员工编号相当于一层基础数据校验。5. Excel 人事信息表制作公式与数据验证数据库建好了接下来做 Excel 模板。模板用于日常录入也可以作为批量导入 Access 的中间文件。5.1 Excel 模板字段设计新建员工信息录入模板.xlsx第一行表头与 Access 员工信息表字段对齐。建议顺序员工编号 | 姓名 | 性别 | 出生日期 | 身份证号 | 手机号 | 部门 | 岗位 | 入职日期 | 合同到期日 | 学历 | 在职状态表头不要合并单元格不要出现多级表头否则导入 Access 时容易报“外部表不是预期的格式”。身份证号所在列要提前设置为文本格式或者录入时在数字前加英文单引号。5.2 身份证号自动提取性别、年龄、出生日期假设身份证号在 E2 单元格。出生日期DATE(MID(E2,7,4),MID(E2,11,2),MID(E2,13,2))性别IF(MOD(MID(E2,17,1),2)1,男,女)年龄DATEDIF(DATE(MID(E2,7,4),MID(E2,11,2),MID(E2,13,2)),TODAY(),Y)这三个公式把 18 位身份证号拆开计算第 7-10 位是年份第 11-12 位是月份第 13-14 位是日期第 17 位奇数为男、偶数为女。如果身份证号没有录入完整公式会返回错误可以用IFERROR包一层显示“待补录”IFERROR(DATEDIF(DATE(MID(E2,7,4),MID(E2,11,2),MID(E2,13,2)),TODAY(),Y),待补录)5.3 工龄计算与合同到期提醒工龄计算DATEDIF(H2,TODAY(),Y) 年 DATEDIF(H2,TODAY(),YM) 个月合同到期提醒假设合同到期日在 J2IF(J2,,IF(J2-TODAY()30,即将到期,正常))配合条件格式把“即将到期”标红打开表格就能看到。5.4 下拉列表与数据验证选中“部门”列选择“数据 数据验证数据有效性”允许条件选“序列”输入技术部,产品部,市场部,人事部,财务部,行政部性别列输入男,女学历列输入高中,大专,本科,硕士,博士在职状态列输入在职,试用期,离职下拉列表的作用是统一数据。如果部门里有人填“技术部”有人填“技术研发部”统计时就会被当成两个部门后期清洗很麻烦。5.5 汇总统计公式在模板旁边放一个汇总区域用公式实时统计部门人数COUNTIF(员工信息表!G:G,技术部)在职人数COUNTIF(员工信息表!L:L,在职)本科学历且在职人数COUNTIFS(员工信息表!K:K,本科,员工信息表!L:L,在职)这样每次录入完新员工汇总指标自动更新不需要手动数。6. Excel 与 Access 数据互通导入、导出与查询Excel 和 Access 之间的数据互通有几种方式日常用得最多的是导入、导出、Power Query、VBA。下面逐个说明。6.1 Excel 数据导入 AccessAccess 里选择“外部数据 导入 Excel”选择员工信息录入模板.xlsx指定工作表勾选“第一行包含列标题”再把“员工编号”设为主键。如果没有问题Access 会把 Excel 内容追加到员工信息表里。如果导入时提示“外部表不是预期的格式”先检查三件事一是 Excel 文件是否保存为.xlsx格式.xls老格式在部分环境会出问题二是 Excel 文件是否损坏或被其他程序占用三是表头是否有多余空行或合并单元格。6.2 Access 数据导出到 Excel反过来Access 里选择“外部数据 导出到 Excel”选择表或查询结果。日常报表可以直接导出后再做数据透视表给领导看时减少原始字段暴露。6.3 Excel 用 Power Query 读取 Access如果希望 Excel 能按条件刷新 Access 数据可以使用 Power Query。路径是数据 获取数据 从数据库 从 Microsoft Access 数据库。选择HR_System.accdb后会打开导航器勾选要加载的表完成加载。这种方式的好处是Access 数据更新后在 Excel 里点“全部刷新”报表自动更新不需要手工复制粘贴。6.4 VBA 方式连接 Access 数据库如果要做一键导入、一键导出或者把 Excel 当前工作表的记录写入 Access就需要 VBA。下面给一个连接和读取的示例。Sub ConnectAccess() Dim conn As Object Dim rs As Object Dim connStr As String Dim sql As String 修改为你的数据库实际路径 connStr ProviderMicrosoft.ACE.OLEDB.12.0;Data SourceC:\HRSystem\ACCESS_DB\HR_System.accdb; Set conn CreateObject(ADODB.Connection) conn.Open connStr sql SELECT 员工编号, 姓名, 部门, 入职日期 FROM 员工信息表 WHERE 在职状态 在职 Set rs conn.Execute(sql) 输出到当前工作表的 A:D 列 Sheet1.Range(A1).CurrentRegion.Clear Sheet1.Range(A1).CopyFromRecordset rs rs.Close conn.Close Set rs Nothing Set conn Nothing End Sub运行前需要开启宏。在 Excel 中按Alt F11进入 VBA 编辑器插入模块粘贴代码再按F5运行。如果提示“Microsoft.ACE.OLEDB.12.0 未注册”说明 ACE 引擎没装好或位数不匹配。再给一个写入示例把 Excel 第二张表的数据循环写入 Access 员工信息表Sub InsertToAccess() Dim conn As Object Dim i As Long Dim sql As String Dim connStr As String connStr ProviderMicrosoft.ACE.OLEDB.12.0;Data SourceC:\HRSystem\ACCESS_DB\HR_System.accdb;Persist Security InfoFalse Set conn CreateObject(ADODB.Connection) conn.Open connStr For i 2 To Sheet2.Range(A Rows.Count).End(xlUp).Row sql INSERT INTO 员工信息表 (员工编号, 姓名, 性别, 出生日期, 身份证号, 手机号, 部门, 岗位, 入职日期, 合同到期日, 学历, 在职状态) VALUES ( _ Sheet2.Cells(i, 1).Value , _ Sheet2.Cells(i, 2).Value , _ Sheet2.Cells(i, 3).Value , # _ Format(Sheet2.Cells(i, 4).Value, yyyy-mm-dd) #, _ Sheet2.Cells(i, 5).Value , _ Sheet2.Cells(i, 6).Value , _ Sheet2.Cells(i, 7).Value , _ Sheet2.Cells(i, 8).Value , # _ Format(Sheet2.Cells(i, 9).Value, yyyy-mm-dd) #, # _ Format(Sheet2.Cells(i, 10).Value, yyyy-mm-dd) #, _ Sheet2.Cells(i, 11).Value , _ Sheet2.Cells(i, 12).Value ) conn.Execute sql Next i conn.Close Set conn Nothing MsgBox 导入完成 End Sub这个示例里日期字段在 Access SQL 中要用#yyyy-mm-dd#包裹文本字段用单引号包裹。如果日期不格式化直接拼接可能在中文系统下出现“日期格式不匹配”的报错。7. 人事数据查询与分析SQL 与数据透视表Access 自带查询设计器也可以直接使用 SQL 视图。SQL 能力是这套系统的加分项掌握几条常用语句后日常统计效率远超手工筛选。7.1 常用 SQL 查询查询所有在职员工SELECT 员工编号, 姓名, 部门, 岗位, 入职日期 FROM 员工信息表 WHERE 在职状态 在职 ORDER BY 部门, 员工编号;按部门统计在职人数SELECT 部门, COUNT(*) AS 人数 FROM 员工信息表 WHERE 在职状态 在职 GROUP BY 部门;查询下个月过生日的员工SELECT 姓名, 出生日期, 部门 FROM 员工信息表 WHERE Month(出生日期) Month(DateAdd(m, 1, Date()));查询 30 天内合同到期的员工SELECT 员工编号, 姓名, 合同到期日 FROM 员工信息表 WHERE 合同到期日 BETWEEN Date() AND DateAdd(d, 30, Date());Access 的 SQL 和 SQL Server 略有差异函数名用得比较特殊比如当前日期是Date()加一个月是DateAdd(m, 1, Date())。遇到报错时优先查看函数名和引号是否正确。7.2 数据透视表统计把 Access 员工信息表导出到 Excel 后选中数据区域插入数据透视表。常用统计维度部门人数行区域放部门值区域放姓名值字段设置为“计数”。性别分布行区域放性别值区域放姓名。学历结构行区域放学历值区域放姓名。年龄段分布需要先在表里加一列“年龄”然后分组统计。部门平均工龄行区域放部门值区域用工龄字段求平均值。数据透视表的好处是交互式领导要看哪个维度就拖哪个字段不需要每次写新公式。7.3 生日、转正、合同到期提醒在企业人事管理里提醒功能比统计报表更常用。建议在 Excel 模板里单独放一个“本月提醒”区域IF(MONTH(C2)MONTH(TODAY()),本月生日,)再用条件格式把“本月生日”“即将到期”标成红色。每次打开模板当天需要关注的员工一眼就能看到。8. 系统集成与扩展批量任务、接口思路与第三方工具这套系统不只局限在 Excel 和 Access 内部。因为 Access 支持 ODBC外部的 Python、C#、WinCC 都可以读取和写入数据Excel 则通过 VBA 或 Power Query 做前端展示。这里给出几种常见扩展方向。8.1 批量导入更新Access 的“外部数据 导入 Excel”支持“将数据追加到现有表”非常适合批量导入历史数据。操作前先确认 Excel 文件表头与 Access 字段完全一致否则字段匹配不上会导致导入失败。这里有一个重要提醒如果用 Excel 模板录入了一批新员工再导入 Access 时不要直接覆盖整个表应该选择“追加”模式。这样可以保留原有的员工记录只把新增行加进去。8.2 定期同步与备份建议维护一个“同步宏”把 Excel 模板中需要入库的数据追加到 Access。宏写好后每天录入完毕点一次数据就进入数据库。备份策略更简单每周复制一次HR_System.accdb文件在文件名后加日期例如HR_System_20250101.accdb。注意备份前先关闭 Access因为文件被占用时复制会失败。8.3 用 Python 读取 Access如果团队更熟悉 Python可以使用 pyodbc 读取 Access 数据再用 openpyxl 写出 Excel 报表。这个方案比 VBA 更适合定时任务。import pyodbc conn pyodbc.connect( rDRIVER{Microsoft Access Driver (*.mdb, *.accdb)}; rDBQC:\HRSystem\ACCESS_DB\HR_System.accdb; ) cursor conn.cursor() cursor.execute(SELECT 员工编号, 姓名, 部门 FROM 员工信息表 WHERE 在职状态在职) rows cursor.fetchall() for row in rows: print(row) conn.close()运行前需要安装 pyodbcpip install pyodbc如果报“找不到 Microsoft Access Driver”说明 ACE 引擎没有安装或者驱动名与本机版本不一致。可以打开“ODBC 数据源管理器”查看可用的 Access 驱动名称。8.4 接入第三方工具WinCC、ArcGIS、Power BI 这类工具读取 Access 的原理基本一致通过 ODBC 连接指向.accdb文件。遇到“64位引擎不支持 DBC 数据只支持 Access 数据”这类报错核心是连接字符串写错不是数据库本身的问题。统一解决方案是使用标准连接串ProviderMicrosoft.ACE.OLEDB.12.0;Data SourceC:\HRSystem\ACCESS_DB\HR_System.accdb;如果工具是 32 位需要安装 32 位 ACE 引擎如果工具是 64 位则安装 64 位 ACE 引擎。位数不一致也是常见的连接失败原因。9. 常见问题与排查方法问题现象可能原因排查方式解决方案Excel 导入 Access 提示“外部表不是预期的格式”Excel 文件损坏、格式太老、有合并单元格、文件被占用检查文件扩展名、关闭文件、查看表头区域另存为.xlsx删除合并单元格关闭文件后重新导入VBA 报“未找到提供程序”或“ACE.OLEDB 未注册”ACE 引擎未安装32位/64位不匹配打开 ODBC 管理器查看驱动列表安装 Microsoft Access Database Engine 2016 Redistributable确认位数连接 Access 报“64位引擎不支持 DBC 数据只支持 Access 数据”连接字符串中驱动名或 Provider 写错检查连接串是否用了标准写法使用ProviderMicrosoft.ACE.OLEDB.12.0或Driver{Microsoft Access Driver (*.mdb, *.accdb)}身份证号变成科学计数法末尾变成 0Excel 将 18 位数字按数值处理鼠标点单元格查看实际值把身份证列设为文本格式或录入前加英文单引号日期导入后少一天或格式错区域日期格式与 Access 不一致检查 Access 字段类型和系统区域设置统一按yyyy-mm-dd输入SQL 中用#yyyy-mm-dd#包裹Access 文件打开被锁定无法导入导出其他程序或窗口正在使用数据库查看是否有未关闭的 Access 窗口关闭所有占用该文件的窗口再操作VBA 提示“不能更新数据库或对象只读”数据库文件只读或者处于共享保护检查文件属性去掉只读属性以管理员身份运行 Office导入时字段对不上Excel 表头与 Access 字段名不一致对比两边的列名统一字段名或者在导入向导里手动映射字段局域网多人同时写入时锁死Access 并发处理能力弱观察是否多人同时编辑同一记录建议单人维护写入其他人只读查询数据量大时换专业数据库运行 pyodbc 报找不到驱动ACE 引擎未安装或位数不对在 ODBC 管理器查看 Access 驱动安装对应位数 ACE 引擎修改连接串驱动名排查问题时的通用步骤是先看位数再看驱动最后看连接字符串。绝大多数 Excel 与 Access 之间的连接报错都可以归到这三类。10. 最佳实践与使用建议10.1 数据管理规范字段名在整个系统里要保持一致。Excel 表头叫“部门”Access 字段也叫“部门”查询和导入时就不会乱。身份证号、手机号、银行账号这种长数字一律存文本不存数字避免精度丢失。避免在 Excel 中使用合并单元格不要留整行空行不要用多级表头。这些习惯在单个 Excel 文件里看着方便一旦要导入 Access 就会变成报错源头。10.2 操作节奏第一次先小范围测试不要急着把几百个历史员工一次性导入。先用 10 条数据走通“Excel 录入 - Access 导入 - 查询统计 - 导出报表”全流程确认没有问题再导入全量数据。保留一套最小可运行配置HR_System.accdb、员工信息录入模板.xlsx、一个同步宏文件。以后即使功能扩展失败也能回到最小配置重新开始。10.3 批量任务要加日志如果使用 VBA 或 Python 做批量导入建议在导入过程中记录成功条数、失败行号、失败原因。最简单的做法是在 VBA 里用一个日志文件写入错误信息Open C:\HRSystem\LOGS\import_log.txt For Append As #1 Print #1, Now 第 i 行导入失败: Err.Description Close #1有日志之后导入失败不再是“黑盒”定位问题会快很多。10.4 合规与安全涉及身份证、薪资、银行卡号的数据不要整表群发。如果必须通过局域网共享先设置好 Windows 文件权限只给对应岗位的人读写权限。Access 数据库本身支持密码加密可以在“文件 信息 用密码加密”里设置。VBA 宏来源也要注意不要随便启用来路不明的宏文件。企业内部使用宏时可以把公司的模板目录加入受信任位置然后只在受信任位置启用宏。10.5 先跑通一条最小路径这个系统的建设不要一步到位。建议第一个版本只做三件事Access 建员工信息表、Excel 做录入模板和身份证公式、跑通一次导入导出。等这些稳定之后再加考勤表、薪资表、合同到期提醒、Python 自动报表。11. 总结与下一步这套 Excel Access 人事系统胜在所有组件都是 Office 自带几乎零成本。值得先验证的三件事一、Access 里建好员工信息表并把 Excel 里的记录导进去二、Excel 里用身份证公式自动算出性别和年龄三、跑通一次 VBA 或 Power Query 的数据读取。最容易卡住的地方是数据库驱动和位数匹配属于“第一次搞定后面一直顺”的问题。接下来可以做的方向把 Excel 模板做成只读展示版不允许直接改原始表把月度报表模板做好生成部门人数、离职率、试用期转正名单有开发能力时可以给 Access 套一层 Web 前端或把数据同步到在线表格便于远程查看。总之这个系统不要一步到位先跑通一条最小路径再按日常使用中的真实需求去加功能。
返回列表