Python 自動化辦公

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 匹配不是單詞開頭或結束的位置
[^範圍] 匹配除了範圍以外的任意字符
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章