解决python获取excel指定sheet表中字段的值并发送邮件乱码问题

本文介绍如何使用Python从Excel中读取指定人员的工资信息,并通过邮件自动通知相关人员。具体步骤包括安装xlrd模块、读取Excel文件、定位特定数据并发送邮件。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

                                                     需要用python操作的表

#根据此表结合代码的实现来讲解

#导入需要的模块

xlrd模块是读取excel表的模块,需要手动导入,这里举例pycharm导入模块方法,所有模块导入均可参照此例。

点击file选择setting

选中proje interpreter点击右边有个添加的符号

搜索xlrd模块,点击install package即可

代码如下

import xlrd
import sys
import smtplib
import  string
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText

from datetime import date,datetime

# name1,指定姓名1 name2,指定姓名2,mail_feild指定字段,这里只邮件 wage_feild指定字段,这里指工资
def read_excel(name1,name2,mail_feild,wage_feild):
    # 打开文件,设置编码格式
    workbook = xlrd.open_workbook(rpathxlsx,encoding_override = "utf-8")
    # 获取所有sheet,即一个文件所有的表
    sheet1_name = workbook.sheet_names()[0]
    sheet1 = workbook.sheet_by_index(1)  # sheet索引从0开始
    sheet1= workbook.sheet_by_name(sheet1_name) #获取第一张表名

    nrows = sheet1.nrows #获取该表有效的行数
    ncols = sheet1.ncols #获取该表有效的列数

    #遍历指定列的所有行数,这里遍历第二列names字段的值
    for i in range(0,nrows):
        if sheet1.cell(i,1).value.encode('utf-8') == name1:#找到name1后将此行记录到name_rows中
            name_rows1 = i
        if sheet1.cell(i,1).value.encode('utf-8') == name2:
            name_rows2 = i
    #遍历指定行的所有列数,这里指的是第一行的所有字段
    for j in range(0,ncols):
        if sheet1.cell(0,j).value.encode('utf-8') == mail_feild:#找到“邮件"字段的所处列,utf-8防止获取单元格内容中文乱码
            M_email = sheet1.cell(name_rows1,j).value.encode('utf-8') #将指定的行和对应的列中单元格的内容获取出来,即读出指定名字的邮箱号
            Z_email = sheet1.cell(name_rows2,j).value.encode('utf-8')

            # print M_email,Z_email

        if sheet1.cell(0,j).value.encode('utf-8') == wage_feild: #找到“工资”字段所处列
            M_wage = sheet1.cell(name_rows1,j).value #将指定的行和对应的列中单元格的内容获取出来,即读出指定名字的工资
            Z_wage = sheet1.cell(name_rows2,j).value

            m_wage = str(M_wage)
            z_wage = str(Z_wage)

            # print M_wage,Z_wage
    charbuff = name1 + "的工资是" + m_wage #将获取的工资和名字合并成字符串发送给指定邮箱
    sendEmail("1820047495@qq.com", "trxgcnuupjlwbfch","1820047495@qq.com",M_email,charbuff)

    charbuff = name2 + "的工资是" + z_wage
    sendEmail("1820047495@qq.com", "trxgcnuupjlwbfch","1820047495@qq.com",Z_email,charbuff)

# username 邮箱名, password 授权码, sender 发送者的邮箱,receiver 接收者的邮箱 news,发送的消息
 def sendEmail(username,password,sender,receiver,news):

    #定制发送格式和内容
    msgText = MIMEText(news,_charset = 'utf-8') #解决发送邮件中文乱码
    msgText['Subject'] = '薪酬'
    msgText["To"] = receiver
    msgText["From"] = sender

    #sendEmail
    smtp = smtplib.SMTP_SSL('smtp.qq.com', port=465)
    smtp.login(username, password)
    smtp.sendmail(sender, receiver, msgText.as_string())
    smtp.quit()
    print 'success'

#调用函数
read_excel("Mike","张三","邮件","工资")

###欢迎转载###  https://blog.youkuaiyun.com/righting123/article/details/88897565

