pip time string random selenium os IO docx requests Path EasyGui openpyxl CheatSheet Email
        
        pip install -i https://pypi.tuna.tsinghua.edu.cn/simple ?

        #!/usr/bin/env python
        为了防止操作系统用户没有将python装在默认的/usr/bin路径里。
        目的是在运行python脚本的时候告诉操作系统我们要用python解释器去运行py脚本。

        # -*- coding: UTF-8 -*-
        为了告诉Python解释器:此源程序是utf-8编码的,也即告诉python解释器要按照utf-8编码的方式来读取程序。

        https://pypi.org/project/

        安装特定版本的第三方包
        pip install package==version
        #package:包名;version:版本号

        安装模块
        pip install package

        卸载模块
        pip uninstall package

        查看当前环境安装的所有包
        pip list

        显示所安装包的信息
        pip show package

        查看所有可更新的模块
        pip list --outdated

        更新某一个模块
        pip install --upgrade package

        指定更新源更新模块 
        pip install --upgrade -i https://pypi.tuna.tsinghua.edu.cn/simple package

        更新所有的模块
        pip-review --local --interactive
    
        
        import time
        当前时间戳:time.time() 格式为10位整数的浮点数,int取整。
        当前时间戳:round(time.time()*1000) 格式为13位整数
        格式化成年-月-日 时:分:秒形式:time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())

        
        import pyttsx3
        engine = pyttsx3.init()
        engine.setProperty('voice','HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Speech\Voices\Tokens\TTS_MS_ZH-CN_HUIHUI_11.0')
        engine.setProperty('rate', 123)
        engine.say('百度安全验证')
        engine.runAndWait()

    

        import string
        生成所有数字:string.digits
        生成所有大小写字母:string.ascii_letters
        生成所有小写字母:string.ascii_lowercase
        生成所有大写字母:string.ascii_uppercase
        string.printable:返回所有可打印字符及空格等
        string.punctuation:返回所有标点符号

    

        import random
        random.random():生成一个随机的浮点数范围是在0.0~1.0之间
        random.uniform():设定浮点数的范围
        random.randint(a,b):返回包含数字为a到b之间的数字
        random.choice():可以从任何序列选取一个随机的元素返回
        random.shuffle():随机打乱序列中的元素
        random.sample():随机的截取指定长度的片断
        import string
        生成所有数字:string.digits
        生成所有大小写字母:string.ascii_letters
        生成所有小写字母:string.ascii_lowercase
        生成所有大写字母:string.ascii_uppercase
        string.printable:返回所有可打印字符及空格等
        string.punctuation:返回所有标点符号

    

        https://www.selenium.dev/zh-cn/documentation/webdriver/elements

        安装:pip install selenium
        驱动:chromedrive.exe
        反爬:StealthJS # window.navigator.webdriver

        from selenium import webdriver
        from selenium.webdriver import ActionChains
        from selenium.webdriver.common.by import By
        from selenium.webdriver.common.action_chains import ActionChains
        from selenium.webdriver.common.keys import Keys
        from selenium.webdriver.support.select import Select
        from selenium.webdriver.support.wait import WebDriverWait

        options = webdriver.ChromeOptions()
        options.add_argument("--proxy-server=http://127.0.0.1:80") # 设置代理ip
        options.add_argument('--user-agent=""') # 设置请求头的User-Agent
        options.add_argument('--disable-infobars') # 禁止策略化
        options.add_argument('--no-sandbox') # 解决DevToolsActivePort文件不存在的报错
        options.add_argument('window-size=1920x1080') # 指定浏览器分辨率
        options.add_argument('--disable-gpu') # 谷歌文档提到需要加上这个属性来规避bug
        options.add_argument('--incognito') # 隐身模式(无痕模式)
        options.add_argument('--disable-javascript') # 禁用javascript
        options.add_argument('--start-maximized') # 最大化运行 不建议设置
        options.add_argument('--disable-infobars') # 禁用浏览器正在被自动化程序控制的提示
        options.add_argument('--hide-scrollbars') # 隐藏滚动条, 应对一些特殊页面
        options.add_argument('--blink-settings=imagesEnabled=false') # 不加载图片, 提升速度
        options.add_argument('--headless') # 浏览器不提供可视化页面
        options.add_argument('--ignore-certificate-errors') # 去掉您的链接不是私密的提示处理
        options.add_argument("excludeSwitches", ["enable-automation"]) # 去掉浏览器被自动化软件控制的提示
        options.add_experimental_option('useAutomationExtension',False) # 去掉浏览器被自动化软件控制的提示
        options.add_experimental_option('excludeSwitches', ['enable-logging']) # 去掉errorcode:-105报错


        browser.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument",{'source':'Object.defineProperty(navigator,"webdriver",{get:()=>undefind})'})
        # 可以通过隐藏WebDriver提示条和自动化扩展信息来跳过百度安全验证?

        prefs = {
            "profile.default_content_setting_values": {
                "notifications": 2
            }
        }
        options.add_experimental_option("prefs", prefs) # 禁止弹窗


        driver = webdriver.Chrome(chrome_options=chromeOptions)

        driver = webdriver.Chrome(executable_path='', options=options) # 去掉errorcode:-105报错?

        通过元素id定位:find_element_by_id
        通过元素name定位:find_element_by_name
        通过xpath表达式定位:find_element_by_xpath
        通过完整超链接定位:find_element_by_link_text
        通过部分链接定位:find_element_by_partial_link_text
        通过标签定位:find_element_by_tag_name
        通过类名进行定位:find_element_by_class_name
        通过css选择器进行定位:find_elements_by_css_selector
        如上所示定位多个元素则修改为:elements

        设置浏览器的大小:set_window_size()
        控制浏览器后退:back()
        控制浏览器前进:forward()
        刷新当前页面:refresh()
        清除文本:clear()

        模拟按键输入:send_keys (value) 通过send_keys()方法可实现文件上传
        单击元素:click()
        用于提交表单:submit()
        获取元素属性值:get_attribute(name)
        设置该元素是否用户可见:is_displayed()
        返回元素的尺寸:size
        获取元素的文本:text

        构造ActionChains对象:ActionChains(driver)
        执行鼠标悬停操作:context_click()
        右击:move_to_element(above)
        双击:double_click()
        拖动:drag_and_drop()
        执行鼠标悬停操作:move_to_element(above)
        用于模拟鼠标右键操作在调用时需要指定元素定位:context_click()
        执行所有ActionChains中存储的行为可以理解成是对整个操作的提交动作:perform()

        删除键(BackSpace):send_keys(Keys.BACK_SPACE)
        空格键(Space):send_keys(Keys.SPACE)
        制表键(Tab):send_keys(Keys.TAB)
        回退键(Esc):send_keys(Keys.ESCAPE)
        回车键(Enter):send_keys(Keys.ENTER)
        全选(Ctrl+A):send_keys(Keys.CONTROL,‘a’)
        复制(Ctrl+C):send_keys(Keys.CONTROL,‘c’)
        剪切(Ctrl+X):send_keys(Keys.CONTROL,‘x’)
        粘贴(Ctrl+V):send_keys(Keys.CONTROL,‘v’)
        键盘(F1…Fn):send_keys(Keys.F1…Fn)

        用于获得当前页面的标题:title
        用户获得当前页面的URL:current_url
        获取搜索条目的文本信息:text
        将当前定位的主体切换为frame/iframe表单的内嵌页面中:switch_to.frame()
        跳回最外层的页面:switch_to.default_content()
        获得当前窗口句柄:current_window_handle
        返回所有窗口的句柄到当前会话:window_handles
        切换到相应的窗口:switch_to.window()
        返回alert/confirm/prompt中的文字信息:text
        接受现有警告框:accept()
        解散现有警告框:dismiss()
        将文本发送至警告框:send_keys(keysToSend)

        下拉框select标签的value属性的值:select_by_value(“选择值”)
        下拉框的索引:select_by_index(“索引值”)
        下拉框的文本值:select_by_visible_testx(“文本值”)

        获得所有cookie信息:get_cookies()
        返回cookie信息:get_cookie(name) 返回字典的key为name的cookie信息
        添加cookie:add_cookie(cookie_dict) cookie_dict指字典对象必须有name和value值
        删除cookie信息:delete_cookie(name,optionsString) name是要删除的cookie的名称optionsString是该cookie的选项
        删除所有cookie信息:delete_all_cookies()

        调用JavaScript代码:js="window.scrollTo(左边距,上边距);" driver.execute_script(js)
        用于截取当前窗口并把图片保存到本地:get_screenshot_as_file(self, filename)
        用于获取指定元素的截图并保存到本地:element.screenshot(filename)

        driver.implicitly_wait(10) # 隐性等待-秒
        time.sleep(10) # 强制等待-秒
        WebDriverWait(driver,10,poll_frequency=0.5,ignored_exceptions=None) # 显示等待-秒

        关闭单个窗口:close()
        关闭所有窗口:quit()

        # browser.switch_to.alert.accept() 弹出框-同意
		# browser.switch_to.alert.dismiss() 弹出框-取消
		# browser.switch_to.alert.text() 弹出框-内容
		# browser.switch_to.alert.send_keys() 弹出框-输入

    

        import os
        os.sep #系统路径的分隔符,Windows为\\ Linux/Unix为/。
        os.name #系统平台,Windows为nt Linux/Unix为posix。
        os.environ() #获取系统环境变量
        os.getenv(环境变量名称) #读取环境变量
        os.getcwd() #获取当前路径
        os.listdir() #返回指定目录下的所有文件和目录名
        os.mkdir() #创建一个目录文件
        os.rmdir() #仅删除一个空目录文件
        os.makedirs(dirname) #生成多次递归目录
        os.removedirs(dirname) #仅删除多层递归的空目录
        os.chdir() #改变当前目录到指定目录中
        os.rename() #重命名目录名或文件名
        os.path.exists(path) #判断文件或目录是否存在
        os.path.isfile(path) #判断是否为文件
        os.path.isdir(path) #判断是否为目录
        os.path.basename(path) #返回文件名
        os.path.dirname(path) #返回文件路径
        os.path.getsize(name) #获得文件大小,如果name是目录返回OL。
        os.path.abspath(name) #获得绝对路径
        os.path.join(path,name) #连接目录与文件名

    

        r   = 以只读方式打开文件。文件的指针将会放在文件的开头。这是默认模式。
        w   = 打开一个文件只用于写入。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。
        a   = 打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。如果该文件不存在,创建新文件进行写入。
        rb  = 以二进制格式打开一个文件用于只读。文件指针将会放在文件的开头。这是默认模式。
        wb  = 以二进制格式打开一个文件只用于写入。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。
        ab  = 以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。如果该文件不存在,创建新文件进行写入。
        r+  = 打开一个文件用于读写。文件指针将会放在文件的开头。
        w+  = 打开一个文件用于读写。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。
        a+  = 打开一个文件用于读写。如果该文件已存在,文件指针将会放在文件的结尾。文件打开时会是追加模式。如果该文件不存在,创建新文件用于读写。
        rb+ = 以二进制格式打开一个文件用于读写。文件指针将会放在文件的开头。
        wb+ = 以二进制格式打开一个文件用于读写。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。
        ab+ = 以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。如果该文件不存在,创建新文件用于读写。
    
        with open(path, 'r', encoding='gbk') as f:
            f.write('Hello World')
        
        f.read() #读取全部文件内容
        f.read(size) #每次读取size个字节内容
        f.readline() #每次读取一行的内容
        f.readlines() #读取全部内容,但结果是个list,每行内容是一个元素

    
   
        import docx
        from docx import Document
        from docx.enum.text import WD_ALIGN_PARAGRAPH #设置对象居中、对齐等。
        from docx.enum.text import WD_TAB_ALIGNMENT,WD_TAB_LEADER #设置制表符等
        from docx.shared import Inches #设置图像大小
        from docx.shared import Pt #设置像素、缩进等
        from docx.shared import RGBColor #设置字体颜色
        from docx.shared import Length #设置宽度

        file = docx.Document(path) #读取文本文档
        print('段落:'+str(len(file.paragraphs)))
        for para in file.paragraphs:
            print(para.text)  
        for i in range(len(file.paragraphs)): 
            print(file.paragraphs[i].text)

        file = docx.Document(path) #读取表格文档
        for table in doc.tables: #遍历所有表格
            for row in table.rows: #遍历表格的所有行
                row_str = '\t'.join([cell.text for cell in row.cells]) #一行数据
                for cell in row.cells:
                    print(cell.text, '\t',)
                    print() #换行

        document = Document() #创建文档对象
        document.styles['Normal'].font.name = '宋体' #设置西文字体
        document.styles['Normal']._element.rPr.rFonts.set(qn('w:eastAsia'), '宋体') #设置中文字体 
        document.add_heading(u'文档标题',0)
        p = document.add_paragraph('往文档中添加段落')
        p.paragraph_format.alignment = WD_ALIGN_PARAGRAPH.JUSTIFY #设置对齐方式
        p.paragraph_format.line_spacing_rule = WD_LINE_SPACING.ONE_POINT_FIVE #设置行间距
        p.paragraph_format.space_after = Pt(0) #设置段后间距 
        p.add_run('粗体').bold = True
        p.add_run('等等')
        p.add_run('斜体').italic = True
        run = p.add_run('content') #延长段落
        run.font.color.rgb = RGBColor(255, 0, 0) #设置字体颜色
        run.font.size = Pt(21) #设置字号
        run.font.bold = True #设置下划线

        document.add_heading(u'添加一级标题, level = 1',level = 1)
        document.add_paragraph('Intense quote',style = 'IntenseQuote')
        document.add_paragraph('添加无序列表',style = 'ListBullet')
        document.add_paragraph('添加有序列表1',style = 'ListNumber')
        document.add_paragraph('添加有序列表2',style = 'ListNumber')
        document.add_paragraph('添加有序列表3',style = 'ListNumber')

        document.add_picture('azenta.png',width = Inches(2.25)) #添加图片,并指定宽度。

        table = document.add_table(rows = 1,cols = 2) #添加表格: 1行2列
        hdr_cells = table.rows[0].cells #获取第一行的单元格列表对象
        hdr_cells[0].text = 'Name' #为每一个单元格赋值
        hdr_cells[1].text = 'Age' #注:值都要为字符串类型
        new_cells = table.add_row().cells #为表格添加一行
        new_cells[0].text = 'Tom'
        new_cells[1].text = '19'

        document.add_page_break() #添加分页符
        p = document.add_paragraph('往新的一页中添加段落')

        document.save('demo1.doc') #保存文档

    

        import requests
        requests.request(method, url, **kwargs)

        **kwargs:控制访问的参数,均为可选项,共13个。
        params:字典或字节序列,作为参数增加到url中。
        data:字典、字节序列或文件对象,作为Request的对象。
        json:JSON格式的数据,作为Request的内容。
        headers:字典,HTTP定制头。
        cookies:字典或CookieJar,Request中的cookie。
        auth:元组,支持HTTP认证功能。
        files:字典类型,传输文件。
        timeout:设定超时时间,秒为单位。
        proxies:字典类型,设置访问代理服务器,可以增加登录认证。
        allow_redirects:True/False,默认为Ture,重定向开关。
        stream:True/False,默认为True,获取内容立即下载开关。
        verify:True/False,默认为True,认证SSL证书开关。
        cert:本地SSL证书路径。
        
        response = requests.get('http://www.baidu.com')
        print(response.status_code)  # 打印状态码
        HTTP请求的返回状态,200表示连接成功,404表示失败。
        若状态码为403一般是目标存有防火墙,触发了反爬策略被限制了IP。
        print(response.url)          # 打印请求url
        print(response.encoding)     # 打印响应内容编码方式
        print(response.headers)      # 打印头信息
        print(response.cookies)      # 打印cookie信息
        jar = requests.cookies.RequestsCookieJar()
        将CookieJar转为字典:cookies = requests.utils.dict_from_cookiejar(r.cookies)
        将字典转为CookieJar:cookies = requests.utils.cookiejar_from_dict(cookie_dict, cookiejar=None, overwrite=True)
        print(response.text)         # 以文本形式打印网页源码
        print(response.content)      # 以字节流形式打印
        下载图片:open('img', 'wb').write(response.content)
        response.json()方法同json.loads(response.text)

        requests.get(url, params=None, **kwargs)
        requests.post(url, data=None, json=None, **kwargs)
        requests.put(url, data=None, **kwargs)
        requests.head(url, **kwargs)
        requests.delete(url, **kwargs)
        requests.patch(url, data=None, **kwargs)
        requests.options(url, **kwargs)   
        # 以上方法均是在此方法的基础上构建
        requests.request(method, url, **kwargs)

        书验证设置:
        from requests.packages import urllib3
        urllib3.disable_warnings()  #从urllib3中消除警告
        response = requests.get('https://www.12306.cn',verify=False)  #证书验证设为FALSE

        超时异常捕获:
        from requests.exceptions import ReadTimeout
        try:
            res = requests.get('http://httpbin.org', timeout=0.1)
            print(res.status_code)
        except ReadTimeout:
            print(timeout)

        使用代理:
        proxy = {
            'http': '000.000.000.000:00',
            'https' '000.000.000.000:000'
        }

        response = requests.get("https://www.baidu.com/s?wd=AZENTA")
        heads = {}
        heads['User-Agent'] = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/101.0.4951.54 Safari/537.36'
        data = {
            'wd': 'AZENTA',
        }
        response = requests.get('http://www.baidu.com?', params=data, headers=heads)

        会话维持:
        S = requests.Session()
        S.get('http://www.baidu.com')

        异常处理:
        from requests.exceptions import ReadTimeout,HTTPError,RequestException
        try:
            response = requests.get('http://www.baidu.com',timeout=0.5)
            print(response.status_code)
        except ReadTimeout:
            print('timeout')
        except HTTPError:
            print('httperror')
        except RequestException:
            print('reqerror')

    

        from pathlib import Path

        p = Path(file)

        p.cwd() # 获取当前路径
        p.stat()  # 获取当前文件的信息
        p.exists()  # 判断当前路径是否是文件或者文件夹
        p.glob(filename)  # 获取路径下的所有符合filename的文件,返回一个generator
        p.rglob(filename)  # 与上面类似,只不过是返回路径中所有子文件夹的符合filename的文件。
        p.is_dir()  # 判断该路径是否是文件夹
        p.is_file()  # 判断该路径是否是文件
        p.iterdir()  #当path为文件夹时,通过yield产生path文件夹下的所有文件、文件夹路径的迭代器
        P.mkdir(parents=Fasle)  # 根据路径创建文件夹,parents=True时,会依次创建路径中间缺少的文件夹
        p_news = p/'new_dirs/new_dir'
        p_news.mkdir(parents=True)
        P.open(mode='r', buffering=-1, encoding=None, errors=None, newline=None)  #类似于open()函数
        p.rename(target)  # 当target是string时,重命名文件或文件夹;当target是Path时,重命名并移动文件或文件夹
        p.replace(target)  # 重命名当前文件或文件夹,如果target所指示的文件或文件夹已存在,则覆盖原文件
        p.parent() , p.parents()  # parent获取path的上级路径,parents获取path的所有上级路径
        p.is_absolute()  # 判断path是否是绝对路径
        p.match(pattern)  # 判断path是否满足pattern
        p.rmdir()  # 当path为空文件夹的时候,删除该文件夹
        p.name  # 获取path文件名
        p.suffix  # 获取path文件后缀

    

        pip install easygui
        import easygui as eg

        eg.egdemo()

        eg.msgbox(msg='消息', title='标题', ok_button='按钮', image=None, root=None)

        eg.ccbox(msg='消息', title='标题', choices=('选择1[1]', '选择2[2]'), image=None)

        eg.ynbox(msg="消息", title="标题", choices=("[F1]Yes", "[F2]No"), image=None, default_choice='[F1]Yes', cancel_choice='[F2]No')

        eg.buttonbox(msg="消息", title="标题, choices=("按钮1[1]", "按钮2[2]", "按钮3[3]"), image=None, images=None, default_choice=None, cancel_choice=None, callback=None,run=True)

        eg.indexbox(msg="消息", title="标题", choices=("Yes", "No"), image=None, default_choice='Yes', cancel_choice='No')

        eg.boolbox(msg="消息", title="标题", choices=("[Y]es", "[N]o"), image=None, default_choice='Yes', cancel_choice='No')

        eg.buttonbox("消息", image=".jpg.gif.png", choices=("选择1","选择2","选择3"))

        eg.choicebox(msg="消息", title="标题", choices=['单选1', '单选2', '单选3'], preselect=0, callback=None, run=True)
    
        eg.multchoicebox(msg="消息", title="标题", choices=['多选1', '多选2', '多选3', '多选4', '多选5'])

        eg.enterbox(msg="消息", title="标题", default=None, strip=True, image=None, root=None)

        eg.integerbox(msg="请输入数字", title="标题", default=None, lowerbound=1, upperbound=99, image=None, root=None)
        
        msg: 输入框描述信息提示,不传时默认为"Enter an interger between  lowerbound  an upperbound"

        title: 输入框标题,默认为 " "
        lowerbound: 用户可输入的最小值,默认为0
        upperbound: 用户可输入的最大值,默认为99
        image: 输入框显示图片,默认无
        default: 用户默认输入值
    
        eg.enterbox(msg="请输入文本", title="标题", default="默认", strip=True, image=None, root=None)

        msg: 输入框描述信息提示,默认"Enter something."
        title: 输入框标题,默认为 " "
        default: 用户默认输入文本
        strip: 是否去除空格,默认True
        image: 输入框显示图片,默认无

        eg.multenterbox(msg="请对应输入", title="标题", fields=["苹果", "香蕉", "橘子", "草莓"], values=[], callback=None, run=True):

        msg: 输入框描述信息提示,默认“Fill in values for the fields”
        title: 输入框标题,默认为 " "
        fields: 输入框名称赋值,数组类型,必填,若未传入时抛出TypeError: cannot unpack non-iterable NoneType object异常   
        values: 用户默认输入文本,数组类型,当传入时,fields中的每项默认显示values中的值
        run:默认True

        eg.multpasswordbox(msg='请登录账户', title='标题', fields=(["用户", "密码"]), values=())
    
        eg.passwordbox(msg='请输入密码', title='标题', default='', image=None, root=None)

        eg.textbox(msg='消息', title='标题', text='文本', codebox=1)

        eg.codebox(msg='消息', title='标题', text='文本')

        eg.diropenbox(msg='请选择文件', title='标题', default=None)

        eg.fileopenbox(msg='请选择文件', title='标题', default='*.pdf', filetypes=None)

        eg.filesavebox(msg='请选择文件', title='标题', default='路径', filetypes=None)

        eg.exceptionbox(msg=None, title=None)
 
        try:
            print('AZENTA·COURIER')
            int('这里会产生异常')
        except:
            eg.exceptionbox()

    

        pip install openpyxl
        from openpyxl import load_workbook
        from openpyxl.worksheet.hyperlink import hyperlink
        from openpyxl.styles import Font,Color # Color用16进制数表示颜色
        from openpyxl.styles import colors # colors:res,yellow之类的表示颜色

        Workbook是对工作簿的抽象(工作簿 一个excel文件包含多个sheet)
        Worksheet是对表格的抽象(工作表 一个workbook有多个表名识别 如“sheet1”,“sheet2”等)
        Cell是对单元格的抽象(单元格 存储数据对象)

        wb = load_workbook('test.xlsx') #openpyxl第三方库只能处理.xlsx格式的Excel表格
        wb.read_only #判断某一指定Excel是否以只读方式打开(返回True或者False)
        print(wb.encoding, end='\n\n')  #获取文档的字符集编码
        print(wb.properties)  #获取文档的元数据如标题,创建者,创建日期等

        ws = wb.active #获取worksheet对象 处于激活状态下的工作表sheet表
        target = wb.copy_worksheet(source)  #复制当前活跃的sheet表
        ①只有单元格(包括值、样式、超链接、备注)和一些工作表对象(包括尺寸、格式和参数)会被复制,其他属性不会被复制,如图片、图表。
        ②无法在两个文档中复制工作表。
        ③当文档处于只读或只写状态时也无法复制工作表。

        wb = Workbook('test.xlsx') #新建名为test的工作簿
        ws.title = 'new' #修改当前所处工作表名称

        ws = wb['Sheet2'] #指定sheet工作表:sheet表名可以作为字典的key进行索引
        ws.max_column 获取某一指定sheet表中的最大最大列数
        ws.max_row 获取某一指定sheet表中的最大行数
        
        wb.sheetnames #获取文档所有sheet表名(以列表格式返回)
        wb.worksheets #以列表形式返回所有sheet工作表对象
        wb['Sheet1'] #获取指定的工作表
        wb.active #获取当前活跃的工作表
       
        cell = ws['A1'] #选择单个单元格(获取指定位置的单元格对象)
        ws.cell(1, 1) #参数先行后列 都是索引下标
        print(ws['A1'].value) #获取指定单元格的值
        print(ws.cell(1, 1).value) #获取指定单元格的值
        ws.append([1, 2, 3]) #在指定sheet表最后空白行新增行数据
        ws['A1'] = '第一行第一列修改过后的单元格值'
        ws.cell(1, 2).value = '第一行第二列修改过后的单元格值'

        print(ws.values, end='\n\n')  #生成器对象,将一行单元格作为元组单元 组成的生成器
        print(list(ws.values), end='\n\n') #将生成器对象转换为列表数据 列表中是生成器中的所有数据
        for i in ws.values:
            print(i)

        ws转Pandas
        import pandas as pd
        df = pd.DataFrame(ws.values)

        Pandas转ws
        for i in df.values:
            ws.append(i.tolist())
        for i in ws.rows:
            for j in i:
                print(j,j.value,end=',')
            print('')

        print(ws.iter_rows())  #将每一个单元格对象(按行数据中的单元格)作为一个元组单元 组成的生成器
        print(ws.rows, end='\n\n')  #将每一个单元格对象(按行数据中的单元格)作为一个元组单元 组成的生成器
        for i in ws.rows:  #遍历以单元格对象为单位的元组单元组成的生成器 
            for j in i:  #遍历单元格对象中的属性
                print(j, j.value)

        print(ws.columns, end='\n\n')  # 将每一个单元格对象(按照列数据)作为一个元组单元 组成的生成器
        print(ws.iter_cols(), end='\n\n')  # 将每一个单元格对象(按照列数据)作为一个元组单元 组成的生成器
        for i in ws.columns:
            print(i)

        print(cell.col_idx,cell.column) #单元格列索引
        print(cell.row) #单元格行索引
        print(cell.column_letter) #单元格列名
        print(cell.coordinate) #单元格的坐标
        print(cell.data_type) #单元格数字类型 n:数值 s:字符串 d:日期时间
        print(cell.encoding) #单元格编码格式 默认utf-8
        print(cell.has_style)  # 默认样式是 Normal,如果是默认样式,返回False
        print(cell.style) #单元格样式
        print(cell.style_id) #单元格样式id

        ws1 = wb.create_sheet('Mysheet') #插入工作表到最后(默认)
        ws2 = wb.create_sheet('Mysheet',0) #插入工作表到最前
        ws3 = wb.create_sheet('Mysheet',-1) #插入工作表到倒数第二

        ws['A'] #选择一列
        ws[1] #选择一行
        ws['A:B'] #选择多列
        ws[5:10] #选择多行
        ws['A3:B9'] #选择指定区域单元格

        wb.remove('Mysheet') #删除工作表(方法一)
        del wb('Mysheet') #删除工作表(方法二)

        ws.delete_cols(1)  #删除第一列 以此类推 n代表删除第n列
        删除行或者列后,后面的行或者列会自动往前填充,也就是说,删除第一列,原来的第二列就会变成第一列。
        ws.delete_rows(1)  #删除第一行 以此类推 n代表删除第n行

        ws.merge_cells("A1:B1") #合并单元格 合并单元格后之后保留最左上角的值 其他单元格的值全为空(None)
        ws.merged_cells #已存在的合并单元格
        ws.merged_cell_ranges #已存在的合并单元格列表
        ws.unmerge_cells('A1:D3') #解除已存在的合并单元格

        样式设置 - 颜色
        Color(index=0) #根据索引进行填充
        Color(rgb='00000000') #根据rgb值进行填充
        COLOR_INDEX = (
            '00000000', '00FFFFFF', '00FF0000', '0000FF00', '000000FF', #0-4
            '00FFFF00', '00FF00FF', '0000FFFF', '00000000', '00FFFFFF', #5-9
            '00FF0000', '0000FF00', '000000FF', '00FFFF00', '00FF00FF', #10-14
            '0000FFFF', '00800000', '00008000', '00000080', '00808000', #15-19
            '00800080', '00008080', '00C0C0C0', '00808080', '009999FF', #20-24
            '00993366', '00FFFFCC', '00CCFFFF', '00660066', '00FF8080', #25-29
            '000066CC', '00CCCCFF', '00000080', '00FF00FF', '00FFFF00', #30-34
            '0000FFFF', '00800080', '00800000', '00008080', '000000FF', #35-39
            '0000CCFF', '00CCFFFF', '00CCFFCC', '00FFFF99', '0099CCFF', #40-44
            '00FF99CC', '00CC99FF', '00FFCC99', '003366FF', '0033CCCC', #45-49
            '0099CC00', '00FFCC00', '00FF9900', '00FF6600', '00666699', #50-54
            '00969696', '00003366', '00339966', '00003300', '00333300', #55-59
            '00993300', '00993366', '00333399', '00333333',             #60-63
        )
        BLACK = COLOR_INDEX[0]
        WHITE = COLOR_INDEX[1]
        RED = COLOR_INDEX[2]
        DARKRED = COLOR_INDEX[8]
        BLUE = COLOR_INDEX[4]
        DARKBLUE = COLOR_INDEX[12]
        GREEN = COLOR_INDEX[3]
        DARKGREEN = COLOR_INDEX[9]
        YELLOW = COLOR_INDEX[5]
        DARKYELLOW = COLOR_INDEX[19]

        样式设置 - 字体
        ws.cell(5,3).value='哈哈哈'
        ws.cell(5,3).font = Font(name='仿宋',size=12,color=Color(index=0),b=True,i=True)
        # size sz 字体大小
        # b bold 是否粗体
        # i italic 是否斜体
        # name family 字体样式
        ws["B1"] = "字体样式"
        font = Font(
            name="微软雅黑",  # 字体
            size=15,         # 字体大小
            color="0000FF",  # 字体颜色 用16进制rgb表示
            bold=True,       # 是否加粗 True/False
            italic=True,     # 是否斜体 True/False
            strike=None,     # 是否使用删除线,True/False
            underline=None,  # 下划线 可选'singleAccounting', 'double', 'single', 'doubleAccounting'
        )
        ws["B1"].font = font

        样式设置 - 对齐
        Alignment(horizontal='fill',vertical='center')
        # 参数可选项
        horizontal = {'fill', 'distributed', 'centerContinuous', 'right','justify', 'center', 'left', 'general'}
        vertical = {'distributed', 'justify', 'center', 'bottom', 'top'}
        ws.cell(3,3).alignment= Alignment()
        ws["B2"] = "对齐方式"
        ws['B2'].alignment = Alignment(
            horizontal='left',    # 水平对齐 可选general、left、center、right、fill、justify、centerContinuous、distributed
            vertical='top',       # 垂直对齐 可选top、center、bottom、justify、distributed
            text_rotation=0,      # 字体旋转0~180整数
            wrap_text=False,      # 是否自动换行
            shrink_to_fit=False,  # 是否缩小字体填充
            indent=0,             # 缩进值
        )

        样式设置 - 边框
        Side(style='thin',color=Color(index=0)) #style可选项
        style = ('dashDot','dashDotDot', 'dashed','dotted','double','hair', 'medium', 'mediumDashDot', 'mediumDashDotDot','mediumDashed', 'slantDashDot', 'thick', 'thin')
        # 'medium' 中粗
        # 'thin'  细
        # 'thick'  粗
        # 'dashed'  虚线
        # 'dotted'  点线
        ws["B3"] = "边框样式"
        side = Side(
            style="medium",  # 边框样式 可选dashDot、dashDotDot、dashed、dotted、double、hair、medium、mediumDashDot、mediumDashDotDot、mediumDashed、slantDashDot、thick、thin
            color="ff66dd",  # 边框颜色 16进制rgb表示
        )
        ws["B3"].border = Border(
            top=side,      # 上
            bottom=side,   # 下
            left=side,     # 左
            right=side,    # 右
            diagonal=side  # 对角线
        )

        样式设置 - 填充
        PatternFill(patternType='solid',fgColor=Color(), bgColor=Color())
        # fgColor前景色 bgColor后景色
        # 参数可选项
        patternType = {'darkDown', 'darkUp', 'lightDown', 'darkGrid', 'lightVertical', 'solid', 'gray0625', 'darkHorizontal', 'lightGrid', 'lightTrellis', 
            'mediumGray', 'gray125', 'darkGray', 'lightGray', 'lightUp', 'lightHorizontal', 'darkTrellis', 'darkVertical'}
        ws.cell(3,3).fill = PatternFill()
        ws["B4"] = "填充渐变"
        fill = PatternFill(
            patternType="solid", # 填充类型 可选none、solid、darkGray、mediumGray、lightGray、lightDown、lightGray、lightGrid
            fgColor="F562a4",    # 前景色 16进制rgb
            bgColor="0000ff",    # 背景色 16进制rgb
            # fill_type=None,    # 填充类型
            # start_color=None,  # 前景色 16进制rgb
            # end_color=None     # 背景色 16进制rgb
        )
        ws["B4"].fill = fill
        ws["B4"].fill = GradientFill(
            degree=60,                  # 角度
            stop=("000000", "FFFFFF")   # 渐变颜色 16进制rgb
        )

        ws['C5'].value = '=HYPERLINK("#Sheet!B2","名称")'
        ws['C5'].hyperlink = Hyperlink(ref='',location='Sheet!H5',target='')
        ws['C5'].value = '链接' # target目标文件 location目标单元格 工作表名+!+单元格名
        link = Namedstyle(name='link',font=Font(color=color.BLUE,underline='single'))
        ws['C5'].style = link

        row = ws.row_dimensions[1]
        row.height = 15 #行高
        col = ws.column_dimensions['E']
        col.width = 10 #列宽

        italic24Font = Font(size=24, italic=True)
        ws['B3'].font = italic24Font
        ws['B3'] = '24pt Italic'

        boldRedFont = Font(name= 'Times New Roman', bold=True, color=colors.BLUE)
        ws['A1'].font = boldRedFont
        ws['A1'] = 'Bold Blue Times New Roman'

        boldRedFont = Font(color=colors.COLOR_INDEX[2])
        ws['D1'].font = boldRedFont
        ws['D1'] = 'RED'

        boldRedFont = Font(color=colors.COLOR_INDEX[5])
        ws['G1'].font = boldRedFont
        ws['G1'] = 'YELLOW'

        ws = wb.copy_worksheet(wb.worksheets[0])
        ws.title = 'Formulas'
        ws['A1'] = 200
        ws['A2'] = 300
        ws['A3'] = '=SUM(A1:A2)'

        wb.save('test.xlsx') #保存工作簿完成新工作簿的建立(将覆盖同名文件且无警告)
        print(wb, end='\n\n')
        
    

        速查表 -  ( 点 击 查 看 更 多 ) 
        
        

        

    
        import win32com.client as win32

        outlook = win32.Dispatch("outlook.application")
        
        mail = outlook.CreateItem(0)
        
        mail.SentOnBehalfOfName = 'xiaojing.zhou@azenta.com'  #选择发送邮箱
        
        mail.To = '46268330@qq.com' #收件人
        
        mail.CC = '1987874878@qq.com' #抄送人
        
        mail.Bcc = '1546268330@qq.com' #密抄收件人
        
        mail.Subject = '测试邮件主题' #邮件主题
        
        mail.Body = '这是一封测试邮件正文' #邮件正文
        
        mail.BodyFormat = 2  # 2表示使用Html format,可以调整格式等
        
        mail.Importance = 2 #设置重要性为高
        
        mail.Attachments.Add(r'C:\1.jpg') #添加附件1
        
        mail.Attachments.Add(r'C:\2.jpg') #添加附件2
        
        mail.HTMLBody  = '''请注意
这是一封测试邮件
并且没有附件
''' mail.HtmlBody = "
" #在htmlbody里面调用这个图片,就可以进入到正文里面了. mail.Display() #显示发送邮件界面 mail.Send() #发送