Excel自动翻译

有朋友问有没有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是要选上的。其他的请参考教程。
安装完成后,需要安装几个依赖包。步骤:

  1. Windows + R 打开运行窗口。
  2. 输入cmd回车 打开命令行。
  3. 输入pip install xlrd回车 等待结束。
  4. 输入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。等待弹出的黑窗口退出,翻译结果保存在你指定的输出文件中。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,133评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,682评论 3 390
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,784评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,508评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,603评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,607评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,604评论 3 415
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,359评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,805评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,121评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,280评论 1 344
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,959评论 5 339
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,588评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,206评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,442评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,193评论 2 367
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,144评论 2 352

推荐阅读更多精彩内容