我的笔记_办公自动化

办公自动化

EXCEL操作

pip install openpyxl

workbook对象

sheet对象

cell对象

读取EXCEL

import openpyxl
from openpyxl.styles import *
from openpyxl.styles import Side,Border,Font,Alignment,PatternFill
# 创建一个工作簿对象
wb = openpyxl.load_workbook('./openpyxl_demo.xlsx')
print(wb)
# 获取工作簿sheet表的名称
st_name = wb.sheetnames
print('当前工作簿sheet名称:',st_name)
#获取指定的sheet工作表对象
sheet = wb['Sheet1']
# 获取活动表
active_sheet = wb.active
print('当前活动表:',active_sheet)

# 获取所有的列columns,行rows
list(sheet.columns)

# 单元格对象,某个单元格
cell = sheet['A4']
# print(cell.value)
# print(cell.row)
# print(cell.column)
# print(cell.coordinate)
cell = sheet.cell(row=4,column=1)
# print(cell.value)

# 某些单元格
cell_list = sheet["B2":"D2"]

# 最大行和列
# print(sheet.max_column)
# sheet.max_row

# 遍历某一行rows 或  列columns的cell值
# for row in sheet.
# for cell in list(sheet.rows)[1]:
# for cell in list(sheet.columns)[0]:
#     print(cell.value)


# # 遍历工作区域所有的cell或活动范围的所有cell;cell_row为<class 'tuple'>
# for cell_row in sheet:
for cell_row in sheet['A1':'E8']:
	for cell in cell_row:
         if cell.value == 'item':
            break
         print(cell.coordinate,cell.value)


# 遍历每行数据,从第二行开始
for row in sheet.iter_rows(min_row=2):
     print(row)

# 逐行遍历指定列的值,从第2行到最后一行
dic = {}
for row_num in range(2,sheet.max_row+1):
    code = sheet['B'+str(row_num)].value
    qty = sheet['C'+str(row_num)].value
    type = sheet['D'+str(row_num)].value
    part_number = sheet['E'+str(row_num)].value
    print(code,qty,type,part_number)
    dic.setdefault(code,{})
print(dic)

# 逐行遍历指定单元格的值
for row_num in range(2,sheet.max_row+1):
    target_cell = sheet.cell(row=row_num,column=2).value
    print(target_cell)

创建EXCEL

import openpyxl
from openpyxl.styles import Side,Border,Font,Alignment,PatternFill

# 创建新的EXCEL
wb = openpyxl.Workbook()
# 删除默认sheet
del wb["Sheet"]
# 添加工作表
sheet = wb.create_sheet(index=0,title="第一个")
# 复制工作表
newsheet = wb.copy_worksheet(wb["第一个"])
newsheet.title = "第一个的替身"

# 指定工作表,名称为Sheet1;
sheet = wb['Sheet1']
# 活动页/当前操作页
sheet = wb.active

# 写数据,从最下方空白处的第一列开始写入数据
sheet.append(['列表数据1','列表数据2'])
# 指定位置添加数据,可以直接写入公式
sheet['F12'] = '=SUM(G3:G17)'
cell = sheet.cell(row=4,column=1)
cell.value = '=SUM(G3:G17)'
# 保存工作簿
wb.save('./data/第一个工作簿.xlsx')

# 删除列;idx:要删除的索引;amount:从索引开始删除的个数,默认为1
sheet.delete_rows(idx=1,amount=2)
# 插入列
sheet.insert_rows(idx=1,amount=3)

#字体
fn = Font(name='楷体',color='8470FF',size=12,b=True,italic = True)
sheet['a3'].font = fn

# 创建side和border对象,单元格边框
side = Side(style = 'double',color='ff0000')
side = Side(style = 'thin') # 颜色默认为黑色
border = Border(top = side,bottom=side,left =side,right =side)
sheet['a3'].border = border

# 创建1个alignment对象;对齐方式:水平方向horizontal;垂直方向vertical;
ali = Alignment(horizontal='right',vertical= 'center')
sheet = wb.active
sheet['a3'].alignment = ali

