一、问题描述
最近遇到一个把Excel表中两列单元格中的文本读取,然后翻译,再重新回填到单元格中的案例。大约有700多行,1400多个句子,一个个手动复制粘贴要花费不少时间,而且极易出错。这时,我们就可以请出批量Excel的工具Python,利用Python读取两列中非空单元格,调用小牛机器翻译的API,然后把例句翻译后,与原文分两段排列,有效解决了手工复制慢的问题。
样例
二、解决过程
1. 前期准备,申请小牛API
要申请小牛机器翻译的api,拿到它的样例代码,如果你还不太熟练这个过程,可以参考我以前的文章:
2. 分析任务,确保效果
有了api,下一步是分析一下这个Excel表,发现要翻译的是E列和F列,所以我们就可以设置从E列和F列的第三行开始读取,然后翻译,遇到空的单元格就跳过。由于小牛翻译每天给20万字符的翻译,而且QPS可以达到5,也就是一秒可以调用五次,因次是非常适合python调用的。
3. 明晰步骤,编写代码
于是,我们就撰写出下面的代码:
import requests
from openpyxl import load_workbook
from urllib import parse,request
# 翻译函数
apikey="xiaoniu_api_key" #把你的小牛翻译api贴到这里
def translate_txt(sentence):
url = 'http://api.niutrans.com/NiuTransServer/translation?'
data = {"from": "en", "to": 'zh', "apikey": apikey, "src_text": sentence}
data_en = parse.urlencode(data)
req = url + "&" + data_en
res = request.urlopen(req)
res_dict = json.loads(res.read())
if "tgt_text" in res_dict:
result = res_dict['tgt_text']
else:
result = res
return result
# 读取Excel文件并进行翻译
def translate_excel(file_path):
# 加载工作簿
wb = load_workbook(file_path)
ws = wb.active # 获取当前活动的工作表
# 从E3和F3开始读取
row = 3
while True:
e_cell = ws[f'E{row}']
f_cell = ws[f'F{row}']
# 如果E列和F列的单元格都为空,结束循环
if not e_cell.value and not f_cell.value:
break
# 翻译非空的E列和F列
if e_cell.value:
e_cell.value = e_cell.value+ "\n"+ translate_txt(e_cell.value)
if f_cell.value:
f_cell.value = f_cell.value + "\n" + translate_txt(f_cell.value)
row += 1
# 保存修改后的Excel文件
wb.save('translated_file.xlsx')
print("翻译完成,已保存为 'translated_file_外研版 语境版单词表xlsx(1) - 副本.xlsx'")
try:
translate_excel('外研版 语境版单词表xlsx(1) - 副本.xlsx')
except Exception as exc:
print(exc)
经过测试,翻译的效果还不错,1400个单元格大约用了不到五分钟就完成了任务,而且全过程无人职守,出去吃个水果,回来工作就已经完成了。
三、学后总结
1. 在日常工作和办公中,如果是批量的、重复性的工作可以想办法用python来解决,节省人才和物力,提高办公的效率。
2. 使用Python时,一定要明确目标和方法,分析问题确定解决步骤,会借助常用的python模块解决现实问题,这样学Python就会感觉非常有成就感。