# Excel导入资料库 **Repository Path**: sen_shan/excelToDataBase ## Basic Information - **Project Name**: Excel导入资料库 - **Description**: Excel导入资料库 - **Primary Language**: Python - **License**: MulanPSL-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2025-06-03 - **Last Updated**: 2025-07-25 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # Excel 数据导入数据库系统文档说明 --- ## 一、项目概述 本项目是一个基于 Python 的自动化工具,用于将 **Excel 文件中的数据批量导入到数据库**,支持 SQL Server、MySQL 和 Oracle 等多种数据库类型。通过命令行参数控制程序行为,并利用 AES 加密保护敏感信息。 项目具备以下核心功能: - **Excel 文件读取与处理** - **字段映射与默认值填充** - **数据库连接与批量插入** - **文件备份与错误日志记录** - **加密/解密交互操作** - **日志管理与定时清理** --- ## 二、系统架构 ### 技术栈 - **开发语言**:Python 3.8+ - **核心库**: - `pandas`:读取和处理 Excel 文件 - `sqlalchemy`:数据库连接与操作 - `openpyxl`:支持 [.xlsx] 格式文件读取 - `oracledb`, `pymssql`, `mysql-connector-python`:不同数据库的驱动 - **加密模块**:使用 AES 对称加密算法保护敏感配置(如数据库密码) - **日志管理**:自定义日志类支持按级别输出到控制台与文件,并支持定时轮转 - **配置管理**:通过 `.env` 文件进行环境和数据库配置 - **导入管理**:通过 `ImpConfig.xlsx` 文件实现数据库与导入配置的关联,该文件用于定义数据库表与 Excel 文件之间的映射关系。 - **文件处理**:封装了递归查找、移动、删除等通用文件操作函数 --- ## 三、主要模块说明 ### 1. 主程序入口 [excelToDataBaseMain.py] 主程序根据命令行参数执行以下功能: | 参数 | 功能描述 | |------------|------------------| | [encrypt] | 启动加密输入流程 | | [decrypt] | 启动解密输入流程 | | [load] | 加载并处理 Excel 文件 | | 无参数 | 默认执行 [load]操作 | ```python def main(): if len(sys.argv) > 1: param = sys.argv[1] if param == 'encrypt': crypt_input.input_encrypt_data() elif param == 'decrypt': crypt_input.input_decrypt_data() elif param == 'load': excel.load_file() else: print("无效的参数") else: excel.load_file() logger_cust.delete() ``` #### 加密操作批处理文件 [run_encrypt_set.bat] ```dos @echo off :: 设置可执行文件的路径 set EXE_FILE=excelToDataBaseMain.exe :: 直接传递加密 参数给可执行文件 %EXE_FILE% encrypt ``` #### 主程序批处理文件 [run_main.bat] ```dos @echo off :: 设置可执行文件的路径 set EXE_FILE=excelToDataBaseMain.exe :: 无参数运行可执行文件 %EXE_FILE% ``` --- ### 2. 加密/解密模块 `src/core/crypt_input.py` 提供交互式的加密和解密功能,用户可手动输入内容进行加密或解密操作。 #### 函数说明: - [input_encrypt_data()]:循环接收用户输入,调用 AES 加密函数输出加密结果 - [input_decrypt_data()]:循环接收加密字符串,调用 AES 解密函数输出原文 > 依赖:crypt_utils.aes_encrypt(data) / crypt_utils.aes_decrypt(data) --- ### 3. 加密工具类 `src/core/crypt_utils.py` 实现 AES 对称加密算法,支持加密与解密操作。 #### 核心函数说明: - [aes_encrypt(data, key=get_crypt_key())]:使用 AES/CBC/PKCS7 填充方式对数据进行加密,返回 Base64 编码的密文 - [aes_decrypt(ciphertext, key=get_crypt_key())]:解密 Base64 编码的密文,还原原始数据 - [get_crypt_key()]:获取配置文件中定义的密钥,并拼接其反转版本以增强安全性 - [md5(data)]:计算输入数据的 MD5 哈希值(可用于校验) --- ### 4. 字符串与数据处理模块 `src/core/str_utils.py` 封装常用字符串、日期、路径等实用工具函数。 #### 核心函数说明: - [is_empty(value)] / [is_not_empty(value)]:判断值是否为空(包括 None、空字符串、空列表、空字典等) - [is_number(value)]:判断字符串或变量是否为数字(整数或浮点数) - [is_date(date_string, date_format='%Y-%m-%d')]:判断字符串是否符合指定格式的日期 - [reverse(s)]:反转字符串字符顺序 - [generate_id(RemoveDash=True)]:生成 UUID,支持去横线处理 - [get_project_root()]:获取当前项目的根目录路径 - [is_drive_path(file_path)] / [is_path(file_path)]:判断是否为 Windows 盘符路径或有效文件路径 - [isFileExists(file_path)]:检查文件是否存在 - [get_file_info(file_path)]:提取文件名、扩展名、不带扩展名的文件名 --- ### 5. 文件处理模块 `src/core/files_utils.py` 封装文件系统的常见操作,包括查找、移动、删除、错误日志写入等功能。 #### 核心函数说明: - `read_files_with_pattern(directory_path, pattern, include_subdirs=False)`:查找指定目录下符合模式的文件 - `move_file(source_file, backup_folder, overwrite=False)`:将源文件移动至目标目录,避免覆盖冲突 - `delete_files(folder_path, days, delete_empty_folders=False)`:删除超过指定天数的文件,可选删除空文件夹 - `ErrMessage(folder_path, file_name, message)`:将错误消息写入日志文件,自动创建文件夹结构 --- ### 6. 日志管理模块 `src/core/logging_utils.py` 自定义日志模块,支持按级别输出到控制台和文件,并支持日志文件定时轮转。 #### 类:[Logger] - 支持 DEBUG/INFO/WARNING/ERROR/CRITICAL 多个级别日志输出 - 支持日志文件按天切割,保留历史日志(最多 5 份) - 支持日志删除(根据配置保留天数) --- ### 7. Excel 处理模块 `src/core/excel_loader.py` 负责读取 Excel 文件并按照配置规则进行字段映射、默认值填充、数据清洗等操作。 #### 核心函数说明: - load_excel_file(file_path, sheet_name=None, usecols=None):读取 Excel 文件,返回 DataFrame - [load_config_table_file()]:加载 `ImportConfig.xlsx` 中的 `Table` Sheet,获取任务配置 - [load_config_Filed_file(ModelName)]:根据模型名筛选出对应的字段映射规则 - [load_file()]:执行整个导入流程: - 读取配置 → 查找文件 → 映射字段 → 插入数据库 → 错误处理 → 文件备份 --- ### 8. 数据库操作模块 `src/core/db_sqlalchemy_utils.py` 封装数据库连接与批量插入逻辑,支持多数据库类型。 #### 类:[DatabaseOperations] - [connect()]:根据配置建立数据库连接(支持 SQL Server、MySQL、Oracle) - [bulk_insert(table_name, data)]:将 DataFrame 数据批量插入指定表中 - [convert_to_str(x)]:将非 NaN 值转换为字符串,支持简繁体转换(可选) --- ## 四、配置说明 ### 1. 环境变量配置文件 `.env` | 配置项 | 描述 | |-------------------------------|--------------------------------| | [ENV_STATE] | 环境模式(dev/test/prod) | | [DB_TYPE] | 数据库类型(sql_server/mysql/oracle) | | [DB_HOST] | 数据库主机地址(需加密存储) | | [DB_PORT] | 数据库主机端口(需加密存储) | | [DB_SID] | 数据库名(需加密存储) | | [DB_USERNAME] | 用户名(需加密存储) | | [DB_PASSWORD] | 密码(需加密存储) | | [LOG_LEVEL] | 日志级别 | | [LOG_DIR] | 日志路径 | | [BACKUP_DAYS] | 备份文件保留天数 | | [IMP_CONFIG_PATCH] | 导入配置文件路径 | | [CRYPT_KEY] | 加密密钥 | | [OPENCC_CONVERSION_ENABLED] | 是否启用简繁体转换 | | [OPENCC_CONVERSION_TYPE] | 简繁体转换类型(如 s2t.json) | > ⚠️ 注意:所有数据库连接信息应加密保存,在代码中使用 `crypt_utils.aes_decrypt()` 解密读取。 > 数据库连接信息/CRYPT KEY应该放在dev/prod文件中,不要放在.env文件中避免重要信息泄露。 --- ## 五、使用说明 ### 1. 安装依赖 ```bash pip install pandas sqlalchemy opencc openpyxl oracledb pymssql mysql-connector-python numpy cryptography ``` ### 2. 配置文件准备 - `config/ImportConfig.xlsx` - `Table` Sheet:每个条目表示一个导入任务,包含文件路径、表名、控制表、备份路径等 - `Field` Sheet:字段映射规则,Excel 列名 → 数据库字段名 + 默认值设定 ### 3. 运行方式 ```bash python excelToDataBaseMain.py [encrypt|decrypt|load] ``` - 不带参数:默认执行 [load] - [encrypt]:进入加密输入模式 - [decrypt]:进入解密输入模式 - [load]:加载并导入 Excel 数据 --- # 六、导入配置说明文档 `impConfig.xlsx` --- ## 1、配置文件结构 `impConfig.xlsx` 是 Excel 数据导入数据库系统的核心配置文件,包含两个关键 Sheet: **Table**:定义数据源与目标数据库表的映射关系 **Field**:定义字段级别的映射规则和默认值设定 该配置文件路径由 `.env` 文件中的 `IMP_CONFIG_PATCH=config/impConfig.xlsx` 指定。 --- ## 2、`Table`定义 用于定义每个 Excel 文件与目标数据库表之间的整体映射关系。 | 字段名 | 类型 | 必填 | 描述 | |-----------------|----------|----|---------------------------| | ModelName | string | 是 | 模型名称,用于关联 Field 表中的配置 | | Desc | string | 是 | 描述说明 | | FilePath | string | 是 | Excel 文件所在的目录路径(可使用盘符路径) | | FileName | string | 是 | Excel 文件名匹配模式(如 `*.xlsx`) | | SheetName | string | 否 | Excel 中的工作表名称,默认读取第一个工作表 | | TableName | string | 是 | 目标数据库中要插入的表名 | | ControlTable | string | 否 | 控制表名(可用于状态管理) | | AfterImporting | string | 否 | 导入前处理程序 | | BeforeImporting | string | 否 | 导入后处理程序 | | BakPath | string | 是 | 成功导入后文件备份路径 | | ErrMesPath | string | 是 | 错误日志写入路径 | ### 示例: | ModelName | Desc | FilePath | FileName | SheetName | TableName | ControlTable | BakPath | ErrMesPath | |--------------|-----------|--------------------|--------------|-----------|-----------|--------------|-----------------|------------------| | SN_ASS_C_CFM | C类料交期回复| ..\docs\Imp\SN | SN-Ass大料况*.xlsx | Sheet1 | EPI_PO_ASS_CONFIRM | CONTROL_TABLE | ..\docs\Bak\SN | ..\docs\ErrMes\SN | > ✅ **注意**: > - `FilePath` 支持通配符,例如 `*.xlsx` 或 `user_*.xlsx` > - 如果 `SheetName` 留空,则默认读取第一个工作表 > - `BakPath` 和 `ErrMesPath` 若存在则清空旧文件,否则自动创建目录,BakPath为空会导致文件不会被移转一直在FilePath文件夹中 --- ## 3、`Field`定义 用于定义每个模型对应的数据列映射规则及字段处理逻辑。 | 字段名 | 类型 | 必填 | 描述 | |--------------|----------|------|---------------------------------------------------------------------------------------------------------------------------------| | ModelName | string | 是 | 关联 Table 表中的 ModelName | | ExcelField | string | 是 | Excel 中的列名 | | TableField | string | 是 | 对应数据库表的字段名 | | DefaultValue | string | 否 | 默认值。支持以下特殊值:
`auto-generate` 自动生成批次 ID
`auto-datetime` 使用当前时间
`auto-line-number` 自动行号
`auto-generate-row` 每行生成唯一 ID | | Desc | string | 否 | 描述说明 | | Remark | string | 否 | 备注说明 | ### 示例: | ModelName | ExcelField | TableField | DefaultValue | Desc | remark | |-----------------|------------------------|-----------------------|----------------------|----------------|------------------------------------------------------------------------| | SN_ASS_C_CFM | WO COMPONENT NO. | ITEM_NO | | 物料编码 | | | SN_ASS_C_CFM | 采购CFM | CONFIRM_DATE | | 供给日期 | | | SN_ASS_C_CFM | 说明 | CONFIRM_EXPLANATION | | 说明 | | | SN_ASS_C_CFM | 问题 | CONFIRM_PROBLEM | | 问题 | | | SN_ASS_C_CFM | SUPPLY TYPE | SUPPLY_TYPE | | 供给类型 | | | SN_ASS_C_CFM | WO OUTSTANDING QTY. | CONFIRM_QTY | | 供给数量 | | | SN_ASS_C_CFM | PO NO. | PO_NUMBER | | 采购单号码 | | | SN_ASS_C_CFM | SUPPLIER NAME | SUPPLIER_NAME | | 供应商 | | | SN_ASS_C_CFM | | BATCH_ID | auto-generate | 批号 | "auto-generate是一个文档一个auto-generate-row每行一个" | | SN_ASS_C_CFM | | BATCH_LINE_NUMBER | auto-line-number | 项次号码 | | | SN_ASS_C_CFM | | PROCESS_CODE | 2000 | 工程代码 | | | SN_ASS_C_CFM | | SERVER_CODE | SERCOMM | 服务代码 | | | SN_ASS_C_CFM | | STATUS_CODE | 10 | 状态代码 | | | SN_ASS_C_CFM | | B2B_CREATION_DATE_TIME| auto-datetime | 创建时间 | | | SN_ASS_C_CFM | | ORG_CODE | SN | 组织代码 | | | SN_ASS_C_CFM | | DATA_SOURCE | ASS | 资料源 | | > ✅ **注意**: > - `DefaultValue` 可为空,表示不填充默认值 > - 列名大小写不敏感,但建议保持一致以避免歧义 > - 若 Excel 中没有对应的列名,会根据 `DefaultValue` 规则自动填充 --- ## 4、配置示例说明 ### 示例 1:基本字段映射 ```excel ModelName: SN_ASS_C_CFM ExcelField: WO COMPONENT NO. TableField: ITEM_NO DefaultValue: ``` → 将 Excel 中的“WO COMPONENT NO.”列映射到数据库表的 `ITEM_NO` 字段,无默认值。 --- ### 示例 2:自动填充批次 ID ```excel ModelName: SN_ASS_C_CFM ExcelField: TableField: batch_id DefaultValue: auto-generate ``` → 在整个 Excel 导入任务开始时自动生成一个批次 ID,并在所有行中填充到 `batch_id` 字段。 --- ### 示例 3:自动填充当前时间 ```excel ModelName: SN_ASS_C_CFM ExcelField: TableField: B2B_CREATION_DATE_TIME DefaultValue: auto-datetime ``` → 使用当前时间戳填充 `B2B_CREATION_DATE_TIME` 字段。 --- ### 示例 4:自动添加行号 ```excel ModelName: SN_ASS_C_CFM ExcelField: TableField: BATCH_LINE_NUMBER DefaultValue: auto-line-number ``` → 自动为每一行添加递增行号,从 1 开始。 --- ### 示例 5:每行生成唯一 ID ```excel ModelName: SN_ASS_C_CFM ExcelField: TableField: ID DefaultValue: auto-generate-row ``` → 每行生成一个唯一的 UUID,用于标识每条记录。 --- ### 示例 6:默认值 ```excel ModelName: UserImport ExcelField: TableField: ORG_CODE DefaultValue: SN ``` → 把SN填充到`ORG_CODE` 字段所有行中 。 --- ## 5、字段匹配机制 1. 程序首先根据 `Table` Sheet 中的 `ModelName` 加载对应的字段映射。 2. 然后尝试将 Excel 的列名与 `Field` Sheet 中的 `ExcelField` 匹配。 3. 匹配成功后,将数据映射到 `TableField`。 4. 若未找到匹配列且设置了 `DefaultValue`,则按规则填充默认值。 --- ## 6、CONTROL_TABLE定义 | ModelName | ExcelField | TableField | DefaultValue | Desc | remark | |---------------------|-------------------------------|-----------------------------|-------------------------|------------------|---------------------| | CONTROL_TABLE_WRITE | | BATCH_ID | default-batch-id | 默认批次号码 | | | CONTROL_TABLE_WRITE | | PROCESS_CODE | 2000 | 项目代码 | | | CONTROL_TABLE_WRITE | | SERVER_CODE | SERCOMM | 服务代码 | | | CONTROL_TABLE_WRITE | | DATA_COUNT | default-data-count | 笔数 | | | CONTROL_TABLE_WRITE | | STATUS_CODE | 100 | 状态代码 | | | CONTROL_TABLE_WRITE | | ERROR_MESSAGE | default-error-message | 错误代码 | | | CONTROL_TABLE_WRITE | | B2B_CREATION_DATE_TIME | auto-datetime | 创建日期 | | | CONTROL_TABLE_WRITE | | B2B_LAST_UPDATE_DATE_TIME | auto-datetime | 修改日期 | | | CONTROL_TABLE_READY | | BATCH_ID | default-batch-id | 默认批次号码 | | | CONTROL_TABLE_READY | | PROCESS_CODE | 2000 | 项目代码 | | | CONTROL_TABLE_READY | | SERVER_CODE | SERCOMM | 服务代码 | | | CONTROL_TABLE_READY | | DATA_COUNT | default-data-count | 笔数 | | | CONTROL_TABLE_READY | | RETRY_COUNT | 0 | | | | CONTROL_TABLE_READY | | STATUS_CODE | 120 | 状态代码 | | | CONTROL_TABLE_READY | | ERROR_MESSAGE | default-error-message | 错误代码 | | | CONTROL_TABLE_READY | | B2B_CREATION_DATE_TIME | auto-datetime | 创建日期 | | | CONTROL_TABLE_READY | | B2B_LAST_UPDATE_DATE_TIME | auto-datetime | 修改日期 | | | CONTROL_TABLE_FAILL | | BATCH_ID | default-batch-id | 默认批次号码 | | | CONTROL_TABLE_FAILL | | PROCESS_CODE | 2000 | 项目代码 | | | CONTROL_TABLE_FAILL | | SERVER_CODE | SERCOMM | 服务代码 | | | CONTROL_TABLE_FAILL | | DATA_COUNT | default-data-count | 笔数 | | | CONTROL_TABLE_FAILL | | STATUS_CODE | 120 | 状态代码 | | | CONTROL_TABLE_FAILL | | ERROR_MESSAGE | default-error-message | 错误代码 | | | CONTROL_TABLE_FAILL | | B2B_CREATION_DATE_TIME | auto-datetime | 创建日期 | | | CONTROL_TABLE_FAILL | | B2B_LAST_UPDATE_DATE_TIME | auto-datetime | 修改日期 | | - `CONTROL_TABLE_WRITE`写入中配置,暂未使用 - `CONTROL_TABLE_READY`写入完成配置,栏位根据实际表自定义 - `CONTROL_TABLE_FAILL`写入失败配置,暂未使用 --- ## 7、注意事项 - `impConfig.xlsx` 文件必须为 [.xlsx]格式,不能是 `.xls` - `ModelName` 必须唯一,确保 Table 与 Field 映射正确 - `DefaultValue` 支持字符串或预设关键字,不可混用非标准值 - 若 Excel 列名与配置项不一致,会导致导入失败,请严格匹配或使用工具函数转换(如全大写) - 配置文件修改后需重启程序或重新加载配置,确保生效 --- ## 8、推荐命名规范 | 项目 | 推荐命名方式 | |--------------|--------------------------| | ModelName | PascalCase(如 `UserImport`) | | ExcelField | 中文或英文列名(保持统一) | | TableField | snake_case(如 `user_name`) | | DefaultValue | 使用预设关键字,避免硬编码 | --- ## 9、常见问题排查 | 问题现象 | 可能原因 | 解决方法 | |----------------------------------|------------------------------------|----------| | 数据未映射 | Excel 列名与 `ExcelField` 不一致 | 检查列名是否完全匹配 | | 缺少默认值 | `DefaultValue` 设置错误 | 检查是否拼写错误或使用非法值 | | 程序报错“找不到列” | Excel 中缺少某列且未设置默认值 | 添加默认值或检查 Excel 文件内容 | | 批量导入失败 | 某些字段类型不匹配 | 检查数据库字段类型与 Excel 数据格式是否兼容 | | 备份路径未生效 | `BakPath` 路径错误 | 检查路径是否存在权限问题 | | 日志未输出或路径错误 | `ErrMesPath` 设置错误 | 检查路径是否存在或是否有写入权限 | --- ## 10、扩展建议 - 支持更多 `DefaultValue` 类型,如 `auto-user`(操作用户)、`auto-filename`(文件名) - 支持正则表达式匹配列名 - 支持字段校验规则(如非空、类型检查等) --- ## 11、附录:配置文件结构图 ``` impConfig.xlsx ├── Table │ ├── ModelName │ ├── FilePath │ ├── FileName │ ├── SheetName │ ├── TableName │ ├── ControlTable │ ├── BakPath │ └── ErrMesPath └── Field ├── ModelName ├── ExcelField ├── TableField └── DefaultValue ``` --- 通过以上配置,你可以灵活地控制 Excel 数据如何映射到数据库表中,并利用内置默认值机制提升数据完整性与自动化程度。 ## 七、日志与错误处理 - 日志输出:默认打印到控制台,也可配置写入文件 - 错误信息:会写入指定的错误目录下的 `Err.txt` 或以 `batch_id.txt` 形式保存 - 成功导入后:原始文件会被移动到备份目录(按批次 ID 存放) --- ## 八、注意事项 - 使用 Oracle 时,需要安装 Instant Client 并配置路径,instantclient_11_2为11.2版本数据库链接Client - 所有数据库连接信息应加密存储 - Excel 文件格式需与配置一致,避免列名不匹配问题 - 默认值规则需在配置文件中正确填写,否则可能导致导入失败 --- ## 九、版本更新记录 | 版本号 | 更新内容 | |--------------|----------| | v1.0.0 | 实现基础导入功能,支持字段映射 | | v1.1.0 | 增加默认值填充、自动生成批次 ID | | v1.2.0 | 支持多数据库类型(SQL Server、MySQL、Oracle) | | v1.3.0 | 增加简繁体转换、完善错误处理机制 | | v1.4.0 | 新增交互式加密/解密功能,提升配置安全 | | v1.5.0 | 新增 [str_utils] 工具类,增强路径、日期、UUID 等通用能力 | | v1.6.0 | 新增 [files_utils] 模块,支持递归查找、文件移动、日志写入等功能 | | v1.7.0 | 新增 [logging_utils] 日志模块,支持按级别输出与定时清理 | --- ## 十、联系方式 - 作者:[Sen Shan] - 邮箱:sen_shan@139.com - Gitee 地址:https://gitee.com/sen_shan/excelToDataBase.git --- 请根据您的实际项目内容进一步补充和完善该文档。