一、前期环境准备与依赖安装
档案软件单机版通常使用本地数据库(如SQLite、Firebird或Access)存储数据,其自带的导入功能往往存在速度慢、格式校验严苛等问题。为了实现高效、稳定的批量导入,最稳妥的方案是直接通过Python脚本操作本地数据库。首先需要搭建Python运行环境。
打开终端或命令提示符(CMD),输入以下命令检查Python版本,确保已安装Python 3.8及以上版本:
```bash
python --version
```
接着,安装必要的第三方库。我们将使用pandas处理Excel数据,sqlalchemy和openpyxl处理数据库连接与文件读写。请直接复制并执行以下安装命令:
```bash
pip install pandas sqlalchemy openpyxl
```
如果单机版档案软件使用的是特定的老旧数据库(如Firebird),还需要安装对应的驱动,例如:
```bash
pip install fdb
```
二、数据源标准化处理(Excel模板规范)
导入失败的核心原因通常是数据格式不匹配。不要直接使用业务原始数据表,必须新建一个标准的导入模板。假设档案软件的数据库表名为archives_main,Excel文件必须包含以下字段,且表头必须严格一致:
- archive_id:档案号(文本型,不能含特殊符号)
- title:题名(文本型,去除首尾空格)
- date:归档日期(格式必须为YYYY-MM-DD)
- category:档案分类代码(如"A01",需与软件内置表一致)
- file_path:电子文件挂接路径(绝对路径或相对路径)
- page_count:页数(整数型)
在Excel中,选中“日期”列,右键设置单元格格式为“自定义”,类型输入yyyy-mm-dd。这一步至关重要,否则导入后日期会显示为一串数字。对于“页数”列,需确保单元格内没有空格或文字后缀。
三、定位单机版软件数据库文件
单机版软件的数据通常存储在本地文件中。你需要找到该数据库文件的物理路径。
- SQLite数据库:通常扩展名为
.db或.sqlite,常见路径为C:\Users\[用户名]\AppData\Local\[软件名]\data.db或软件安装目录下的Database文件夹。
- Access数据库:扩展名为
.mdb或.accdb。
- Firebird/SQL Server:需检查软件的配置文件(如
config.ini或appsettings.json)以获取连接字符串。
找到数据库文件后,务必先复制一份备份。所有的批量操作都应在备份文件上进行,直到验证无误后再替换原文件。
四、编写自动化批量导入脚本

新建一个文本文件,命名为batch_import.py。将以下代码完整复制进去。该脚本以最常见的SQLite为例,如果你的软件使用Access或其他数据库,只需修改create_engine部分的连接字符串即可。
```python
import pandas as pd
from sqlalchemy import create_engine, text
import os
from datetime import datetime
================= 配置区域 =================
1. Excel文件路径 (请使用反斜杠或双反斜杠)
EXCEL_PATH = r"D:\ImportData\档案数据表.xlsx"
2. 数据库连接字符串 (SQLite示例)
如果是Access,使用: 'access+pyodbc:///?Driver={Microsoft Access Driver (.mdb, .accdb)};DBQ=D:\data\archive.db'
DB_CONNECTION_STR = "sqlite:///D:/Software/ArchiveSystem/data.db"
3. 数据库目标表名
TARGET_TABLE = "archives_main"
================= 执行逻辑 =================
def main():
print(f"[{datetime.now()}] 开始读取Excel文件...")
读取Excel
try:
df = pd.read_excel(EXCEL_PATH)
print(f"成功读取 {len(df)} 行数据。")
except Exception as e:
print(f"读取Excel失败: {e}")
return
数据清洗:去除字符串字段的空格
str_cols = df.select_dtypes(include=['object']).columns
df[str_cols] = df[str_cols].apply(lambda x: x.str.strip())
检查必填字段
required_cols = ['archive_id', 'title', 'date']
for col in required_cols:
if col not in df.columns:
print(f"错误:Excel缺少必填列 '{col}'")
return
处理日期格式:强制转为字符串YYYY-MM-DD,防止数据库报错
try:
df['date'] = pd.to_datetime(df['date']).dt.strftime('%Y-%m-%d')
except Exception as e:
print(f"日期格式转换失败,请检查Excel日期列: {e}")
return
连接数据库
print(f"[{datetime.now()}] 正在连接数据库...")
try:
engine = create_engine(DB_CONNECTION_STR)
测试连接
with engine.connect() as conn:
conn.execute(text("SELECT 1"))
执行批量导入 (if_exists='append' 表示追加数据,'replace' 表示覆盖表)
print(f"[{datetime.now()}] 正在写入数据库表: {TARGET_TABLE}...")
df.to_sql(
name=TARGET_TABLE,
con=engine,
if_exists='append',
index=False,
chunksize=500 分批提交,防止内存溢出
)
print(f"[{datetime.now()}] 导入成功!共导入 {len(df)} 条数据。")
except Exception as e:
print(f"数据库操作失败: {e}")
finally:
if 'engine' in locals():
engine.dispose()
if __name__ == "__main__":
main()
```
五、执行导入与常见报错处理
保存脚本后,在CMD窗口中进入脚本所在目录,执行以下命令启动导入:
```bash
python batch_import.py
```
观察控制台输出。如果看到“导入成功”,即可打开档案软件刷新界面查看数据。若遇到报错,请按以下方案排查:
- OperationalError: no such table:表名错误。请打开数据库查看真实的表名,单机版软件表名常带有前缀如
t_arc_main。
- IntegrityError: UNIQUE constraint failed:主键冲突。Excel中的
archive_id在数据库中已存在。需要在脚本中添加去重逻辑,或者先在数据库中清理旧数据。
- InterfaceError: Error binding parameter:数据类型不匹配。检查Excel中的“页数”列是否混入了文字,或日期列是否为空。
六、电子文件批量挂接(进阶实操)
对于有附件(PDF、图片)的档案,仅导入元数据是不够的。通常档案软件有一个files表用于存储文件路径。在上述脚本的基础上,增加以下逻辑:
1. 确保Excel中有一列file_path,值为文件的完整绝对路径(例如D:\Files\2023\001.pdf)。
2. 在脚本中,将df拆分为两部分:一部分写入主表archives_main,一部分提取archive_id和file_path写入附件表archive_files。
示例代码片段(追加在main函数中):
```python
假设附件表名为 archive_files,包含字段: main_id, file_path
if 'file_path' in df.columns:
筛选出有文件的数据
df_files = df[['archive_id', 'file_path']].dropna(subset=['file_path'])
重命名列以匹配数据库字段(假设数据库字段为 main_id, file_path)
df_files.columns = ['main_id', 'file_path']
写入附件表
df_files.to_sql(
name='archive_files',
con=engine,
if_exists='append',
index=False
)
print(f"[{datetime.now()}] 附件挂接信息已更新。")
```
执行此步骤前,请务必确认数据库中archive_files表的main_id字段确实关联到主表的archive_id。通过以上步骤,你即可在不依赖软件原生限制的情况下,完成档案软件单机版的数据与文件批量导入。