<think>根据用户提供的引用内容,特别是引用[1]和引用[2],用户的需求是实现Python自动化输入中文和情符号。引用[1]提到Selenium的send_keys方法不支持直接输入情符号,而引用[2]则介绍了使用emoji库来处理情符号。 因此,解决方案是: 1. 使用Selenium进行自动化输入时,对于情符号,可以借助emoji库将其转换为可输入的字符串。 2. 对于中文,Selenium本身支持,但需要注意编码问题。 具体步骤: - 安装emoji库:`pip install emoji` - 在代码中导入emoji库,使用`emojize`函数将情符号代码(如`:thumbs_up:`)转换为实际的情符号字符。 - 使用Selenium的send_keys方法输入转换后的字符串。 另外,引用[3]提到了换行输出和输入函数,引用[4]提到了字符串处理,引用[5]提到了情包生成,这些可以作为扩展知识。 下面是一个完整的示例代码,演示如何使用Selenium和emoji库在自动化测试中输入中文和情符号:</think># Python自动化输入中文与情符号的解决方案 根据您的需求,我将提供完整的Python自动化输入解决方案,支持中文和情符号输入,特别针对常见自动化场景如Selenium和桌面自动化。 ## 核心问题分析 引用[1]指出Selenium的`send_keys()`方法无法正确处理情符号,而引用[2]展示了使用`emoji`库处理情符号的方法。结合您的需求,解决方案需要: 1. 支持中文文本输入 2. 支持情符号输入 3. 适用于不同自动化场景 4. 处理特殊字符和编码问题 ## 完整解决方案 ### 1. 安装必要库 ```bash pip install selenium pyautogui emoji pyperclip ``` ### 2. 使用Selenium输入中文和情符号 ```python from selenium import webdriver from selenium.webdriver.common.keys import Keys import emoji import time # 初始化浏览器 driver = webdriver.Chrome() driver.get("https://example.com/input-form") # 输入中文文本 text_input = driver.find_element("id", "text-field") text_input.send_keys("你好,世界!这是中文文本测试。") # 输入情符号(使用emoji库转换) emoji_text = emoji.emojize(":smile: :thumbs_up: :heart:") text_input.send_keys(emoji_text) # 另一种方法:通过JavaScript直接设置解决send_keys限制) driver.execute_script("arguments[0].value = arguments[1];", text_input, "直接设置:" + emoji.emojize(":rocket: :star:")) time.sleep(2) driver.quit() ``` ### 3. 桌面自动化输入方案(使用pyautogui) ```python import pyautogui import pyperclip import emoji import time def safe_type(text): """安全输入文本,支持中文和情符号""" # 使用剪贴板处理特殊字符 pyperclip.copy(text) pyautogui.hotkey(&#39;ctrl&#39;, &#39;v&#39;) # Windows/Linux # pyautogui.hotkey(&#39;command&#39;, &#39;v&#39;) # macOS # 准备输入内容 chinese_text = "Python自动化测试:中文输入验证" emojis = emoji.emojize(":smiley: :computer: :globe_showing_Asia-Australia:") print("5秒内切换到输入窗口...") time.sleep(5) # 输入中文 safe_type(chinese_text) pyautogui.press(&#39;enter&#39;) # 输入情符号 safe_type(emojis) pyautogui.press(&#39;enter&#39;) # 组合输入 safe_type(f"混合输入测试 {chinese_text} {emojis}") ``` ### 4. 高级输入处理器(支持所有场景) ```python import pyautogui import pyperclip import emoji import time class TextInputBot: def __init__(self, delay=0.2): self.delay = delay def input_text(self, text): """智能文本输入方法""" # 处理情符号转换 processed_text = emoji.emojize(text) # 使用剪贴板确保编码正确 pyperclip.copy(processed_text) time.sleep(self.delay) # 粘贴内容 pyautogui.hotkey(&#39;ctrl&#39;, &#39;v&#39;) time.sleep(self.delay) def multi_line_input(self, lines): """多行文本输入""" for line in lines: self.input_text(line) pyautogui.press(&#39;enter&#39;) time.sleep(self.delay) # 使用示例 bot = TextInputBot() # 准备内容 content = [ "第一行:中文测试", "第二行:情符号 :thumbs_up: :smile:", "第三行:混合内容 - 你好世界 🌍 Python自动化 🚀" ] print("5秒内切换到输入窗口...") time.sleep(5) bot.multi_line_input(content) ``` ## 关键技术与原理 1. **情符号处理**: - 使用`emoji.emojize()`将代码转换为实际情符号 - 例如`:thumbs_up:` → 👍 - 支持所有标准情符号:[情符号代码](https://www.webfx.com/tools/emoji-cheat-sheet/) 2. **中文编码保证**: ```python # 设置系统编码(Windows可能需要) import sys import io sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding=&#39;utf-8&#39;) ``` 3. **Selenium的特殊情况处理**: ```python # 方法1:使用JavaScript直接设置 driver.execute_script("arguments[0].value = &#39;直接设置内容&#39;;", element) # 方法2:使用ActionChains(适用于复杂场景) from selenium.webdriver.common.action_chains import ActionChains actions = ActionChains(driver) actions.send_keys_to_element(element, "输入内容").perform() ``` 4. **跨平台兼容方案**: ```python import platform def paste_text(): system = platform.system() if system == &#39;Darwin&#39;: # macOS pyautogui.hotkey(&#39;command&#39;, &#39;v&#39;) else: # Windows/Linux pyautogui.hotkey(&#39;ctrl&#39;, &#39;v&#39;) ``` ## 常见问题解决 1. **输入框无法识别情符号**: - 确保目标应用支持Unicode - 使用JavaScript直接设置 - 尝试不同的输入方法组合 2. **中文显示为乱码**: ```python # 在脚本开头添加编码声明 # -*- coding: utf-8 -*- # 或在写入文件时指定编码 with open(&#39;output.txt&#39;, &#39;w&#39;, encoding=&#39;utf-8&#39;) as f: f.write("中文内容") ``` 3. **自动化被检测问题**: ```python # 添加随机延迟和人机交互模式 import random def human_type(text): for char in text: pyautogui.write(char) time.sleep(random.uniform(0.05, 0.2)) ``` ## 实际应用场景 ### 自动化测试脚本 ```python def test_chinese_input(): """自动化测试:中文和情符号输入验证""" input_field = driver.find_element("id", "message-input") test_cases = [ ("纯中文", "你好世界"), ("纯情", ":smile: :heart:"), ("混合输入", "测试消息 👍 验证通过 ✅") ] for case_name, test_data in test_cases: input_field.clear() input_field.send_keys(emoji.emojize(test_data)) input_field.submit() # 验证结果 result = driver.find_element("id", "result-area").text assert emoji.emojize(test_data) in result, \ f"{case_name} 测试失败" ``` ### 批量数据录入工具 ```python def batch_data_entry(data_file): """从文件批量导入数据""" with open(data_file, &#39;r&#39;, encoding=&#39;utf-8&#39;) as f: entries = [line.strip() for line in f.readlines()] bot = TextInputBot() for i, entry in enumerate(entries): print(f"正在输入第 {i+1}/{len(entries)} 条记录") bot.input_text(entry) pyautogui.press(&#39;tab&#39;) # 切换到下一字段 time.sleep(0.3) ``` ## 最佳实践建议 1. **环境隔离**: ```bash # 创建虚拟环境 python -m venv automation_env source automation_env/bin/activate # Linux/macOS automation_env\Scripts\activate # Windows ``` 2. **异常处理**: ```python try: bot.input_text("重要内容") except pyautogui.FailSafeException: print("安全机制触发:鼠标移到屏幕角落") except Exception as e: print(f"输入失败: {str(e)}") # 回退方案 pyperclip.copy("备份方案内容") paste_text() ``` 3. **性能优化**: ```python # 减少pyautogui的默认延迟 pyautogui.PAUSE = 0.05 # 秒 ``` 通过以上方案,您可以可靠地在Python自动化任务中输入中文和情符号,适用于各种应用场景。引用[2]中提到的emoji库是处理情符号的关键[^2],而引用[1]指出的Selenium限制可以通过替代方法解决[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值