python脚本:Excel文件生成中英对照翻译

python脚本:Excel文件生成中英对照翻译

概述

这是一个用于将Excel文件中的中文内容自动翻译成英文,并在原单元格内添加英文对照的python脚本。该工具使用百度翻译API进行翻译,支持批量处理多个工作表,并保持Excel文件的原始格式。

主要特点:

  • 在单元格内直接添加英文翻译,保持原有格式
  • 自动处理合并单元格
  • 智能处理API访问频率限制
  • 实时显示翻译进度
  • 支持断点续传(每翻译一个单元格自动保存)

思路介绍

  1. 文件处理流程

    • 读取原始Excel文件
    • 遍历每个工作表
    • 处理每个单元格的内容
    • 保存翻译结果
  2. 翻译处理

    • 使用百度翻译API进行翻译
    • 实现智能重试机制
    • 控制API访问频率
  3. 格式保持

    • 保留原始单元格格式
    • 设置自动换行
    • 保持对齐方式
  4. 错误处理

    • 处理API访问限制
    • 处理网络错误
    • 处理格式错误

代码实现

1. 环境准备

首先需要安装必要的Python包:

pip install pandas openpyxl requests

2. 获取百度翻译API密钥

  1. 访问百度翻译开放平台
  2. 注册开发者账号
  3. 创建应用获取APP ID和密钥

3. 代码实现

import pandas as pd
import time
import requests
import hashlib
import random
from openpyxl import load_workbook
from openpyxl.utils.dataframe import dataframe_to_rows
from copy import copy
from datetime import datetime
from openpyxl.styles import Alignment

class BaiduTranslator:
    def __init__(self, appid, secret_key):
        self.appid = appid
        self.secret_key = secret_key
        self.url = 'https://fanyi-api.baidu.com/api/trans/vip/translate'
        self.total_chars = 0  # 记录总翻译字符数
        self.last_request_time = 0  # 记录上次请求时间
        self.min_interval = 1.1  # 最小请求间隔(秒)
        
    def translate(self, text, max_retries=5):
        for retry in range(max_retries):
            try:
                # 确保请求间隔
                current_time = time.time()
                time_since_last_request = current_time - self.last_request_time
                if time_since_last_request < self.min_interval:
                    time.sleep(self.min_interval - time_since_last_request)
                
                salt = str(random.randint(32768, 65536))
                sign = self.appid + text + salt + self.secret_key
                sign = hashlib.md5(sign.encode()).hexdigest()
                
                params = {
                    'q': text,
                    'from': 'zh',
                    'to': 'en',
                    'appid': self.appid,
                    'salt': salt,
                    'sign': sign
                }
                
                self.last_request_time = time.time()
                response = requests.get(self.url, params=params)
                result = response.json()
                
                if 'trans_result' in result:
                    self.total_chars += len(text)  # 更新总字符数
                    return result['trans_result'][0]['dst']
                elif 'error_code' in result and result['error_code'] == '54003':
                    # 如果是访问频率限制错误,使用指数退避策略
                    wait_time = min(2 ** retry, 30)  # 最大等待30秒
                    print(f"访问频率限制,等待 {wait_time} 秒后重试... (第{retry + 1}次重试)")
                    time.sleep(wait_time)
                    continue
                else:
                    print(f"翻译错误: {result}")
                    return text
                    
            except Exception as e:
                print(f"请求错误: {str(e)}")
                if retry < max_retries - 1:
                    time.sleep(2 ** retry)  # 使用指数退避策略
                    continue
                return text
        
        return text

def translate_text(text, translator):
    if pd.isna(text) or not isinstance(text, str):
        return text
    
    # 如果文本为空或只包含空白字符,直接返回
    if not text.strip():
        return text
        
    try:
        result = translator.translate(text)
        return result  # 返回英文翻译
    except Exception as e:
        print(f"翻译出错: {str(e)}")
        return text

def set_cell_alignment(cell):
    """设置单元格对齐方式"""
    # 创建新的对齐对象
    alignment = Alignment(
        horizontal='left',
        vertical='center',
        wrap_text=True
    )
    cell.alignment = alignment

