| @@ -0,0 +1,94 @@ | |||
| # 工资明细转换工具 - 使用和维护指南 | |||
| ## 快速开始 | |||
| 1. 确保已安装 Python 3.7 或更高版本 | |||
| 2. 创建虚拟环境并安装依赖: | |||
| ``` | |||
| cd excel_converter | |||
| uv venv | |||
| .venv\Scripts\activate # Windows | |||
| uv pip install -r requirements.txt | |||
| ``` | |||
| 3. 运行应用程序: | |||
| ``` | |||
| python main.py | |||
| ``` | |||
| 或直接双击 `run.bat` 文件 | |||
| ## 目录结构 | |||
| ``` | |||
| excel_converter/ | |||
| ├── app.py # 主应用程序代码 | |||
| ├── config.py # 配置文件 | |||
| ├── main.py # 入口点 | |||
| ├── requirements.txt # 依赖列表 | |||
| ├── run.bat # Windows 运行脚本 | |||
| ├── README.md # 项目说明 | |||
| ├── INSTRUCTIONS.md # 使用和维护指南 | |||
| └── test_data/ # 测试数据目录 | |||
| ├── README.md # 测试数据说明 | |||
| └── sample_format.md # 示例格式文档 | |||
| ``` | |||
| ## 配置指南 | |||
| ### 修改模板路径 | |||
| 如果需要更改模板文件路径,请编辑 `config.py` 文件中的 `TEMPLATE_PATH` 变量。 | |||
| ### 修改单元格映射关系 | |||
| 单元格映射关系在 `config.py` 文件中的 `CELL_MAPPINGS` 字典中定义。格式为: | |||
| ```python | |||
| { | |||
| (源文件sheet索引, 行, 列): (目标文件sheet索引, 行, 列) | |||
| } | |||
| ``` | |||
| 例如,要添加新的映射,可以添加新的键值对: | |||
| ```python | |||
| (0, 5, 3): (0, 5, 5) # 源文件Sheet1的C5映射到目标文件Sheet1的E5 | |||
| ``` | |||
| ### 修改公司和银行列表 | |||
| 编辑 `config.py` 文件中的 `COMPANY_OPTIONS` 和 `BANK_OPTIONS` 列表即可添加或删除选项。 | |||
| ## 常见问题解决 | |||
| ### 问题1: 程序启动失败 | |||
| - 检查 Python 版本是否兼容 (3.7+) | |||
| - 确认所有依赖已正确安装 | |||
| - 检查模板文件是否存在于指定路径 | |||
| ### 问题2: 转换后的文件格式不正确 | |||
| - 确认模板文件格式无误 | |||
| - 检查输入文件是否符合要求的格式 | |||
| - 确认映射关系配置正确 | |||
| ### 问题3: 无法识别日期 | |||
| 如果程序无法正确识别日期格式,可能需要在 `app.py` 的 `process_file` 方法中添加更多的日期解析逻辑,支持不同的日期格式。 | |||
| ## 维护和扩展 | |||
| ### 添加新功能 | |||
| 如需添加新功能,请考虑以下几点: | |||
| 1. 尽量将配置参数放在 `config.py` 文件中 | |||
| 2. 保持用户界面简洁直观 | |||
| 3. 添加适当的错误处理和用户反馈 | |||
| ### 代码维护 | |||
| - 定期更新依赖包版本 | |||
| - 如果更改了核心功能,请更新文档 | |||
| - 考虑添加单元测试以确保功能正常 | |||
| ## 联系与支持 | |||
| 如有问题或需要支持,请联系项目维护者。 | |||
| @@ -0,0 +1,85 @@ | |||
| # 工资明细转换工具 | |||
| 这是一个用于批量转换Excel工资明细表的图形界面工具。 | |||
| ## 功能特点 | |||
| 1. 批量导入Excel文件并根据模板进行转换 | |||
| 2. 自定义设置每个文件的公司、银行和其他信息 | |||
| 3. 按照指定的单元格映射规则转换数据 | |||
| 4. 自动生成包含员工姓名和日期的输出文件名 | |||
| 5. 支持复制和保留原始Excel的格式和样式 | |||
| ## 环境要求 | |||
| - Python 3.7 或更高版本 (注:由于兼容性限制,不支持Python 3.2) | |||
| - 依赖包:pandas, openpyxl, xlrd, xlwt | |||
| ## 关于Python 3.2兼容性说明 | |||
| 由于以下原因,此工具不支持Python 3.2: | |||
| 1. pandas 库需要 Python 3.7 或更高版本 | |||
| 2. openpyxl 对Python 3.2 的支持有限 | |||
| 3. tkinter 在 Python 3.2 中存在的一些兼容性问题 | |||
| 建议使用Python 3.7或更高版本运行此工具。 | |||
| ## 安装说明 | |||
| 1. 确保已安装Python环境(3.7或更高版本) | |||
| 2. 使用uv创建虚拟环境: | |||
| ```bash | |||
| uv venv | |||
| ``` | |||
| 3. 激活虚拟环境: | |||
| ```bash | |||
| # Windows | |||
| .venv\Scripts\activate | |||
| # macOS/Linux | |||
| source .venv/bin/activate | |||
| ``` | |||
| 4. 安装依赖包: | |||
| ```bash | |||
| uv pip install -r requirements.txt | |||
| ``` | |||
| ## 使用方法 | |||
| 1. 运行程序 (有多种方式): | |||
| ```bash | |||
| # 方法1: 直接运行Python脚本 | |||
| python main.py | |||
| # 方法2: 使用批处理文件 (Windows) | |||
| run.bat | |||
| ``` | |||
| 2. 在界面上点击"选择Excel文件"按钮选择要转换的Excel文件 | |||
| 3. 双击列表中的每个文件,设置公司信息(C2)、银行信息(B30)和其他信息(F2) | |||
| 4. 点击"选择导出位置"按钮选择输出文件保存位置 | |||
| 5. 点击"开始转换"按钮进行批量转换 | |||
| 6. 转换完成后会显示成功转换的文件数量 | |||
| ## 文件命名规则 | |||
| 输出文件名格式为:`YYYY年M月份給料明細書-姓名.xls` | |||
| - 年份(YYYY):从输入文件第二个Sheet页的B4单元格中提取 | |||
| - 月份(M):从输入文件第二个Sheet页的B4单元格中提取 | |||
| - 姓名:从输入文件第一个Sheet页的C3单元格中提取 | |||
| ## 单元格映射规则 | |||
| 导入文件的第一个Sheet页映射到导出文件的第一个Sheet页: | |||
| - C3 → E2 | |||
| - D3 → E3 | |||
| - B3 → C3 | |||
| 导入文件的第二个Sheet页完整复制到导出文件的第二个Sheet页,并命名为"M月勤怠一覧" | |||
| ## 自定义配置 | |||
| 工具的配置参数可在 `config.py` 文件中修改,包括: | |||
| - 模板文件路径 | |||
| - 单元格映射关系 | |||
| - 公司和银行选项 | |||
| - 输出文件名格式 | |||
| @@ -0,0 +1,86 @@ | |||
| [ | |||
| { | |||
| "employee_name": "杜云", | |||
| "bank_name": "ゆうちょ銀行", | |||
| "branch_account": "一三八(普通)2192640", | |||
| "account_holder": "杜云 ト ウン" | |||
| }, | |||
| { | |||
| "employee_name": "範慶博", | |||
| "bank_name": "三井住友銀行", | |||
| "branch_account": "新宿通支店661(普通)8324403", | |||
| "account_holder": "範慶博 ハン ケイハク" | |||
| }, | |||
| { | |||
| "employee_name": "龚丽犀", | |||
| "bank_name": "三井住友銀行", | |||
| "branch_account": "武蔵関支店(普通)6992252", | |||
| "account_holder": "龚丽犀 キヨウ レイサイ" | |||
| }, | |||
| { | |||
| "employee_name": "劉紅軍", | |||
| "bank_name": "三菱UFJ銀行", | |||
| "branch_account": "西川口支店(289)(普通)1409435", | |||
| "account_holder": "劉紅軍 リュウ コウグン" | |||
| }, | |||
| { | |||
| "employee_name": "欧阳冠英", | |||
| "bank_name": "楽天銀行", | |||
| "branch_account": "〇五八(普通)9357044", | |||
| "account_holder": "欧阳 冠英 オウヤン グアンイン" | |||
| }, | |||
| { | |||
| "employee_name": "孙文岱", | |||
| "bank_name": "ゆうちょ銀行", | |||
| "branch_account": "一三八店(普通)1280916", | |||
| "account_holder": "孙文岱 ソン ブンタイ" | |||
| }, | |||
| { | |||
| "employee_name": "王磊", | |||
| "bank_name": "三井住友銀行", | |||
| "branch_account": "町屋支店(228)(普通)6919966", | |||
| "account_holder": "王磊 オウ ライ" | |||
| }, | |||
| { | |||
| "employee_name": "魏强", | |||
| "bank_name": "ゆうちょ銀行", | |||
| "branch_account": "〇一八(普通)8654986", | |||
| "account_holder": "魏强 ギ キョウ" | |||
| }, | |||
| { | |||
| "employee_name": "吴桐宇", | |||
| "bank_name": "三菱UFJ銀行", | |||
| "branch_account": "心斎橋支店(031)(普通)0391875", | |||
| "account_holder": "吴桐宇 ゴ トンウ" | |||
| }, | |||
| { | |||
| "employee_name": "朱文娟", | |||
| "bank_name": "楽天銀行", | |||
| "branch_account": "フーガ支店(220)(普通)1943194", | |||
| "account_holder": "朱文娟 シュ ブンケン" | |||
| }, | |||
| { | |||
| "employee_name": "查干", | |||
| "bank_name": "りそな銀行", | |||
| "branch_account": "竹ノ塚支店(605)(普通) 4978660", | |||
| "account_holder": "査干 チャ カン" | |||
| }, | |||
| { | |||
| "employee_name": "徐芮", | |||
| "bank_name": "三菱東京UFJ銀行", | |||
| "branch_account": "(普通)0314135", | |||
| "account_holder": "徐芮 ジョ リ" | |||
| }, | |||
| { | |||
| "employee_name": "郑博", | |||
| "bank_name": "三井住友銀行", | |||
| "branch_account": "白山支店(228)(普通)6836322", | |||
| "account_holder": "鄭博 テイ ハク" | |||
| }, | |||
| { | |||
| "employee_name": "周喻", | |||
| "bank_name": "三菱UFJ銀行", | |||
| "branch_account": "日暮里之店(180)(普通)0281831", | |||
| "account_holder": "周喻 シュウ ユ" | |||
| } | |||
| ] | |||
| @@ -0,0 +1 @@ | |||
| [] | |||
| @@ -0,0 +1,160 @@ | |||
| # Excel 转换工具配置文件 | |||
| import os | |||
| import json | |||
| # 模板文件路径 | |||
| TEMPLATE_PATH = "template.xlsx" | |||
| # 配置文件路径 | |||
| CONFIG_DIR = os.path.dirname(os.path.abspath(__file__)) | |||
| EMPLOYEE_CONFIG_PATH = os.path.join(CONFIG_DIR, "employee_info.json") | |||
| COMPANY_CONFIG_PATH = os.path.join(CONFIG_DIR, "company_options.json") # 保留兼容性 | |||
| BANK_CONFIG_PATH = os.path.join(CONFIG_DIR, "bank_options.json") # 保留兼容性 | |||
| # 单元格映射关系(源文件位置 -> 目标文件位置) | |||
| # 格式:{(源文件sheet索引, 行, 列): (目标文件sheet索引, 行, 列)} | |||
| CELL_MAPPINGS = { | |||
| # 第一个Sheet的映射关系 | |||
| (0, 3, 3): (0, 2, 5), # C3 -> E2 氏名 | |||
| (0, 3, 4): (0, 3, 5), # D3 -> E3 労働日数 | |||
| (0, 3, 2): (0, 3, 3), # B3 -> C3 ID | |||
| (0, 3, 5): (0, 6, 4), # E3 -> D6 基本給 | |||
| (0, 3, 6): (0, 7, 4), # F3 -> D7 職務給 | |||
| (0, 3, 7): (0, 8, 4), # G3 -> D8 資格手当 | |||
| (0, 3, 8): (0, 9, 4), # H3 -> D9 住宅手当 | |||
| (0, 3, 9): (0, 10, 4), # I3 -> D10 能力手当 | |||
| (0, 3, 10): (0, 11, 4), # J3 -> D11 通勤手当 | |||
| (0, 3, 11): (0, 12, 4), # K3 -> D12 残業(固定) | |||
| (0, 3, 12): (0, 13, 4), # L3 -> D13 | |||
| (0, 3, 13): (0, 14, 4), # M3 -> D14 | |||
| (0, 3, 15): (0, 17, 4), # O3 -> D17 | |||
| (0, 3, 16): (0, 18, 4), # P3 -> D18 | |||
| (0, 3, 17): (0, 19, 4), # Q3 -> D19 | |||
| (0, 3, 18): (0, 20, 4), # R3 -> D20 | |||
| (0, 3, 19): (0, 21, 4), # S3 -> D21 | |||
| (0, 3, 20): (0, 22, 4), # T3 -> D22 | |||
| (0, 3, 25): (0, 25, 5), # Y3 -> E25 | |||
| } | |||
| # 自定义值的单元格位置 | |||
| CUSTOM_CELLS = { | |||
| "company": (0, 2, 3), # C2 - 所属公司 | |||
| "bank": (0, 29, 2), # B29 - 转账银行 | |||
| "other": (0, 2, 6), # F2 - 其他信息 | |||
| } | |||
| # 文件名提取信息 | |||
| FILENAME_CONFIG = { | |||
| "name_cell": (0, 3, 3), # Sheet1 的 C3 - 员工姓名 | |||
| "year_month_cell": (1, 4, 2), # Sheet2 的 B4 - 年月信息 | |||
| } | |||
| # 第二个Sheet的命名格式 | |||
| SHEET2_NAME_FORMAT = "{month}月勤怠一覧" | |||
| # 输出文件名格式 | |||
| OUTPUT_FILENAME_FORMAT = "{year}年{month}月份給料明細書-{name}.xlsx" | |||
| # 默认选项列表(仅在配置文件不存在时使用) | |||
| DEFAULT_COMPANY_OPTIONS = [] | |||
| # 银行信息默认结构 - 扩展为字典格式,包含更多字段 | |||
| DEFAULT_BANK_OPTIONS = [ | |||
| # 银行信息示例: | |||
| # { | |||
| # "employee_name": "田中太郎", # 员工姓名 | |||
| # "bank_name": "三井住友銀行", # 银行名称 | |||
| # "branch_account": "新宿通支店661 普通 8324403", # 支店和账号 | |||
| # "account_holder": "田中太郎" # 账户持有人 | |||
| # } | |||
| ] | |||
| # 员工信息默认结构 - 合并公司和银行信息 | |||
| DEFAULT_EMPLOYEE_INFO = [ | |||
| # 员工信息示例: | |||
| # { | |||
| # "employee_name": "田中太郎", # 员工姓名 | |||
| # "bank_name": "三井住友銀行", # 银行名称 | |||
| # "branch_account": "新宿通支店661 普通 8324403", # 支店和账号 | |||
| # "account_holder": "田中太郎", # 账户持有人 | |||
| # "company_name": "SPD株式会社" # 所属公司 | |||
| # } | |||
| ] | |||
| # 加载员工信息 | |||
| def load_employee_info(): | |||
| # 检查是否存在员工信息配置 | |||
| if os.path.exists(EMPLOYEE_CONFIG_PATH): | |||
| try: | |||
| with open(EMPLOYEE_CONFIG_PATH, 'r', encoding='utf-8') as f: | |||
| employee_info = json.load(f) | |||
| except Exception as e: | |||
| print(f"加载员工信息出错: {e}") | |||
| employee_info = DEFAULT_EMPLOYEE_INFO | |||
| else: | |||
| # 如果不存在,尝试从旧的配置中导入 | |||
| employee_info = [] | |||
| company_options = [] | |||
| bank_options = [] | |||
| # 加载旧的公司配置 | |||
| if os.path.exists(COMPANY_CONFIG_PATH): | |||
| try: | |||
| with open(COMPANY_CONFIG_PATH, 'r', encoding='utf-8') as f: | |||
| company_options = json.load(f) | |||
| except Exception as e: | |||
| print(f"加载公司配置出错: {e}") | |||
| # 加载旧的银行配置 | |||
| if os.path.exists(BANK_CONFIG_PATH): | |||
| try: | |||
| with open(BANK_CONFIG_PATH, 'r', encoding='utf-8') as f: | |||
| bank_options = json.load(f) | |||
| # 兼容旧版本:如果是字符串列表,转换为字典 | |||
| if bank_options and isinstance(bank_options[0], str): | |||
| new_bank_options = [] | |||
| for bank_name in bank_options: | |||
| new_bank_options.append({ | |||
| "employee_name": "", | |||
| "bank_name": bank_name, | |||
| "branch_account": "", | |||
| "account_holder": "" | |||
| }) | |||
| bank_options = new_bank_options | |||
| except Exception as e: | |||
| print(f"加载银行配置出错: {e}") | |||
| # 合并旧配置 | |||
| if bank_options and isinstance(bank_options[0], dict): | |||
| for bank_option in bank_options: | |||
| employee_name = bank_option.get("employee_name", "") | |||
| if employee_name: # 如果有员工姓名,则添加为一条记录 | |||
| employee_info.append({ | |||
| "employee_name": employee_name, | |||
| "bank_name": bank_option.get("bank_name", ""), | |||
| "branch_account": bank_option.get("branch_account", ""), | |||
| "account_holder": bank_option.get("account_holder", ""), | |||
| "company_name": company_options[0] if company_options else "" | |||
| }) | |||
| # 保存新的员工信息 | |||
| save_options(EMPLOYEE_CONFIG_PATH, employee_info) | |||
| return employee_info | |||
| # 保存选项 | |||
| def save_options(config_path, options): | |||
| try: | |||
| with open(config_path, 'w', encoding='utf-8') as f: | |||
| json.dump(options, f, ensure_ascii=False, indent=4) | |||
| return True | |||
| except Exception as e: | |||
| print(f"保存配置出错: {e}") | |||
| return False | |||
| # 加载选项 | |||
| EMPLOYEE_INFO = load_employee_info() | |||
| COMPANY_OPTIONS = [info.get("company_name") for info in EMPLOYEE_INFO if info.get("company_name")] | |||
| COMPANY_OPTIONS = list(set(COMPANY_OPTIONS)) # 去重 | |||
| BANK_OPTIONS = [info for info in EMPLOYEE_INFO] # 兼容性:旧代码可能仍使用BANK_OPTIONS | |||
| @@ -0,0 +1,156 @@ | |||
| [ | |||
| { | |||
| "employee_name": "杜云", | |||
| "bank_name": "ゆうちょ銀行", | |||
| "branch_account": "一三八(普通)2192640", | |||
| "account_holder": "杜云 ト ウン", | |||
| "company_name": "SPD株式会社" | |||
| }, | |||
| { | |||
| "employee_name": "範慶博", | |||
| "company_name": "開元株式会社", | |||
| "bank_name": "三井住友銀行", | |||
| "branch_account": "新宿通支店661(普通)8324403", | |||
| "account_holder": "範慶博 ハン ケイハク" | |||
| }, | |||
| { | |||
| "employee_name": "龚丽犀", | |||
| "bank_name": "三井住友銀行", | |||
| "branch_account": "武蔵関支店(普通)6992252", | |||
| "account_holder": "龚丽犀 キヨウ レイサイ", | |||
| "company_name": "SPD株式会社" | |||
| }, | |||
| { | |||
| "employee_name": "劉紅軍", | |||
| "bank_name": "三菱UFJ銀行", | |||
| "branch_account": "西川口支店(289)(普通)1409435", | |||
| "account_holder": "劉紅軍 リュウ コウグン", | |||
| "company_name": "SPD株式会社" | |||
| }, | |||
| { | |||
| "employee_name": "欧阳冠英", | |||
| "bank_name": "楽天銀行", | |||
| "branch_account": "〇五八(普通)9357044", | |||
| "account_holder": "欧阳 冠英 オウヤン グアンイン", | |||
| "company_name": "SPD株式会社" | |||
| }, | |||
| { | |||
| "employee_name": "孙文岱", | |||
| "bank_name": "ゆうちょ銀行", | |||
| "branch_account": "一三八店(普通)1280916", | |||
| "account_holder": "孙文岱 ソン ブンタイ", | |||
| "company_name": "SPD株式会社" | |||
| }, | |||
| { | |||
| "employee_name": "王磊", | |||
| "bank_name": "三井住友銀行", | |||
| "branch_account": "町屋支店(228)(普通)6919966", | |||
| "account_holder": "王磊 オウ ライ", | |||
| "company_name": "SPD株式会社" | |||
| }, | |||
| { | |||
| "employee_name": "魏强", | |||
| "bank_name": "ゆうちょ銀行", | |||
| "branch_account": "〇一八(普通)8654986", | |||
| "account_holder": "魏强 ギ キョウ", | |||
| "company_name": "SPD株式会社" | |||
| }, | |||
| { | |||
| "employee_name": "吴桐宇", | |||
| "bank_name": "三菱UFJ銀行", | |||
| "branch_account": "心斎橋支店(031)(普通)0391875", | |||
| "account_holder": "吴桐宇 ゴ トンウ", | |||
| "company_name": "SPD株式会社" | |||
| }, | |||
| { | |||
| "employee_name": "朱文娟", | |||
| "bank_name": "楽天銀行", | |||
| "branch_account": "フーガ支店(220)(普通)1943194", | |||
| "account_holder": "朱文娟 シュ ブンケン", | |||
| "company_name": "SPD株式会社" | |||
| }, | |||
| { | |||
| "employee_name": "查干", | |||
| "company_name": "嘉年華株式会社", | |||
| "bank_name": "りそな銀行", | |||
| "branch_account": "竹ノ塚支店(605)(普通) 4978660", | |||
| "account_holder": "査干 チャ カン" | |||
| }, | |||
| { | |||
| "employee_name": "徐芮", | |||
| "bank_name": "三菱東京UFJ銀行", | |||
| "branch_account": "(普通)0314135", | |||
| "account_holder": "徐芮 ジョ リ", | |||
| "company_name": "SPD株式会社" | |||
| }, | |||
| { | |||
| "employee_name": "郑博", | |||
| "bank_name": "三井住友銀行", | |||
| "branch_account": "白山支店(228)(普通)6836322", | |||
| "account_holder": "鄭博 テイ ハク", | |||
| "company_name": "SPD株式会社" | |||
| }, | |||
| { | |||
| "employee_name": "周喻", | |||
| "company_name": "嘉年華株式会社", | |||
| "bank_name": "三菱UFJ銀行", | |||
| "branch_account": "日暮里之店(180)(普通)0281831", | |||
| "account_holder": "周喻 シュウ ユ" | |||
| }, | |||
| { | |||
| "employee_name": "呉恵宜", | |||
| "company_name": "嘉年華株式会社", | |||
| "bank_name": "", | |||
| "branch_account": "", | |||
| "account_holder": "" | |||
| }, | |||
| { | |||
| "employee_name": "西本真衣", | |||
| "company_name": "嘉年華株式会社", | |||
| "bank_name": "", | |||
| "branch_account": "", | |||
| "account_holder": "" | |||
| }, | |||
| { | |||
| "employee_name": "柳顺子", | |||
| "company_name": "嘉年華株式会社", | |||
| "bank_name": "", | |||
| "branch_account": "", | |||
| "account_holder": "" | |||
| }, | |||
| { | |||
| "employee_name": "宓存行", | |||
| "company_name": "嘉年華株式会社", | |||
| "bank_name": "", | |||
| "branch_account": "", | |||
| "account_holder": "" | |||
| }, | |||
| { | |||
| "employee_name": "盖雪梅", | |||
| "company_name": "嘉年華株式会社", | |||
| "bank_name": "", | |||
| "branch_account": "", | |||
| "account_holder": "" | |||
| }, | |||
| { | |||
| "employee_name": "王玥倩", | |||
| "company_name": "嘉年華株式会社", | |||
| "bank_name": "", | |||
| "branch_account": "", | |||
| "account_holder": "" | |||
| }, | |||
| { | |||
| "employee_name": "周锋", | |||
| "company_name": "嘉年華株式会社", | |||
| "bank_name": "", | |||
| "branch_account": "", | |||
| "account_holder": "" | |||
| }, | |||
| { | |||
| "employee_name": "西本智子", | |||
| "company_name": "SPD株式会社", | |||
| "bank_name": "", | |||
| "branch_account": "", | |||
| "account_holder": "" | |||
| } | |||
| ] | |||
| @@ -0,0 +1,36 @@ | |||
| import os | |||
| import sys | |||
| import tkinter as tk | |||
| from app import ExcelConverterApp | |||
| import openpyxl | |||
| from copy import copy | |||
| def main(): | |||
| """ | |||
| Main entry point for the Excel Converter application. | |||
| """ | |||
| # Create the main window | |||
| root = tk.Tk() | |||
| root.title("日本工资明细转换工具") | |||
| # Set window icon if available | |||
| if os.path.exists("icon.ico"): | |||
| root.iconbitmap("icon.ico") | |||
| # Create and run the application | |||
| app = ExcelConverterApp(root) | |||
| # Center window on screen | |||
| window_width = 800 | |||
| window_height = 600 | |||
| screen_width = root.winfo_screenwidth() | |||
| screen_height = root.winfo_screenheight() | |||
| x = (screen_width - window_width) // 2 | |||
| y = (screen_height - window_height) // 2 | |||
| root.geometry(f"{window_width}x{window_height}+{x}+{y}") | |||
| # Run the application | |||
| root.mainloop() | |||
| if __name__ == "__main__": | |||
| main() | |||
| @@ -0,0 +1,4 @@ | |||
| pandas>=1.3.0 | |||
| openpyxl>=3.0.7 | |||
| xlrd==1.2.0 | |||
| xlwt>=1.3.0 | |||
| @@ -0,0 +1,4 @@ | |||
| @echo off | |||
| echo 启动工资明细转换工具... | |||
| python app.py | |||
| pause | |||
| @@ -0,0 +1,14 @@ | |||
| # 测试数据说明 | |||
| 此文件夹用于存放测试用的Excel文件。 | |||
| 测试数据要求: | |||
| 1. Excel文件需要有至少2个Sheet页 | |||
| 2. 第一个Sheet页需要包含以下单元格: | |||
| - B3: 员工编号 | |||
| - C3: 员工姓名 | |||
| - D3: 员工部门 | |||
| 3. 第二个Sheet页需要包含以下单元格: | |||
| - B4: 日期(包含年月信息) | |||
| 可以准备多个不同的测试数据文件进行批量转换测试。 | |||
| @@ -0,0 +1,63 @@ | |||
| # Excel文件格式说明 | |||
| ## 输入文件格式 | |||
| 输入的Excel文件应包含至少2个Sheet页,格式如下: | |||
| ### Sheet1 (员工信息) | |||
| | A | B | C | D | E | F | | |||
| |---|---|---|---|---|---| | |||
| | 1 | | | | | | | |||
| | 2 | | | | | | | |||
| | 3 | | 员工编号 | 员工姓名 | 员工部门 | | | |||
| | 4 | | | | | | | |||
| 重要单元格: | |||
| - B3: 员工编号 (会映射到输出文件的C3) | |||
| - C3: 员工姓名 (会映射到输出文件的E2,并用于生成文件名) | |||
| - D3: 员工部门 (会映射到输出文件的E3) | |||
| ### Sheet2 (考勤信息) | |||
| | A | B | C | D | E | F | | |||
| |---|---|---|---|---|---| | |||
| | 1 | | | | | | | |||
| | 2 | | | | | | | |||
| | 3 | | | | | | | |||
| | 4 | | 2024年3月1日 | | | | | |||
| | 5 | | | | | | | |||
| 重要单元格: | |||
| - B4: 日期 (格式为"YYYY年M月D日"),从中提取年月用于文件命名 | |||
| 整个Sheet2会完整复制到输出文件的第二个Sheet页,并重命名为"M月勤怠一覧"。 | |||
| ## 输出文件格式 | |||
| 输出文件基于模板文件(template.xls)生成,包含以下主要字段: | |||
| ### Sheet1 (工资明细) | |||
| | A | B | C | D | E | F | | |||
| |---|---|---|---|---|---| | |||
| | 1 | | | | | | | |||
| | 2 | | | 所属公司 | | 员工姓名 | 其他信息 | | |||
| | 3 | | | 员工编号 | | 员工部门 | | | |||
| | ... | | | | | | | |||
| | 30 | | 转账银行 | | | | | |||
| 自定义字段: | |||
| - C2: 所属公司 (从UI界面选择) | |||
| - B30: 转账银行 (从UI界面选择) | |||
| - F2: 其他信息 (从UI界面输入) | |||
| ### Sheet2 (M月勤怠一覧) | |||
| 这个Sheet页是从输入文件的Sheet2完整复制而来,保留所有内容和格式。 | |||
| ## 文件命名规则 | |||
| 输出文件名格式:`YYYY年M月份給料明細書-姓名.xls` | |||
| 例如:`2024年3月份給料明細書-範慶博.xls` | |||