# 创建字体的对象;设置填充色
fn = PatternFill(patternType='solid',fgColor='8470FF')
sheet = wb.active
sheet['a3'] = '字体'
sheet['a4'] = '字体'
sheet['a3'].fill = fn

# 合并单元格
sheet.merge_cells('A1:D7')
sheet.merge_cells(start_row=15,start_column=3,end_column=8,end_row=18)
# 拆封
sheet.unmerge_cells('A1:D7')

# 冻结单元格,冻结A2上和左的单元格
sheet.freeze_panes = 'A2'
# 解除冻结
sheet.freeze_panes = None

# 筛选(存在bug,执行了筛选或排序但是不能直接显示,需要手动点击筛选确定和保存表格)
sheet.auto_filter.ref = "A1:D7"							# 设置筛选区域
sheet.auto_filter.add_filter_column(2,["北京","天津"])	  # 设置筛选条件:指定列;条件内容
# 排序(有BUG不好用!)
sheet.auto_filter.ref = "A1:D7"							# 设置排序区域
sheet.auto_filter.add_sort_condition(ref="D1:D7",descending=True)

图表

条形图:openpyxl.chart.BarChart()

折线图:openpyxl.chart.LineChart()

饼图:openpyxl.chart.PieChart()

import openpyxl
from openpyxl.chart import BarChart, LineChart, Series, Reference

wb = openpyxl.load_workbook(r"C:\Users\liy\mydata_analyse\数据.xlsx")
sheet = wb.active

# for cell_rows in sheet["A1":"E8"]:
#     # print(cell_rows)
#     # print(type(cell_rows))
#     for cell in cell_rows:
#         print(cell.coordinate, cell.value)

# 1.创建图表对象;设置表格标题和xy轴标题
x_chart = BarChart()
x_chart.type = "col"   # 横向还是纵向表格,col为纵向,bar为横向
x_chart.style = "10"   # 柱形图风格,尝试换不同的数字就是不同颜色风格
x_chart.title = "我是柱状图"
x_chart.x_axis.title = "时间"
x_chart.y_axis.title = "销量"

# 2.创建一个Reference对象,表示图表X轴的值、标签和数据区域;row:行;col:列
cats = Reference(sheet,min_col=1,min_row=2,max_row=8)   # 首列,X轴坐标的值
data = Reference(sheet,min_col=2,min_row=1,max_row=8,max_col=5)  # 标签和数据区域
# 3.往图表对象中添加数据;titles_from_data=True设置数据标签
x_chart.add_data(data,titles_from_data=True)
x_chart.set_categories(cats)
x_chart.shape = 4
# 4.将图表添加到指定sheet中
sheet.add_chart(x_chart,'G10')

wb.save(r"C:\Users\liy\mydata_analyse\数据.xlsx")


#使用:Chart.x_axis.scaling.min  属性 来赋值X轴的最小值
#使用:Chart.x_axis.scaling.max  属性 来赋值X轴的最大值
#使用:Chart.y_axis.scaling.min  属性 来赋值Y轴的最小值
#使用:Chart.y_axis.scaling.max  属性 来赋值Y轴的最大值

WORD操作

  • 示例代码

    pip install python-docx
    

    Word文档的组成结构

    • 文档doc = docx.Document

    • 段落p1 = doc.add_paragraphtext="我是段落1!"

    • 内容p1.add_run(text="我是内容1!")

读取WORD

import docx
# 读取word文档
doc = docx.Document('./doc_demo.docx')

# 段落对象;par_list对象列表
par_list = doc.paragraphs       # 所有段落
print(len(doc.paragraphs))
print(doc.paragraphs[0].text)   # 段落内容

# 内容对象;run对象列表;英文按照样式进行分隔,中文按照标点符号分隔
run_list = par_list[0].runs
print(run_list)
for run_data in run_list:
    print(run_data.text)

创建word

