python脚本:Excel文件生成中英对照翻译
概述
这是一个用于将Excel文件中的中文内容自动翻译成英文,并在原单元格内添加英文对照的python脚本。该工具使用百度翻译API进行翻译,支持批量处理多个工作表,并保持Excel文件的原始格式。
主要特点:
- 在单元格内直接添加英文翻译,保持原有格式
- 自动处理合并单元格
- 智能处理API访问频率限制
- 实时显示翻译进度
- 支持断点续传(每翻译一个单元格自动保存)
思路介绍
-
文件处理流程
- 读取原始Excel文件
- 遍历每个工作表
- 处理每个单元格的内容
- 保存翻译结果
-
翻译处理
- 使用百度翻译API进行翻译
- 实现智能重试机制
- 控制API访问频率
-
格式保持
- 保留原始单元格格式
- 设置自动换行
- 保持对齐方式
-
错误处理
- 处理API访问限制
- 处理网络错误
- 处理格式错误
代码实现
1. 环境准备
首先需要安装必要的Python包:
pip install pandas openpyxl requests
2. 获取百度翻译API密钥
- 访问百度翻译开放平台
- 注册开发者账号
- 创建应用获取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. 使用说明
- 将代码保存为Python文件(例如:
excel_translator.py
) - 修改以下配置:
input_file
:输入Excel文件的路径output_file
:输出Excel文件的路径appid
:您的百度翻译API APP IDsecret_key
:您的百度翻译API密钥
- 运行脚本:
python excel_translator.py
5. 注意事项
- 确保Excel文件未被其他程序打开
- 建议在处理大文件前先进行小规模测试
- 程序会自动处理API访问限制,无需手动干预
- 每翻译一个单元格都会自动保存,可以随时中断和继续
- 请确保有足够的磁盘空间存储输出文件
6. 常见问题
-
API访问限制
- 程序会自动处理访问限制
- 使用指数退避策略进行重试
- 最大等待时间为30秒
-
格式问题
- 程序会保持原始格式
- 自动设置单元格换行
- 保持左对齐和垂直居中
-
性能优化
- 最小请求间隔为1.1秒
- 最多重试5次
- 实时显示进度和预计剩余时间