Excel
①Excel文件讀取與寫入
②Excel模板套用
③配合數據庫生成報表
Word
①格式文檔生成
②word批量轉PDF
③拆分和合並PDF
PPT
①PPT自動生成
②數據分析PPT自動生成
Excel
①讀寫
import xlrd
import xlwt
#讀
xlsx = xlrd.open_workbook('C:/Users/acer/Desktop/1.xlsx')
table = xlsx.sheet_by_index(0) # 根據索引, 0表示工作簿的第一個表
# table = xlsx.sheet_by_name("sheet1") 根據表名也行
print(table.row(1)[0].value) #第一行 第0列
# print(table.cell_value(1,0))
#寫
new_workbook = xlwt.Workbook() #創建工作簿
worksheet = new_workbook.add_sheet('new_test') #創建new_test表
worksheet.write(0,0,'test') #第0行第0列寫入test內容
new_workbook.save('C:/Users/acer/Desktop/test.xlsx')
②套用模板 (EXCEL樣式)
font\borders\alignment
打開看看準備好的模板,test.xls
運行Python代碼後的結果,test1.xls
from xlutils.copy import copy
import xlrd
import xlwt
#複製模板 xlutils對xlsx支持差
tem_excel = xlrd.open_workbook('C:/Users/acer/Desktop/test.xls',formatting_info=True)
tem_sheet = tem_excel.sheet_by_index(0) # 根據sheet索引或者名稱獲取sheet內容
new_excel = copy(tem_excel) #複製工作簿
new_sheet = new_excel.get_sheet(0) #獲取第0個表
#初始化樣式
style = xlwt.XFStyle()
font = xlwt.Font()
font.name = '微軟雅黑'
font.bold = True
font.height =360 #字體是18號,那麼要18*20=360
style.font = font
borders = xlwt.Borders()
borders.top = xlwt.Borders.THIN
borders.bottom = xlwt.Borders.THIN
borders.left = xlwt.Borders.THIN
borders.right = xlwt.Borders.THIN
style.borders = borders
#對齊
alignment = xlwt.Alignment()
alignment.horz = xlwt.Alignment.HORZ_CENTER #中心對齊 水平居中
alignment.vert = xlwt.Alignment.VERT_CENTER #垂直對齊 垂直居中
style.alignment = alignment
new_sheet.write(2,1,12,style) #行,列,內容,樣式名
new_sheet.write(3,1,18,style)
new_sheet.write(4,1,19,style)
new_sheet.write(5,1,22,style)
new_excel.save('C:/Users/acer/Desktop/test1.xls')
❤xlsxwriter(超過256列寫入纔用到)
缺點 不支持帶格式的文件
import xlsxwriter as xw
workbook = xw.Workbook('C:/Users/acer/Desktop/number.xlsx') #新建工作簿
sheet0 = workbook.add_worksheet('sheet0') #新建工作表
for i in range(0,300):
sheet0.write(0,i,i)
workbook.close()
❤openpyxl
缺點:性能不穩定,少了邊框線等
import openpyxl
workbook = openpyxl.load_workbook('C:/Users/acer/Desktop/number.xlsx') #打開工作簿
sheet0 = workbook['sheet0'] #打開工作表
sheet0['B6'] = '測試' #向單元格寫入值
sheet0['B7'] = '4'
sheet0['B8'] = 4
workbook.save('C:/Users/acer/Desktop/測試寫數據.xlsx')
挑戰實用案例:把文件名快速整理到Excel中
import os
import xlwt
file_dir = 'd:/'
os.listdir(file_dir)
new_workbook = xlwt.Workbook() #新建工作簿
worksheet = new_workbook.add_sheet('new_test') #新建表
n = 0
for i in os.listdir(file_dir):
worksheet.write(n,0,i)
n += 1
new_workbook.save('C:/Users/acer/Desktop/file_name.xls')
Word
①任務案例一
from docx import Document #安裝的庫是 python-docx
from docx.enum.text import WD_ALIGN_PARAGRAPH #對齊
from docx.shared import Pt #磅數
from docx.oxml.ns import qn #中文格式
# 以上是docx庫中需要用到的部分
import time
price = input('請輸入今日價格:')
company_list = ['客戶1','客戶2','客戶3']
today = time.strftime("%Y-%m-%d",time.localtime()) #"%Y/%m/%d" ,time對中文支持較差
print(today)
for i in company_list:
document = Document()
document.styles['Normal'].font.name = u'宋體'
# 設置文檔的基礎字體
document.styles['Normal'].element.rPr.rFonts.set(qn('w:eastAsia'),u'宋體')
# 設置文檔的基礎中文字體
p1 = document.add_paragraph()
# 初始化建立第一個自然段
p1.alignment = WD_ALIGN_PARAGRAPH.CENTER
# 對齊方式爲居中,沒有這句的話默認左對齊
run1 = p1.add_run('關於下達%s產品價格的通知' % (today))
run1.font.name = '微軟雅黑' # 設置西文字體
run1.element.rPr.rFonts.set(qn('w:eastAsia'),u'微軟雅黑') # 設置中文字體
run1.font.size = Pt(21) #設置字體大小爲21磅
run1.font.bold = True #設置加粗
p1.space_after = Pt(5) # 段後距離5磅
p1.space_before = Pt(5) # 段前距離5磅
p2 = document.add_paragraph()
run2 = p2.add_run(i + ':') # 這裏是對客戶的稱呼
run2.font.name = '仿宋_GB2312'
run2.element.rPr.rFonts.set(qn('w:eastAsia'), u'仿宋_GB2312')
run2.font.size = Pt(16)
run2.font.bold = True
p3 = document.add_paragraph()
run3 = p3.add_run(' 根據公司安排,爲提供優質客戶服務,我單位擬定了今日黃金價格爲%s元,特此通知。' % price)
run3.font.name = '仿宋_GB2312'
run3.element.rPr.rFonts.set(qn('w:eastAsia'), u'仿宋_GB2312')
run3.font.size = Pt(16)
run3.font.bold = True
p4 = document.add_paragraph()
p4.alignment = WD_ALIGN_PARAGRAPH.CENTER
run4 = p4.add_run(' (聯繫人:小楊 電話:123456)')
run4.font.name = '仿宋_GB2312'
run4.element.rPr.rFonts.set(qn('w:eastAsia'), u'仿宋_GB2312')
run4.font.size = Pt(16)
run4.font.bold = True
document.save('C:/Users/acer/Desktop/辦公自動化/Word/%s-價格通知.docx' %i) #以“客戶名-價格通知”作爲文件名保存
②任務案例二
from docx import Document #安裝的庫是 python-docx
from docx.enum.text import WD_ALIGN_PARAGRAPH #對齊
from docx.shared import Pt #磅數
from docx.oxml.ns import qn #中文格式
from docx.shared import Inches #圖片尺寸
import time
price = input('請輸入今日價格:')
company_list = ['客戶1','客戶2','客戶3']
today = time.strftime("%Y-%m-%d",time.localtime()) #"%Y/%m/%d" ,time對中文支持較差
for i in company_list:
document = Document()
document.styles['Normal'].font.name = u'微軟雅黑'
# 設置文檔的基礎字體
document.styles['Normal'].element.rPr.rFonts.set(qn('w:eastAsia'), u'微軟雅黑')
# 設置文檔的基礎中文字體
document.add_picture('C:/Users/acer/Desktop/banner.png',width=Inches(6))
# 在文件最上頭插入圖片作爲文件頭,寬度爲6英寸
p1 = document.add_paragraph()
# 初始化建立第一個自然段
p1.alignment = WD_ALIGN_PARAGRAPH.CENTER
# 對齊方式爲居中,沒有這句的話默認左對齊
run1 = p1.add_run('關於下達%s產品價格的通知' % (today))
run1.font.name = '微軟雅黑' # 設置西文字體
run1.element.rPr.rFonts.set(qn('w:eastAsia'),u'微軟雅黑') # 設置中文字體
run1.font.size = Pt(21) #設置字體大小爲21磅
run1.font.bold = True #設置加粗
p1.space_after = Pt(5) # 段後距離5磅
p1.space_before = Pt(5) # 段前距離5磅
p2 = document.add_paragraph()
run2 = p2.add_run(i + ':') # 這裏是對客戶的稱呼
run2.font.name = '仿宋_GB2312'
run2.element.rPr.rFonts.set(qn('w:eastAsia'), u'仿宋_GB2312')
run2.font.size = Pt(16)
run2.font.bold = True
p3 = document.add_paragraph()
run3 = p3.add_run(' 根據公司安排,爲提供優質客戶服務,我單位擬定了今日黃金價格爲%s元,特此通知。' % price)
run3.font.name = '仿宋_GB2312'
run3.element.rPr.rFonts.set(qn('w:eastAsia'), u'仿宋_GB2312')
run3.font.size = Pt(16)
run3.font.bold = True
p4 = document.add_paragraph()
p4.alignment = WD_ALIGN_PARAGRAPH.CENTER
run4 = p4.add_run(' (聯繫人:小楊 電話:123456)')
run4.font.name = '仿宋_GB2312'
run4.element.rPr.rFonts.set(qn('w:eastAsia'), u'仿宋_GB2312')
run4.font.size = Pt(16)
run4.font.bold = True
#設置表格
table = document.add_table(rows=3,cols=3,style='Table Grid') #Word中自帶的表格格式 Table Grid
table.cell(0,0).merge(table.cell(0,2)) #合併單元格,這個寫法就像Excel,左上,右下
# 0,1 0,2都是同樣的效果,因爲合併了
table_run1 = table.cell(0,0).paragraphs[0].add_run('XX產品報價表') #單元格-》段落-》內容
table_run1.font.name = u'隸書'
table_run1.element.rPr.rFonts.set(qn('w:eastAsia'),u'隸書')
table.cell(0, 0).paragraphs[0].alignment = WD_ALIGN_PARAGRAPH.CENTER #表頭居中
table.cell(1,0).text = '日期' #直接使用文檔默認字體
table.cell(1, 1).text = '價格'
table.cell(1, 2).text = '備註'
table.cell(2, 0).text = 'today'
table.cell(2, 1).text = str(price)
table.cell(2, 2).text = ''
#設置分頁符,最後打個廣告
document.add_page_break()
p5 = document.add_paragraph()
run5 = p5.add_run('此處是廣告')
document.save('C:/Users/acer/Desktop/辦公自動化/Word/Word(圖片+表格)/%s-價格通知.docx' %i) #以“客戶名-價格通知”作爲文件名保存
挑戰實用案例:50個客戶 批量生產N份不同乙方合同
from docx import Document
import xlrd
# Word 方案
def change_text(old_text,new_text):
all_paragraphs = document.paragraphs
for paragraph in all_paragraphs:
for run in paragraph.runs:
run_text = run.text.replace(old_text,new_text)
run.text = run_text
all_tables = document.tables
for table in all_tables:
for row in table.rows:
for cell in row.cells:
cell.text = cell.text.replace(old_text,new_text)
cell.text = cell.text
# Excel 信息(客戶信息,放在Word進行替換)
xlsx = xlrd.open_workbook('合同信息表.xlsx')
sheet = xlsx.sheet_by_index(0)
for table_row in range(1,sheet.nrows):
document = Document("模板.docx")
for table_col in range(0,sheet.ncols):
change_text(str(sheet.cell_value(0,table_col)),str(sheet.cell_value(table_row,table_col)))
document.save("%s合同.docx" % str(sheet.cell_value(table_row,0)))
print("%s合同完成" % str(sheet.cell_value(table_row,0)))
數據可視化
Pandas 做數據透視表
import pandas as pd
import numpy as np
e_file = pd.ExcelFile('C:/Users/acer/Desktop/入庫單.xlsx')
data = e_file.parse('Sheet1')
# print(data)
# 行、列、value、aggfunc是計算地區量 margins是True 總ALL
pt1 = pd.pivot_table(data, index=['銷售商'],columns=['來源省份'], values=['入庫量'],aggfunc=np.sum,margins=True)
pd.set_option('display.max_columns',None)
pt2 = pd.pivot_table(data, index=['銷售商'],columns=['來源省份'], values=['入庫量'],aggfunc=np.size,margins=True)
print(pt1)
print(pt2)
Matplotlib 畫圖
對中文的支持下較差,因此要有 用來正常顯示中文標籤
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei'] # 用來正常顯示中文標籤
date = ['2018/7/21','2018/7/22','2018/7/23']
hebei = [69,93,65]
shanxi = [36,37,41]
###折線圖###
# plt.plot(date,hebei,color='red',label='河北') # 橫座標,縱座標
# plt.plot(date,shanxi,color='blue',label='山西')
# plt.title('每日入庫量對比')
# plt.xlabel('日期')
# plt.ylabel('車次')
# plt.legend()
# plt.show()
###柱狀圖###
# plt.bar(date,hebei,color='red',label='河北')
# plt.legend()
# plt.show()
#水平柱狀圖
# plt.barh(date,hebei,color='red',label='河北')
# plt.legend()
# plt.show()
###餅圖### 1對1的數據
number = [666,354]
province = ['河北','山西']
colors = ['#999fff','#fff999']
plt.pie(x=number,labels=province,colors=colors)
plt.legend()
plt.show()
Pandas + Matplotlib 生成各種圖表
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
e_file = pd.ExcelFile('C:/Users/acer/Desktop/入庫單.xlsx')
data = e_file.parse('Sheet1')
# print(data)
# 行、列、value、aggfunc是計算地區量 margins是True 總ALL
pd.set_option('display.max_columns',None)
pt2 = pd.pivot_table(data, index=['銷售商'],columns=['來源省份'], values=['入庫量'],aggfunc=np.size)
plt.rcParams['font.sans-serif'] = ['SimHei'] # 用來正常顯示中文標籤
plt.rcParams['axes.unicode_minus'] = False # 用來正常顯示負號
pt2.plot(kind='bar')
plt.xticks(rotation=0) # 橫座標
plt.title('各省入庫量對比')
plt.xlabel('客戶')
plt.ylabel('入庫量')
plt.show()
郵件
郵件01: 最基礎
import smtplib
from smtplib import SMTP_SSL
from email.mime.text import MIMEText #構造郵件正文
from email.mime.multipart import MIMEMultipart #郵件的主體
from email.header import Header #郵件標題,收件人
host_server = "smtp.qq.com"
mail_title = u"梨泰院class" # 郵件標題
sender = "[email protected]" # 發件人
receiver = "[email protected]"
mail_content = "你好" # 郵件正文
msg = MIMEMultipart() # 郵件主體(容器)
msg['Subject'] = Header(mail_title,'utf-8')
msg['From'] = sender
msg['To'] = receiver
msg.attach(MIMEText(mail_content,'plain','utf-8')) # 郵件正文內容
# plain是無格式
smtp = SMTP_SSL(host_server) # SSL登錄
smtp.login("[email protected]", "xxxxx") # xxxx 是QQ郵箱的授權碼
smtp.sendmail(sender, receiver, msg.as_string()) # 富文本轉字符串
smtp.quit()
郵件02:附帶HTML格式的 + 附件
import smtplib
from smtplib import SMTP_SSL
from email.mime.text import MIMEText # 構造郵件正文
from email.mime.multipart import MIMEMultipart # 郵件的主體
from email.mime.application import MIMEApplication # 郵件的附件
from email.header import Header # 郵件標題,收件人
host_server = "smtp.qq.com"
mail_title = u"梨泰院class" # 郵件標題
sender = "[email protected]" # 發件人
receiver = "[email protected]"
mail_content = "你好 <a href='www.baidu.com'>百度</a> " # 郵件正文
msg = MIMEMultipart() # 郵件主體(容器)
msg['Subject'] = Header(mail_title,'utf-8')
msg['From'] = sender
msg['To'] = receiver
# msg.attach(MIMEText(mail_content,'plain','utf-8')) # 郵件正文內容
# plain是無格式
msg.attach(MIMEText(mail_content,'html','utf-8'))
# 附件
attachment = MIMEApplication(open("1.PNG",'rb').read())
msg.attach(attachment)
try:
smtp = SMTP_SSL(host_server) # SSL登錄
smtp.ehlo(host_server) # 跟服務器打個招呼,確定一下狀態,不是所有的郵件服務器都需要這個功能。建議加上
smtp.login("[email protected]", "fxxxxxx") # fxxxxxx 是QQ郵箱的授權碼
smtp.sendmail(sender, receiver, msg.as_string()) # 富文本轉字符串
smtp.quit()
print("郵件發送成功")
except smtplib.SMTPException:
print("無法發送郵件")
郵件03: HTML 定位嵌套圖片
import smtplib
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
from email.mime.image import MIMEImage
HOST = "smtp.qq.com"
SUBJECT = u"梨泰院class"
FROM = "[email protected]"
TO = "[email protected]"
def addimg(src, imgid):
fp = open(src, 'rb')
msgImage = MIMEImage(fp.read()) # 讀取圖片的二進制數據 放到對象msgImage
fp.close()
msgImage.add_header('Content-ID', imgid)
return msgImage
# MIMEMultipart 多部分組成
msg = MIMEMultipart('related') #像一個容器
msgtext = MIMEText("""
<html>
<img src="cid:dream">
<body style="background-color:PowderBlue;">
<h1>Look! Styles and colors</h1>
<p style="font-family:verdana;color:red">
This text is in Verdana and red</p>
<p style="font-family:times;color:green">
This text is in Times and green</p>
<p style="font-size:30px">This text is 30 pixels high</p>
<img src="cid:class">
</body>
</html>
"""
,_subtype='html', _charset='utf8')
msg.attach(msgtext)
msg.attach(addimg("1.PNG","class"))
msg.attach(addimg("2.PNG","dream"))
#xlsx 讀完文件 base64編碼 utf8的字符集
attach = MIMEText(open("1.xlsx","rb").read(),"base64","utf-8")
attach["Content-Type"] = "application/octet-stream" #附件類型
msg.attach(attach) #塞進容器
try:
msg['Subject'] = SUBJECT
msg['From'] = FROM
msg['To'] = TO
server = smtplib.SMTP(HOST)
server.login("[email protected]", "xxxxx") # xxxxx 是QQ郵箱的授權碼
server.sendmail(FROM, [TO], msg.as_string()) # 富文本轉字符串
server.quit()
print("Send OK")
except Exception:
print("Fail" + str(e))
郵件04:接收郵件 zmail
import zmail
server = zmail.server('[email protected]', 'frvhwkfykwfwbjhh')
mail = server.get_latest()
zmail.show(mail)
print(mail['subject']) # 只獲取標題
print(mail['id'])
print(mail['from'])
print(mail['to'])
print(mail['content_text'])
print(mail['content_html'])
# 保存了mail裏的全部附件,target_path 默認存放路徑 None 表當前
zmail.save_attachment(mail,target_path='C:/Users/acer/Desktop/垃圾文件',overwrite=True)
微信自動化
import itchat
from wxpy import * # 導入wxpy庫
@itchat.msg_register(TEXT) # @是函數的修飾,作用:如果收到是純文字信息,則執行下面的函數
def text_reply(msg):
print(msg.text)
reply_text = msg.text.replace('嗎?', '!')
print(reply_text)
return reply_text
@itchat.msg_register([PICTURE,RECORDING,ATTACHMENT,VIDEO]) # 如果是圖片,錄音,附件,視頻等
def download_files(msg):
print(msg)
msg.download(msg.fileName) # 以fileNmae命名 存到Python文件所在的文件夾下
bot = Bot() # 登錄微信web
xiaobin = bot.mps().search('小栤機器人')[0] # 機器人設爲小栤機器人, 關注微信公衆號:小栤機器人
group = bot.groups() # 找出所有羣聊,爲避免小冰跑到羣裏說話
chat = 0
@bot.register() # 接受所有消息
def forward_others(msg):
global chat
global group
global friend
# 指定羣聊
#group = bot.groups().search('Amy Agony')[0]
# 指定好友
#friend = bot.friends().search('好友名')[0]
# if msg.chat != xiaobin and msg.chat not in group: # 消息不是小冰的,也不是羣消息,則轉發給小冰,意思就和好友聊天
if msg.chat != xiaobin:
chat = msg.chat # 說話的人
msg.forward(xiaobin) # 轉發消息給小冰
else:
if msg.chat == xiaobin: # 說話對象是小冰
msg.forward(chat, suffix='--彬彬機器人') # 轉發消息給,對你說話的好友,並且在小冰的消息後面加上‘--XX’
bot.join()
itchat.auto_login(enableCmdQR=True,hotReload=True)
itchat.run() # 保證在一直運行
正則表達式
\b 代表單詞開頭或者結尾,不代表任何東西,只是標識位置,單詞只能包括數字、字母、漢子等,不包括特殊符號
^ 代表字符串的開頭
$ 代表字符串的結尾
\d 匹配一位數字
\d {數量} 匹配若干數量
\b\d{6}\b 單詞開始 中間6個數 單詞結束
\b\d{7,10}\b 大於等於7 小於等於10個數
\b\d{7,}\b 大於等於7
.匹配除換行符以外的任意字符
·111... 找以111開頭,後面三個任意
·111.* 找以111開頭,後面任意數
* 代表前面的部分重複任意次,可能爲0次
+ 代表前面的部分重複任意次,不可能爲0次
? 代表前面的部分0次或1次
\s 匹配任意的空白符,包括空格,製表符(Tab),換行符,中文全角空格等
\w 匹配字母或數字或下劃線或漢字等
( ) 分組 括號裏作爲一個整體
| 或
[\u4e00-\u9fa5]* 專門匹配所有漢字
[範圍] 某個範圍的字符[0-9][a-z][A-Z]
\W 匹配任意不是字母,數字,下劃線,漢字的字符
\S 匹配任意不是空白符的字符
\D 匹配任意非數字的字符
\B 匹配不是單詞開頭或結束的位置
[^範圍] 匹配除了範圍以外的任意字符