import docx
from docx.enum.text import WD_BREAK,WD_PARAGRAPH_ALIGNMENT
from docx.shared import Inches,Cm,Pt


# 1.创建全新的word文档;文档对象
doc = docx.Document()
# 添加标题add_heading
head = doc.add_heading('我是标题', level=2)
head.alignment = WD_PARAGRAPH_ALIGNMENT.CENTER  # 居中
# doc.paragraphs[-1].alignment = WD_PARAGRAPH_ALIGNMENT.CENTER   # 居中
# 2.文档添加段落add_paragraph
p1 = doc.add_paragraph(text="我是段落1!",style="BodyText")
p2 = doc.add_paragraph(text="我是段落2!",style="BodyText2")

# 3.段落直接添加内容add_run
p2.add_run(text="我是内容1!")
p2.add_run(text="我是内容2!",style="BodyTextChar")
# 4.段落先添加换行符add_break后添加内容
p2.runs[-1].add_break()      # 在第2个段落的内容后面增加换行
p2.add_run("我是第二段落换行后的内容!")
# 5.添加换页符(仍然属于段落2的内容)
p2.runs[-1].add_break(WD_BREAK.PAGE)      # 在第2个段落的内容后面增加换页
p2.add_run("=====我是第二段落换页后的内容!==========")

# 6.添加分节符add_section(分节符后的页面设置可以单独进行设置,如纸张方向,页边距,页码等;分页符页不行)】
doc.add_section()
p3 = doc.add_paragraph(text="我是段落3!")

# 7.添加图片add_picture;尺寸单位为Cm或Inches
pic_path = r"C:\Users\liy\Desktop\metro.jpg"
doc.add_picture(pic_path,width=Cm(5),height=Cm(5))
doc.paragraphs[-1].alignment = WD_PARAGRAPH_ALIGNMENT.CENTER   # 居中

# 8.添加表格;表格格式style='Light List Accent 3';"Light Shading"
tb = doc.add_table(rows=3,cols=3,style='Light List Accent 3')
# 所有行对象;列表tb.rows
# 所有列对象;列表tb.columns
# 单元格tb.cell(1,1)第二行二列的单元格;设置某一个单元格的内容
# tb_run = tb.cell(1,1).paragraphs[0].add_run('我是内容!')
# 批量填充表格
alist = ['name','salary','adress','小逗逗','22222','BJ','大逗逗','11111','TJ']
i = 0
for row in tb.rows:
    for cell in row.cells:
        cell.add_paragraph(text=alist[i])
        i += 1
        
# 9.添加新的列和行;列需要输入宽度参数
tb.add_row()
tb.add_column(Cm(3))

print(len(doc.paragraphs))
for p in doc.paragraphs:
    print(p.text)
    print("--------------")
    
doc.save("./doc_demo2.docx")

PDF操作

pyautogui模块

pip install pyautogui
  • 模块说明
    • 屏幕左上角为坐标原点(0,0);若屏幕分辨率为1920*1080,右下角为(1919,1079)

鼠标&键盘操作

import pyautogui
# 识别屏幕分辨率
width,height = pyautogui.size()
print(width,height)

## 鼠标操作
# 1.移动鼠标
# 相对于原点移动鼠标
# 将鼠标移动到屏幕的指定位置(x,y,duration=多少秒,不写默认为0;建议写时间,模拟人的操作)
# pyautogui.moveTo(0,0,duration=0.25)
# 相对于当前位置移动多少像素
# pyautogui.moveRel(0,100,duration=0.25)
# pyautogui.moveRel(-100,0,duration=0.25)
# 获取鼠标位置
position = pyautogui.position()
print(position)

# 2.点击鼠标
# 默认位置点击;默认是左键'left'
# pyautogui.click()
# 双击
# pyautogui.doubleClick()
# (10,5)位置,右键点击
# pyautogui.click(10,5,button='right')
# pyautogui.rightClick(10,5)

# 按下鼠标按键不放
# pyautogui.mouseDown()
# 释放按键
# pyautogui.mouseUp()

