我的笔记_办公自动化
办公自动化
目录
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")
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 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语句:使用策略模式优化代码结构