基于Python的百度API翻译Excel文档
不需要目录,都是干货
另外我还有word文档翻译,欢迎下载
from openpyxl.reader.excel import load_workbook
from openpyxl.writer.excel import ExcelWriter
import openpyxl
import os
import requests
import json
import getopt
import sys
from tqdm import tqdm
import glob
import codecs
import time
import random
import hashlib
from urllib import parse
import http.client
os.chdir('./')
# 从指定文件路径读取excel文件和Sheet表格
def Get_path():
for file in glob.glob(r'.Source File\*.xlsx'):
load_workbook(file)
print(file+"hello2")
return file #因为Sheet的原因,一次只能翻译一个文件
def Get_table():
return input("请输入需要翻译的表格(Sheet):")
origin_list = []
dest_list = []
def Get_contents( file_path, sheet_index, x_start, y_start, x_end, y_end):
contents = []
try:
wb=load_workbook(file_path)
except:
print("错误:打开文件失败,请检查文件路径是否有误!!!")
sys.exit()
try:
sheet = wb.get_sheet_by_name(sheet_index)
except:
print("错误:打开sheet表格失败,请检查表名是否有误!!!")
sys.exit()
for i in range(x_start, x_end+1):
for j in range(y_start, y_end+1):
try:
if(sheet.cell(i,j).value == None):
contents.append("")
else:
old = sheet.cell(i,j).value
contents.append(old)
except Exception as e:
print('读取时发生错误:' + e)
print(len(contents))
return contents
class BaiduTranslate:
def __init__(self,fromLang,toLang):
self.url = "/api/trans/vip/translate"
self.appid="用你自己的,我的不给" #申请的账号
self.secretKey = '用你自己的,我的不给'#账号密码
self.fromLang = fromLang
self.toLang = toLang
self.salt = random.randint(32768, 65536)
def BdTrans(self,origin_contents):
dst_contents = []
for index in origin_contents:
if(index == "" ):
dst_contents.append("")
continue
else:
spilt_str = index.replace("\n", "+$+")
print(index)
sign = self.appid + spilt_str + str(self.salt) + self.secretKey
md = hashlib.md5()
md.update(sign.encode(encoding='utf-8'))
sign = md.hexdigest()
myurl = self.url + \
'?appid=' + self.appid + \
'&q=' + parse.quote(spilt_str) + \
'&from=' + self.fromLang + \
'&to=' + self.toLang + \
'&salt=' + str(self.salt) + \
'&sign=' + sign
try:
httpClient = http.client.HTTPConnection('api.fanyi.baidu.com')
httpClient.request('GET', myurl)
response = httpClient.getresponse()
html = response.read().decode('utf-8')
html = json.loads(html)
receive_text = html["trans_result"][0]["dst"]
write_text = receive_text.replace("+$+", "\n")
print( write_text )
dst_contents.append( write_text )
except Exception as e:
print('翻译出错,将会默认填入原文本')
return index
time.sleep(1)
return dst_contents
def Write_contents( path, sheet_num,ocontents, contents, x_start, y_start, x_end, y_end):
index = 0
workbook = openpyxl.load_workbook(path) # 打开已存在的excel
#sheet = workbook.createsheet(sheet_num) # 在excel中新建sheet
sheet = workbook.get_sheet_by_name(sheet_num) # 在excel中获取已有sheet
for i in range(x_start, x_end+1):
for j in range(y_start, y_end+1):
try:
if( (origin_start_row == dest_start_row) and (origin_start_col == dest_start_col) ):
sheet.cell(row=i,column= j,value=str(ocontents[index])+'\n'+str(contents[index])) # 后面追加
else:
sheet.cell( row=i,column= j,value=str(contents[index]) )
index+=1
except Exception as e:
print('写入时发生错误:' + e)
workbook.save(path)# 写入excel文件 如果path路径的文件不存在那么就会自动创建
print('写入成功')
if __name__ == '__main__':
path = Get_path()
table = Get_table()
print("如果文本范围相同,则会在原来的文本后添加")
origin_start_row, origin_start_col,origin_end_row, origin_end_col = \
map(int, input("请输入需要翻译的文本范围,数字之间用空格分隔开:").split(" "))
dest_start_row, dest_start_col,dest_end_row, dest_end_col = \
map(int, input("请输入翻译后的存放范围,数字之间用空格分隔开:").split(" "))
origin_list = Get_contents(path, table,\
origin_start_row, origin_start_col, origin_end_row, origin_end_col) #从1开始
BaiduTranslate_test = BaiduTranslate('en','zh')
dest_list = BaiduTranslate_test.BdTrans(origin_list) #百度API接口翻译
Write_contents(path, table, origin_list,dest_list,\
dest_start_row, dest_start_col, dest_end_row, dest_end_col) #从1开始,第几行第几列
print('Translate complete!!!')
os.system('pause')