# 3.鼠标滑动;向下滚动填负值
pyautogui.scroll(-200)

# 拖动鼠标
# pyautogui.dragTo(distance,)
# pyautogui.dragRel()


## 键盘操作
# 录入数据(自动识别大小写)typewrite;延迟0.25秒
pyautogui.typewrite('Hello World!',interval=0.25)
# 键盘功能键的点击操作;具体操作为实现按键和释放
pyautogui.press('ENTER')
# pyautogui.keyDown()
# pyautogui.keyUp()

# 组合键,实现复制、粘贴或$字符的录入
pyautogui.hotkey('ctrl','C')
# 补充复制粘贴也可以使用pyperclip模块
pyperclip.copy('小逗逗')
pyautogui.hotkey('ctrl','V')

截图

import pyautogui
import time
# 识别屏幕分辨率
width,height = pyautogui.size()
print(width,height)
# time.sleep(3)
# pyautogui.scroll(-200)

# 截屏并保存
img = pyautogui.screenshot()
img.save('./123.png')

# 获取某个像素点的RGB值
print(img.getpixel((23, 560)))
# 像素点的匹配;前两个参数为对比位置x,y;参数3为要比对的RGB值
res = pyautogui.pixelMatchesColor(23, 560,(255, 255, 255))
print(res)

opencv模块

pip install opencv-python

定位图片

识别目标图标实现屏幕中定位并点击操作的代码

import cv2
import pyautogui
import time

# 1.cv2读取屏幕界面和目标位置的图片
# 截图当前桌面
img = pyautogui.screenshot()
img.save('./screen_pic.png')
# 读取照片
target_pic = cv2.imread('./xiaotu.png')         # 目标图标位置
screen_pic = cv2.imread("./screen_pic.png")     # 操作的左面截图

# 2.对比两张图片;res为二维列表,两张图表每个像素点的对比结果(固定写法)
res = cv2.matchTemplate(target_pic,screen_pic,cv2.TM_CCOEFF_NORMED )
# 获取res中的最相似(数值最大)的值和坐标(固定写法);min_val, max_val, min_loc, max_loc ;坐标为第4个值
pos = cv2.minMaxLoc(res)[3]

# 3.定位到屏幕界面的中间位置并完成点击
x = int(pos[0])+int(target_pic.shape[1]/2)
y = int(pos[1])+int(target_pic.shape[0]/2)
time.sleep(1)
pyautogui.doubleClick(x,y)

摄像头操作

# 1.基于CV2打开电脑摄像头并捕获照片
cap = cv2.VideoCapture(0)
ret,frame = cap.read()
time.sleep(3)
cv2.imwrite('./photo.jpg',frame)
# 关闭摄像头
cap.release()

yagmail模块

pip3 install yagmail

发送邮件

  • 邮箱需开启SMTP服务(在设置中)
  • 当前设备初次使用邮箱时需使用设备的授权码(在设置中)
import yagmail

# 收件人
receiver = ['manna16186@qq.com',]
# 邮件内容;内容可以写HTML字符
contents = ['测试内容1','<h1>Hello</h1>']
# 附件;填入文件的路径
attachments = [r'C:\Users\liy\pythonProject\allInPy\办公自动化\123.png',]
# 对当前设备进行邮箱注册/绑定(只需要第一次执行时运行)
yagmail.register("ly515525059@126.com",'UPTXRQXGCWQXXYWD')
# 设置SMTP协议
yag = yagmail.SMTP(user="ly515525059@126.com",host='smtp.126.com')
# 发送邮件
yag.send(to=receiver,subject='测试',contents=contents,attachments=attachments)
# 关闭服务器链接
yagmail.SMTP.close(yag)

schedule模块

任务调度工具;定时器

  • 每个周期任务需要run_pending函数来检测是否执行,需while循环不断地询问这个函数。
pip install schedule

代码

import schedule
from datetime import datetime, timedelta, time
from schedule import every, repeat

def job(name):
    print("%s is working..." %name)

@repeat(every(10).minutes)
def new_job():
    print("装饰器的重复任务")

