如何实现基于Excel文件变更自动更新MariaDB数据库?
解决方案:Excel文件与MariaDB(XAMPP)同步方案
一、自动同步方案(监听Excel变更)
SQL本身确实没有文件监听能力,但可以通过文件系统监听工具+同步脚本实现类似事件触发的自动更新:
- 用Python的
watchdog库监听目标Excel文件的修改/保存事件,一旦检测到文件变更,自动执行数据同步逻辑:- 安装依赖:
pip install watchdog pandas mysql-connector-python - 核心示例代码:
from watchdog.observers import Observer from watchdog.events import FileSystemEventHandler import pandas as pd import mysql.connector import time # 提前配置好数据库和Excel路径(无需用户修改) DB_CONFIG = { 'host': 'localhost', 'user': 'root', 'password': '', 'database': '你的数据库名' } EXCEL_PATH = r'\\组织主驱动器路径\目标文件.xlsx' TABLE_NAME = '目标数据表名' class ExcelChangeHandler(FileSystemEventHandler): def on_modified(self, event): if not event.is_directory and event.src_path.endswith('.xlsx'): # 等待文件保存完成,避免读取临时文件 time.sleep(2) try: # 读取Excel数据 df = pd.read_excel(EXCEL_PATH) # 连接数据库 conn = mysql.connector.connect(**DB_CONFIG) cursor = conn.cursor() # 全量替换表数据(如果需要增量更新,可改为按主键判断插入/更新) cursor.execute(f"TRUNCATE TABLE {TABLE_NAME}") # 批量插入数据 for _, row in df.iterrows(): # 根据你的表结构调整字段和占位符 insert_sql = f"INSERT INTO {TABLE_NAME} (col1, col2, col3) VALUES (%s, %s, %s)" cursor.execute(insert_sql, (row['Excel列名1'], row['Excel列名2'], row['Excel列名3'])) conn.commit() print(f"{time.ctime()}: 数据同步完成") except Exception as e: print(f"同步失败: {str(e)}") finally: cursor.close() conn.close() if __name__ == "__main__": event_handler = ExcelChangeHandler() observer = Observer() # 监听Excel文件所在的文件夹 observer.schedule(event_handler, path=r'\\组织主驱动器路径', recursive=False) observer.start() try: while True: time.sleep(1) except KeyboardInterrupt: observer.stop() observer.join()
- 安装依赖:
- 部署方式:用
pyinstaller -F sync_script.py把脚本打包成Windows可执行文件,设置成开机自启的后台进程,或者用NSSM工具注册为系统服务,实现持续监听。 - 注意点:要过滤Excel保存时生成的临时文件(如
~$开头的文件),避免误触发;如果需要增量更新,不要用TRUNCATE,而是根据主键判断数据是新增还是需要更新。
二、手动便捷同步方案(适合非技术人员)
如果自动方案太复杂,给非技术人员做个一键同步工具即可:
1. 可视化GUI工具
用Python Tkinter做极简界面,仅保留同步按钮,用户点击即可完成操作:
import tkinter as tk from tkinter import messagebox import pandas as pd import mysql.connector # 提前配置好数据库和Excel路径 DB_CONFIG = { 'host': 'localhost', 'user': 'root', 'password': '', 'database': '你的数据库名' } EXCEL_PATH = r'\\组织主驱动器路径\目标文件.xlsx' TABLE_NAME = '目标数据表名' def sync_data(): try: df = pd.read_excel(EXCEL_PATH) conn = mysql.connector.connect(**DB_CONFIG) cursor = conn.cursor() cursor.execute(f"TRUNCATE TABLE {TABLE_NAME}") for _, row in df.iterrows(): insert_sql = f"INSERT INTO {TABLE_NAME} (col1, col2, col3) VALUES (%s, %s, %s)" cursor.execute(insert_sql, (row['Excel列名1'], row['Excel列名2'], row['Excel列名3'])) conn.commit() messagebox.showinfo("成功", "数据同步完成!") except Exception as e: messagebox.showerror("失败", f"同步出错:{str(e)}") finally: cursor.close() conn.close() # 构建GUI界面 root = tk.Tk() root.title("Excel同步到数据库") root.geometry("300x100") tk.Button(root, text="点击同步数据", command=sync_data, width=20, height=2).pack(pady=20) root.mainloop()
打包成exe文件后,用户双击打开,点一下按钮就完成同步,完全无需接触SQL或phpMyAdmin。
2. 批处理脚本(更轻量)
写一个.bat文件,内容如下:
@echo off echo 正在同步数据... python "C:\脚本存放路径\sync_excel.py" echo 同步完成,按任意键退出... pause > nul
把纯同步逻辑的Python脚本放在指定路径,用户双击这个bat文件就能执行同步,适合习惯用快捷方式的用户。
内容的提问来源于stack exchange,提问作者Boom
相关产品推荐
相关产品推荐

