You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将Excel员工排班宽表转换为数据库长表并完成插入?

解决方案:Excel宽表转长表并插入数据库

嘿,这个需求我帮你搞定,给你几个实用的方案,从Excel转格式到插入数据库一步到位:

方案一:用Excel内置Power Query转长表后导入数据库

这是最适合新手的可视化操作方法,不用写代码:

  • 打开你的排班Excel文件,选中整个数据区域(包括表头)
  • 切换到「数据」选项卡,点击「从表格/区域」(旧版Excel可能叫「获取和转换数据」),自动进入Power Query编辑器
  • 在编辑器里,选中所有日期列(也就是1/01/2019、2/01/2019这些列),然后点击「转换」选项卡的「逆透视列」→「逆透视其他列」
  • 数据自动变成你要的长表格式!把自动生成的「属性」列重命名为Date,「值」列重命名为Shift
  • 点击「关闭并上载」,把转换后的长表导出到新的Excel工作表
  • 最后用数据库的导入工具(比如SQL Server导入导出向导、MySQL Workbench的导入功能),把这个长表导入数据库,注意字段类型匹配:Empid设为整数,Date设为日期类型,Shift设为短字符型

方案二:用Python脚本自动化处理(适合批量/重复操作)

如果需要定期处理这类数据,用Python脚本自动化更高效:

  1. 先安装依赖包:
pip install pandas sqlalchemy openpyxl

(如果是.xls格式的Excel,把openpyxl换成xlrd==1.2.0,新版本xlrd不支持xls)

  1. 编写处理脚本:
import pandas as pd
from sqlalchemy import create_engine

# 读取Excel宽表,替换成你的文件路径
df = pd.read_excel("员工排班表.xlsx")

# 逆透视转长表:id_vars保留Empid列,其他列转成Date和Shift
df_long = df.melt(id_vars="Empid", var_name="Date", value_name="Shift")

# 连接数据库(以MySQL为例,替换成你的数据库信息)
# 其他数据库连接字符串:SQL Server用mssql+pyodbc://用户名:密码@服务器/数据库;SQLite用sqlite:///test.db
engine = create_engine("mysql+pymysql://你的用户名:你的密码@localhost/你的数据库名")

# 将数据插入数据库表,表不存在会自动创建;if_exists可选replace(替换表)/append(追加数据)/fail(存在则报错)
df_long.to_sql("employee_shift", engine, if_exists="replace", index=False)

运行脚本后,数据就自动转成长表并插入到数据库里了。

方案三:先导入宽表到数据库,再用SQL转长表

如果已经把宽表导入数据库了,直接用SQL语句转换:

MySQL(用UNION ALL)

-- 先创建目标表
CREATE TABLE employee_shift (
    Empid INT,
    Date DATE,
    Shift VARCHAR(10)
);

-- 转换并插入数据
INSERT INTO employee_shift(Empid, Date, Shift)
SELECT Empid, STR_TO_DATE('1/01/2019', '%d/%m/%Y') AS Date, `1/01/2019` AS Shift FROM 宽表名
UNION ALL
SELECT Empid, STR_TO_DATE('2/01/2019', '%d/%m/%Y') AS Date, `2/01/2019` AS Shift FROM 宽表名
UNION ALL
SELECT Empid, STR_TO_DATE('3/01/2019', '%d/%m/%Y') AS Date, `3/01/2019` AS Shift FROM 宽表名;

SQL Server(用UNPIVOT语法更简洁)

-- 创建目标表
CREATE TABLE employee_shift (
    Empid INT,
    Date DATE,
    Shift VARCHAR(10)
);

-- 转换并插入
INSERT INTO employee_shift(Empid, Date, Shift)
SELECT Empid, CONVERT(DATE, DateCol, 103) AS Date, Shift
FROM 宽表名
UNPIVOT (
    Shift FOR DateCol IN ([1/01/2019], [2/01/2019], [3/01/2019])
) AS UnpivotResult;

选哪个方案看你的具体场景:手动处理用方案一,自动化用方案二,已经导入数据库用方案三就行~

内容的提问来源于stack exchange,提问作者hady alzpen

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.11 09:18:18