# 每十分钟执行任务
schedule.every(10).minutes.do(job,name="小逗逗")
# # 每个小时执行任务;可以加until限制结束时间:直到几点后不执行或者函数timedelta(hours=8):8小时后
# schedule.every().hour.until("22:00").do(job)
# # 每天的10:30执行任务
# schedule.every().day.at("10:30").do(job).tag("daily-tasks")
# # 每个周一执行任务
# schedule.every().monday.do(job)
# # 每个星期三的11:32:42执行任务
# schedule.every().wednesday.at(time(11, 33, 42)).do(job)
# # 每分钟的第17秒执行任务
# schedule.every().minute.at(":17").until(datetime(2020, 5, 17, 11, 36, 20))do(job)

while True:
    schedule.run_pending()
    time.sleep(1)

# 某个条件下可以立即运行所有任务
schedule.run_all()
# 或者指定运行某个任务标签
schedule.run_all("daily-tasks")
# 却笑所有任务
schedule.clear()
# 或者指定取消某个任务标签
schedule.clear("daily-tasks")

PIL模块

pip install PIL

图片操作

from PIL import Image,ImageDraw

# 打开水印文件和目标文件;将目标文件备份一份
logo = Image.open('./$$.png')
target_pic = Image.open('./123.png')
target_pic_copy = target_pic.copy()

# 调整尺寸resize
width,height = target_pic_copy.size
increased_target_pic = target_pic_copy.resize(int(width/2),int(height/2))

# 加水印paste
target_pic_copy.paste(logo,(10,20),logo)

# 添加文本
draw = ImageDraw.Draw(target_pic_copy)
draw.text((20,20),"hello",fill='purple')

target_pic_copy.save('./123_logo.png')

plotly_express模块

pip install plotly_express

可视化绘图:散点图、气泡图等

代码

import plotly_express as px

自动化小工具

批量改名字

  • 代码

    import os
    import sys
    
    if __name__ == "__main__":
    
        folder_name = r"F:\BaiduNetdiskDownload\[505305]神奇图书馆【第一季】01-05\03 宇宙的秘密【061-093】"  # 获取文件夹的名字,即路径
        file_names = os.listdir(folder_name)  # 获取文件夹内所有文件的名字
    
        for name in file_names:  # 如果某个文件名在file_names内
            old_name = folder_name + '/' + name  # 获取旧文件的名字,注意名字要带路径名
            new_name = folder_name + '/' + '宇宙的秘密' + name  # 定义新文件的名字,这里给每个文件名前加了前缀 a_
            os.rename(old_name, new_name)  # 用rename()函数重命名
            print(new_name)  # 打印新的文件名字
    

.ts文件合并成.mp4文件

  • 代码

    '''
    .ts文件合并成.mp4文件
    '''
    
    from moviepy.editor import *
    import os
    from natsort import natsorted
    
    L = []  # 定义一个数组
    
    # 访问 video 文件夹
    for root, dirs, files in os.walk(r"路径"):  # 输入文件所在的路径
    
        # 按文件名排序
        # files.sort()
        files = natsorted(files)  # natsort库提供了自然排序方法
        # 遍历所有文件
        for file in files:
            # 如果后缀名为 .mp4
            if os.path.splitext(file)[1] == '.ts':
                # 拼接成完整路径
                filePath = os.path.join(root, file)
                # 载入视频
                video = VideoFileClip(filePath)
                # 添加到数组
                L.append(video)
    
    # 拼接视频
    final_clip = concatenate_videoclips(L)
    
    # 生成目标视频文件
    final_clip.to_videofile(r"路径\movie.MP4", fps=24, remove_temp=False)
    
    

其他

文件路径

# 文件路径
base_dir = os.path.dirname(os.path.abspath(__file__))
target_file_path = os.path.join(base_dir, "weather.xlsx")
posted @   我来改变代码  阅读(12)  评论(0编辑  收藏  举报
编辑推荐:
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
点击右上角即可分享
微信分享提示