有朋友问有没有Excel公式可以自动翻译公式中的文本。
找了几个帖子,是用VBA请求翻译网站的API,返回结果。尝试做了一下,发现行不通。这是很久以前的帖子,其中使用的API都废弃了,现在升级为SDK了。要想实现同样的功能得写一些逻辑。平时不怎么用Excel,不确定VBA是否能使用现在的SDK,所以选择了自己熟悉的Python。
下面是Python的安装包下载链接:
Python2 Windows 64位下载
Python2 Windows 32位下载
Python有两个不同的版本,Python2和Python3,这里安装的是Python2。当下人工智能火热,计算机等级考试也添加了这门语言,有省份的Python小学教材都出了。相信大家应该对这个语言也不陌生。
安装教程:
廖雪峰 Python安装
安装选项中的pip和Add python.exe to Path是要选上的。其他的请参考教程。
安装完成后,需要安装几个依赖包。步骤:
- Windows + R 打开运行窗口。
- 输入cmd,回车 打开命令行。
- 输入pip install xlrd,回车 等待结束。
- 输入pip install XlsxWriter,回车 等待结束。
安装结果是英文显示,如果看到Success之类的单词代表安装成功。看到红色显示的单词或者failed代表失败。
找了几个知名翻译网站,大部分都收费,但有些限定单词数量内免费。最终,我选的是百度翻译。每月免费200万字符,一般够用。只是需要注册一个百度翻译开放平台账号。注册过程略过。
下面是功能代码:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
from __future__ import print_function
import math
import re
import sys
import os
import httplib
import md5
import urllib
import random
import json
import xlrd
import xlsxwriter
class Boot(object):
# ============ 只改这里 ====================
APPID = '你的APP ID'
SECRET_KEY = '你的密钥'
FILE_NAME = u'测试.xlsx' # Excel文件名
NEW_FILE_NAME = u'测试-结果.xlsx' # 输出文件
SHEET_NAME = u'测试' # 页名
START_CELL = 'C5' # 开始格子
END_CELL = 'D19' # 结束格子
SRC_LAN = 'jp' # 源语言
DST_LAN = 'zh' # 目标语言
# ============ ~只改这里 ====================
@classmethod
def row_name_2_real_name(cls, row_name):
row_name = row_name.lower()
result = 0
for ch in row_name:
result = result * 26 + (ord(ch) - 96)
return int(result + 0.5)
@classmethod
def view_nam_2_real_name(cls, view_name):
mat = re.match(r'([a-zA-Z]+)(\d+)', view_name)
if not mat:
cls.printu(u'格子号不对!')
sys.exit(1)
row = int(mat.group(2))
column = cls.row_name_2_real_name(mat.group(1))
return (row - 1, column - 1)
@classmethod
def get_cell_value(cls, work_sheet, row, column, tp):
return tp(work_sheet.cell(row, column).value)
@classmethod
def printu(cls, u_text):
if sys.platform == 'win32':
print(u_text.encode('gbk'))
else:
print(u_text.encode('utf-8'))
@classmethod
def translate(cls, src_text):
result = u'【翻译失败】'
salt = random.randint(32768, 65536)
sign = '%s%s%s%s' % (
cls.APPID,
src_text,
salt,
cls.SECRET_KEY
)
m1 = md5.new()
m1.update(sign)
sign = m1.hexdigest()
translate_url = '/api/trans/vip/translate?appid=%s&q=%s&from=%s&to=%s&salt=%s&sign=%s' % (
cls.APPID,
src_text,
cls.SRC_LAN,
cls.DST_LAN,
salt,
sign
)
httpClient = None
try:
httpClient = httplib.HTTPConnection('api.fanyi.baidu.com')
httpClient.request('GET', translate_url)
response = httpClient.getresponse()
ret = json.loads(response.read(), 'utf-8')
if ret and ret['trans_result'] and len(ret['trans_result']) > 0:
result = ret['trans_result'][0]['dst']
except Exception, e:
cls.printu(u"ERROR: 翻译%s失败:%s" % (src_text, e))
finally:
if httpClient:
httpClient.close()
return result
@classmethod
def boot(cls):
excel_file_path = os.path.join(os.path.dirname(os.path.abspath(__file__)), cls.FILE_NAME)
work_book = xlrd.open_workbook(excel_file_path)
work_sheet = work_book.sheet_by_name(cls.SHEET_NAME)
start_row, start_column = cls.view_nam_2_real_name(cls.START_CELL)
end_row, end_column = cls.view_nam_2_real_name(cls.END_CELL)
collector = []
for i in xrange(start_column, end_column + 1):
for j in xrange(start_row, end_row + 1):
src_text = cls.get_cell_value(work_sheet, j, i, unicode)
cls.printu(u"翻译:%s" % src_text)
src_text = src_text.encode('utf-8')
dst_text = cls.translate(src_text)
collector.append(dst_text)
work_book = xlsxwriter.Workbook(os.path.join(os.path.dirname(os.path.abspath(__file__)), cls.NEW_FILE_NAME))
work_sheet = work_book.add_worksheet()
for idx, data in enumerate(collector):
work_sheet.write(idx, 0, data)
work_book.close()
if __name__ == '__main__':
Boot.boot()
复制这段代码到文本文件中,命名为translate.py,保存文件为UTF-8格式。或者从这里下载这个文件。高大上的程序员使用这个:
git clone https://gitee.com/zbChHome/translate.git
文件中“只改这里”标记内为要修改的内容。APP ID和密钥可以在你的百度翻译开放平台-管理控制台的最下面查看。直接替换‘你的APP ID’和‘你的密钥’就行。下面的依次为你要翻译的Excel文件名,输出文件名,页签名,开始格子名,结束格子名,源语言,目标语言。开始格子名和结束格子名标识翻译内容的格子范围,语言列表列在下面:
语言简写 | 名称 |
---|---|
auto | 自动检测 |
zh | 中文 |
en | 英语 |
yue | 粤语 |
wyw | 文言文 |
jp | 日语 |
kor | 韩语 |
fra | 法语 |
spa | 西班牙语 |
th | 泰语 |
ara | 阿拉伯语 |
ru | 俄语 |
pt | 葡萄牙语 |
de | 德语 |
it | 意大利语 |
el | 希腊语 |
nl | 荷兰语 |
pl | 波兰语 |
bul | 保加利亚语 |
est | 爱沙尼亚语 |
dan | 丹麦语 |
fin | 芬兰语 |
cs | 捷克语 |
rom | 罗马尼亚语 |
slo | 斯洛文尼亚语 |
swe | 瑞典语 |
hu | 匈牙利语 |
cht | 繁体中文 |
vie | 越南语 |
修改,保存完毕后,直接双击运行translate.py。等待弹出的黑窗口退出,翻译结果保存在你指定的输出文件中。