def main():
    # 读取Excel文件
    input_file = "your_input_file.xlsx"  # 替换为您的输入文件名
    output_file = "your_output_file.xlsx"  # 替换为您的输出文件名
    
    try:
        start_time = time.time()
        print(f"开始处理时间: {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}")
        
        # 读取原始工作簿以保留格式
        wb = load_workbook(input_file)
        
        # 请替换为您的百度翻译API密钥
        appid = "your_app_id"  # 替换为您的APP ID
        secret_key = "your_secret_key"  # 替换为您的密钥
        translator = BaiduTranslator(appid, secret_key)
        
        # 处理每个sheet
        total_sheets = len(wb.sheetnames)
        for sheet_index, sheet_name in enumerate(wb.sheetnames, 1):
            print(f"\n处理工作表 [{sheet_index}/{total_sheets}]: {sheet_name}")
            
            # 读取原始sheet
            sheet = wb[sheet_name]
            
            # 获取原始表格的列数和行数
            max_col = sheet.max_column
            max_row = sheet.max_row
            total_cells = max_col * max_row
            processed_cells = 0
            
            print(f"表格大小: {max_row}行 x {max_col}列")
            
            # 处理每个单元格
            for row in range(1, max_row + 1):
                for col in range(1, max_col + 1):
                    processed_cells += 1
                    if processed_cells % 10 == 0:  # 每处理10个单元格显示一次进度
                        progress = (processed_cells / total_cells) * 100
                        elapsed_time = time.time() - start_time
                        avg_time_per_cell = elapsed_time / processed_cells
                        remaining_cells = total_cells - processed_cells
                        estimated_remaining_time = remaining_cells * avg_time_per_cell
                        
                        print(f"进度: {progress:.1f}% ({processed_cells}/{total_cells})")
                        print(f"已用时间: {elapsed_time/60:.1f}分钟")
                        print(f"预计剩余时间: {estimated_remaining_time/60:.1f}分钟")
                        print(f"已翻译字符数: {translator.total_chars}")
                    
                    # 获取单元格
                    cell = sheet.cell(row=row, column=col)
                    
                    # 如果是文本内容,进行翻译并添加英文对照
                    if cell.value and isinstance(cell.value, str):
                        original_text = cell.value
                        translated_text = translate_text(original_text, translator)
                        # 在原文下方添加英文翻译
                        cell.value = f"{original_text}\n{translated_text}"
                        # 设置单元格对齐方式
                        set_cell_alignment(cell)
                    
                    # 每翻译一个单元格就保存一次,防止中途失败
                    wb.save(output_file)
            
            print(f"完成工作表: {sheet_name}")
        
        end_time = time.time()
        total_time = end_time - start_time
        print(f"\n转换完成!")
        print(f"总用时: {total_time/60:.1f}分钟")
        print(f"总翻译字符数: {translator.total_chars}")
        print(f"平均速度: {translator.total_chars/total_time:.1f}字符/秒")
        print(f"新文件已保存为: {output_file}")
        
    except Exception as e:
        print(f"处理文件时出错: {str(e)}")

if __name__ == "__main__":
    main()

4. 使用说明

  1. 将代码保存为Python文件(例如:excel_translator.py
  2. 修改以下配置:
    • input_file:输入Excel文件的路径
    • output_file:输出Excel文件的路径
    • appid:您的百度翻译API APP ID
    • secret_key:您的百度翻译API密钥
  3. 运行脚本:
python excel_translator.py

5. 注意事项

  1. 确保Excel文件未被其他程序打开
  2. 建议在处理大文件前先进行小规模测试
  3. 程序会自动处理API访问限制,无需手动干预
  4. 每翻译一个单元格都会自动保存,可以随时中断和继续
  5. 请确保有足够的磁盘空间存储输出文件

6. 常见问题

  1. API访问限制

    • 程序会自动处理访问限制
    • 使用指数退避策略进行重试
    • 最大等待时间为30秒
  2. 格式问题

    • 程序会保持原始格式
    • 自动设置单元格换行
    • 保持左对齐和垂直居中
  3. 性能优化

    • 最小请求间隔为1.1秒
    • 最多重试5次
    • 实时显示进度和预计剩余时间
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值