Python : 一文學會辦公自動化(Word、Excel、PPT)

自動化:

1946年提出,被運用於軍事等方面。

辦公自動化指的是現在辦公和計算機技術結合起來的新型的辦公的方式。

“高效的工作”正是自動化解決的問題/


辦公自動化的分類:

  • 操作Excel: 就業數據分析等
  • 操作Word: 考試系統生成Word試卷等
  • 操作PPT : 用戶畫像分析等

使用的模塊:

  • xlrd模塊
  • xlwt模塊
  • smtplib模塊
  • pywin32模塊
  • python-ppt模塊
  • python-docx模塊
  • pymysql模塊
  • xlsxwriter模塊

1. xlrd模塊

  • xlrd是第三方模塊,讀取Excel表格數據
  • xlrd常用函數
  • xlrd操作Excel列
  • xlrd操作Excel行
  • xlrd操作Excel單元格
  • 安裝: 
    pip install xlrd -i http://pypi.douban.com/simple --trusted-host pypi.douban.com

    查看當前電腦已經安裝的模塊:

    pip list

     

Excel基礎:

示例1. xlrd讀取excel數據:

import xlrd


# 1.讀取Excel
# 1.1 讀取文件
data = xlrd.open_workbook('17軟件工程學業成績排名.xls')

# 1.2 工作表是否加載
# print(data.sheet_loaded(0)) # 索引爲0的工作表

# 1.3 卸載已經加載的工作表
# data.unload_sheet(0)

# 1.4 找到要操作的工作表
# print(data.sheets()) # 得到所有的工作表
# print(data.sheets()[0]) # 訪問第一個工作表的對象
# print(data.sheet_by_name('Sheet1')) # 根據名字去獲取工作表
# print(data.sheet_by_index(0)) # 根據索引去獲取工作表
# print(data.sheet_names()) # 獲取當前所有工作表的名字
# print(data.nsheets) # 當前有多少工作表

# 1.5 操作excel行
# sheet = data.sheet_by_index(0) # 獲取第一個工作表
# print(sheet.nrows) # 獲取當前sheet下的"有效"行數
# print(sheet.row(0)) # 取到第1行
# print(sheet.row(1)) # 取到第2行
# print(sheet.row_types(3)) # 獲取第4行的數據類型(輸出的結果中:0表示空,1表示字符串,2表示number, 3表示date, 4表示boolean ,5表示error)
# print(sheet.row(4)[1]) # 獲取第5行第2列的數據對象
# print(sheet.row(4)[1].value) # 獲取第5行第2列的數據值
# print(sheet.row_values(4)) # 獲取第5行所有列的數據值
# print(sheet.row_len(4)) # 獲取第5行有多少列

# 1.6 操作Excel列
# sheet = data.sheet_by_index(0)  # 獲取第一個工作表
# print(sheet.ncols) # 獲取工作表的有效列數
# print(sheet.col(1)) # 拿到第二列的數據對象
# print(sheet.col(1)[9].value) # 獲取第2列的第10個元素的值
# print(sheet.col_values(1)) # 拿到第2列中所有的數據
# print(sheet.col_types(1)) # 查看第2列的每個單元格數據類型(輸出的結果中:0表示空,1表示字符串,2表示number, 3表示date, 4表示boolean ,5表示error)

# 1.7 操作Excel單元格
# sheet = data.sheet_by_index(0)  # 獲取第一個工作表
# print(sheet.cell(9, 1)) # 第10列,第2行單元格的數據對象
# print(sheet.cell_type(9, 1))# 第10列,第2行單元格的數據類型(輸出的結果中:0表示空,1表示字符串,2表示number, 3表示date, 4表示boolean ,5表示error)
# print(sheet.cell(9, 1).ctype)# 第10列,第2行單元格的數據類型(輸出的結果中:0表示空,1表示字符串,2表示number, 3表示date, 4表示boolean ,5表示error)
# print(sheet.cell(9, 1).value) # 第10列,第2行單元格的數據值
# print(sheet.cell_value(9, 1)) # 第10列,第2行單元格的數據值

 

2. xlwt模塊

  • xlwt是第三方模塊,寫入Excel表格數據
  • 支持創建工作表、指定單元格、指定單元格樣式等
  • xlwt支持excel的03~2013版Excel。
  • 保存格式只支持xls格式,不支持07版以後的xlsx格式
  • 安裝:
    pip install xlwt

     

示例2. xlwt寫入excel數據:

import xlwt

# 寫入Excel步驟:創建工作簿、創建工作表、填充工作表內容、保存文件

# 指定樣式
titleStyle = xlwt.XFStyle() # 初始化樣式
titleFont = xlwt.Font()
titleFont.name = '宋體'
titleFont.bold = True
titleFont.height = 11 * 20 # 20是衡量單位,11是字號
titleFont.colour_index = 0x35 # 這裏的顏色不是普通的rgb,要參考XFStyle這個類裏面提供的_colour_map_text屬性
titleStyle.font = titleFont
# 單元格對齊方式
cellalign = xlwt.Alignment()
cellalign.horz = 0x02 #(水平方向) 這裏的對齊方式參考Alignment類的具體屬性的值(也可以xlwt.Alignment.xxx)
cellalign.vert = 0x01 #(垂直方向) 這裏的對齊方式參考Alignment類的具體屬性的值
titleStyle.alignment = cellalign
# 邊框
borders = xlwt.Borders()
borders.right = xlwt.Borders.DASHED
borders.bottom = xlwt.Borders.DOTTED
titleStyle.borders = borders

# 定義第一列的背景顏色
dateStyle = xlwt.XFStyle()
bgcolor = xlwt.Pattern()
bgcolor.pattern = xlwt.Pattern.SOLID_PATTERN
bgcolor.pattern_fore_colour = 22 # 背景顏色
dateStyle.pattern = bgcolor

# 1. 創建工作簿
wb = xlwt.Workbook()

# 2. 創建工作表
ws = wb.add_sheet('工作表1')

# 3. 填充數據
ws.write_merge(0, 1, 0, 5, "2020年人民幣兌換表", style=titleStyle) # 單元格合併: 前2行合併,前6列合併

# 3.1 寫入數據
data = (("日期", "拉拉","啦啦啦", "哈哈", "哈哈哈"),("05/27/2020", 100000, 999999, 666666, 6.3333),("05/27/2020", 100000, 999999, 666666, 6.3333),("05/27/2020", 100000, 999999, 666666, 6.3333),("05/27/2020", 100000, 999999, 666666, 6.3333))
for i, item in enumerate(data):
    for j, val in enumerate(item):
        if j==0:
            ws.write(i + 2, j, val, dateStyle)
        else:
            ws.write(i + 2, j, val) # 需要行和列的索引(+2是爲了跳過前2行,這裏我們的前2行有數據了)

# 4. 創建第2個工作表,添加圖片
wsimage = wb.add_sheet('蘭彩雲')
# 寫入圖片(bitmap格式)
wsimage.insert_bitmap("meinv.bmp", 0, 0) # 從第一行第一列進行插入

# 4.保存
wb.save("2020-money.xls")

結合xlrd和pymysql就可以把excel的數據組裝執行導出數據到數據庫的功能

封裝pymysql:

import pymysql

class dbhelper():

    def __init__(self, host, port, user, passwd, db, charset ='utf-8'):
        self.host = host
        self.port = port
        self.user = user
        self.passwd = passwd
        self.db = db
        self.charset = charset

    # 創建一個連接
    def connection(self):
        # 1. 創建連接
        self.conn = pymysql.connect(host=self.host, port=self.port,user=self.user, passwd=self.passwd, db=self.db, charset=self.charset)
        # 2.創建遊標
        self.cur = self.conn.cursor()

    # 關閉連接
    def closeconnection(self):
        self.cur.close()
        self.conn.close()
        
    # 查詢一條數據
    def getonedata(self, sql):
        try:
            self.connection()
            self.cur.execute(sql)
            result = self.cur.fetchone()
            self.closeconnection()
        except Exception:
            print(Exception)
        return result

 

3 xlsxwriter模塊(推薦)

  • xlsxwriter是python的第三方模塊,用於向生成的Excel表格插入數據、圖表等操作
  • 最終生成xlsx格式的Excel文件
  • 功能比xlwt模塊更加強大,支持更多的Excel功能
  • 100%兼容Excel xlsx文件、支持Excel 2003 2007等版本
  • 處理速度更快,支持大文件寫入
  • 寫入時可以啓用內存優化模式來快速寫入
  • 不足:不支持讀取和修改Excel文件(讀取Excel文件可以使用xlrd模塊)
  • 安裝:
    pip install xlsxwriter

     

示例3. xlsxwriter寫入excel數據:

import xlsxwriter


wb = xlsxwriter.Workbook('yinlei.xlsx')

# 設置style格式樣式
cell_format = wb.add_format({'bold': True})

cell_format1 = wb.add_format()
cell_format1.set_bold()
cell_format1.set_font_color('orange')
cell_format1.set_font_size(15)
cell_format1.set_align('center')

cell_format2 = wb.add_format()
cell_format2.set_bg_color('#FF00FF')

# 創建工作表
sheet = wb.add_worksheet("yinleisheet")

# 寫入
# sheet.write_string() # 還有很多write_xxx()

# 寫入單個單元格
sheet.write(0, 0, "2020年", cell_format) # 會幫我們將python的數據類型映射到excel支持的類型方法中

# 合併單元格
sheet.merge_range(1, 0, 2, 2, '全國女朋友彩禮統計', cell_format=cell_format1) # 指定起始的行和列和結束的行、列
data = (
    ["四川", 5, 15],
    ["江西", 30, 50],
    ["樂山", 0, 10],
)
sheet.write_row(3, 0, ["地區", "最低金額(單位:萬)", "最高金額(單位:萬)"], cell_format=cell_format2)
for index, item  in enumerate(data):
    sheet.write_row(index+4, 0, item)

# 寫入excel公式進行統計數據
sheet.write(7, 1, "=sum(B5:B7)")
sheet.write(7, 2, "=sum(C5:C7)")

# 插入超鏈接
sheet.write_url(9, 0, "http://yinleilei.com", string="跳轉到個人網站")

# 插入圖片
sheet.insert_image(10, 0, "plant.png")

# 生成圖表
chart = wb.add_chart({'type': 'line'}) ## 折線圖:line
chart.set_title({'name': '全國女朋友彩禮統計'})
# X軸Y軸的描述信息
chart.set_x_axis({'name': '地區'})
chart.set_y_axis({'name': '金額'})
# 圖表填充數據
chart.add_series({
    'name': '最低彩禮',
    'categories': '=yinleisheet!$A$5:$A$7', # 用Excel公式取得數據A5-A7的單元格,或者通過索引的方式獲取數據像下面的values一樣
    'values': ['yinleisheet', 4, 1, 6, 1] # 指定工作表,選取起始行是4,起始列1到起始行6,起始列爲1之間的數據
})

chart.add_series({
    'name': '最高彩禮',
    'categories': '=yinleisheet!$A$5:$A$7', # 用Excel公式取得數據A5-A7的單元格,或者通過索引的方式獲取數據像下面的values一樣
    'values': ['yinleisheet', 4, 2, 6, 2],# 指定工作表,選取起始行是4,起始列1到起始行6,起始列爲1之間的數據
    'data_labels': {'value': True}, # 每個柱狀圖上顯示數字
})

sheet.insert_chart('E4', chart=chart)

# 關閉文件
wb.close()

更多圖表配置可查看官網文檔

擴展:使用smtplib發送郵件

一個qq郵箱可以有多個授權碼

import smtplib
from email.mime.text import MIMEText
from email.mime.multipart import  MIMEMultipart
from email.mime.application import  MIMEApplication

# 發送郵件和附件

host_server = 'smtp.qq.com' # 主機地址(qq郵箱爲例 )
sender = '[email protected]'# 發件人郵箱(記得郵箱要取開啓stmp服務並獲取授權碼)
# 發件人郵箱的密碼(qq郵箱的授權碼)
code = '你的授權碼'
# 收件人郵箱
# user1 = '[email protected]'
user2 = '[email protected]'
# users = ['[email protected]', '[email protected]']
# users.append(user1)
# users.append(user2)
# 準備郵件數據:標題、內容、附件
mail_title = 'python自動化辦公測試'
mail_content = '梅花香自苦寒來~'
attachment = MIMEApplication(open('yinlei.xlsx', 'rb').read())
attachment.add_header('Content-Disposition','attachment', filename='自動辦公測試文件')

#SMTP
smtp = smtplib.SMTP(host_server)
smtp.login(sender, code )
msg = MIMEMultipart() # 帶郵件的實例
msg['Subject'] = mail_title
msg['From'] = sender
msg['To'] = user2
msg.attach(MIMEText(mail_content))# 正文內容
msg.attach(attachment)# 添加附件
smtp.sendmail(sender, user2, msg.as_string())

4 python-docx模塊

  • word的自動化
  • 針對手動創建批量制式Word文件、修改現有大量word文件存在的共性問題
  • python-docx是第三方模塊,用於自動化生成和修改word文檔
  • 安裝:
    pip install python-docx

     

示例4. python-docx讀寫word

from docx import Document
from docx.shared import Pt,RGBColor
from docx.enum.style import  WD_STYLE_TYPE

# Word文檔字體和Pt字體大小的對照表
# 八號    5
# 七號    5.5
# 小六    6.5
# 六號    7.5
# 小五    9
# 五號    10.5
# 小四    12
# 四號    14
# 小三    15
# 三號    16
# 小二    18
# 二號    22
# 小一    24
# 一號    26
# 小初    36
# 初號    42

# 1. 創建一個文檔對象

document = Document() #新建文檔對象
# Document('已經存在的.docx')#讀取已經存在的文檔

# 2. 寫入內容
document.add_heading('我愛你', level=2) # 標題,級別爲h2

# word文檔的樣式處理(可以統一樣式)[內置樣式或者自定義樣式]
style = document.styles.add_style('textstyle', WD_STYLE_TYPE.PARAGRAPH)
# print(style.style_id)
# print(style.name)
style.font.size = Pt(5)

#刪除樣式
# document.styles['textstyle'].delete()

# 段落
p1 = document.add_paragraph('我愛你,像風走過了3000裏! 如果某一天,你不喜歡我了,我希望先開口的人是我,而不是你。渣男不渣,只是他們的心碎成了很多片。',style='textstyle')
p1.insert_paragraph_before("baby, i want to say you :")
format = p1.paragraph_format
format.left_indent = Pt(20) # 縮進
format.right_indent = Pt(20) # 縮進
# 首行縮進
format.first_line_indent = Pt(20)
#設置行間距
format.line_spacing = 1.5

#追加段落
run = p1.add_run('耳旁軟語是你,聲嘶力竭也是你。愛的是你,離開的也是你。曾共度兩三年的是你,而今老死不相往來也是你。')
run.font.size = Pt(12)
run.font.name = '微軟雅黑'
run.font.color.rgb=RGBColor(235,33,24)

run1 = p1.add_run('只要最後是你就好。')
run1.bold = True
run1.font.underline = True
run1.font.italic = True


# 插入圖片(指定寬高)
document.add_picture('plant.png', Pt(20), Pt(30))

# 插入表格
table = document.add_table(rows=1, cols=3, style='Medium List 1') #表格樣式這裏我使用的是內置樣式,可以查閱官方文檔
# 構建表格
header_cells = table.rows[0].cells
header_cells[0].text = '地區'
header_cells[1].text = '最低彩禮'
header_cells[2].text = '最高彩禮'
# 爲表格插入數據
data =(
    ["四川", 5, 15],
    ["江西", 30, 50],
    ["樂山", 0, 10],
)
for item in data:
    rows_cells = table.add_row().cells # 添加並構建表格
    rows_cells[0].text = str(item[0])
    rows_cells[1].text = str(item[1])
    rows_cells[2].text = str(item[2])


# 獲取word文檔中的表格
print(len(document.tables[0].rows)) # 打印總行數
print(len(document.tables[0].columns)) # 打印總列數
#cell
print(document.tables[0].cell(0,2).text)#獲取表格第一行第3列的內容



# 3. 保存文檔
document.save('yinlei.docx')

 

擴展:Word轉PDF(pywin32模塊包含了windows幾乎所有API)

 

from win32com.client import constants, gencache
import os

# 單個文件的轉換
def createPdf(wordPath, pdfPath):
    word = gencache.EnsureDispatch("Word.Application") # 創建Word程序對象
    doc = word.Documents.Open(wordPath, ReadOnly=1) # 讀取word文件
    # 轉換方法
    doc.ExportAsFixedFormat(pdfPath, constants.wdExportFormatPDF) # 更多信息訪問office開發人員中心文檔
    word.Quit()


# createPdf('E:\PycharmProjects\WorkAuto\yinlei.docx','E:\PycharmProjects\WorkAuto\yinlei.pdf' )

# 多個文件的轉換
# print(os.listdir('.')) #當前文件夾下的所有文件
wordfiles = []
for file in os.listdir('.'):
    if file.endswith(('.doc','.docx')):
        wordfiles.append(file)

# print(wordfiles)
for file in wordfiles:
    filepath = os.path.abspath(file)
    index = filepath.rindex('.')
    pdfpath = filepath[:index]+'.pdf'
    createPdf(filepath, pdfpath)

5 python-pptx模塊

  • 針對批量PPT的創建和修改i、大量圖片、文字的寫入、準確無誤的插入圖標等數據
  • python-pptx是第三方模塊、自動生成和更新PowerPoint(.pptx)文件
  • 安裝:
    pip install python-pptx

     

內置模板:

示例5. python-pptx操作ppt

 

 

import pptx
from pptx.util import Inches, Pt  # 英寸
from pptx.enum.shapes import MSO_SHAPE
from pptx.dml.color import RGBColor

from pptx.chart.data import CategoryChartData
from pptx.enum.chart import XL_CHART_TYPE
from pptx.enum.chart import XL_LEGEND_POSITION
# 步驟:
# 1. 得到演示文稿的對像
prs = pptx.Presentation()
# 修改現有的ppt文件Presentation('xxx.pptx')

# 2. 寫入操作
slide = prs.slides.add_slide(prs.slide_layouts[0]) #插入一張幻燈片 slide_layouts是微軟ppt軟件內置的ppt模板集合,通過索引訪問具體使用哪個內置模板
prs.slides.add_slide(prs.slide_layouts[1])
prs.slides.add_slide(prs.slide_layouts[2])

# 刪除幻燈片
print(len(prs.slides))
del prs.slides._sldIdLst[1]
print(len(prs.slides))

# 給某個幻燈片操作
text1 = slide.shapes.add_textbox(Inches(5),Inches(5),Inches(5),Inches(5))
text1.text = 'i am yinlei'
p1 = text1.text_frame.add_paragraph()
p1.text = '我是段落1'
p1.add_run().text = '結束'
title_shape = slide.shapes.title
title_shape.text = 'title one'
slide.shapes.placeholders[1].text = 'title two'

# 添加圖形到ppt(自選圖形)
shape = slide.shapes.add_shape(MSO_SHAPE.RECTANGLE,Inches(2),Inches(2),Inches(5),Inches(3))
# 設置圖形的填充和邊框
fill = shape.fill
fill.solid()
fill.fore_color.rgb=RGBColor(255,0,0)
line = shape.line
line.color.rgb = RGBColor(55,3,5)
line.width = Pt(2)

# 添加表格
table = slide.shapes.add_table(3,3,Inches(2),Inches(2),Inches(4),Inches(2)).table
table.cell(1,0).text = 'name'
table.cell(1,1).text = 'age'
table.cell(1,2).text = 'class'
table.cell(2,0).text = 'yinlei'
table.cell(2,1).text = '21'
table.cell(2,2).text = '1班'
# 合併單元格
cell = table.cell(0,0)
cell1 = table.cell(0,2)
cell.merge(cell1)
table.cell(0,0).text='student info'
#取消合併
# print(cell.is_merge_origin) # 是否合併的
# cell.split()

# 插入圖表
chart_data = CategoryChartData()
chart_data.categories = ['月份','一月份','二月份']
chart_data.add_series('2020', (300,400,500))
chart_data.add_series('2019', (500,300,200))
chart = slide.shapes.add_chart(XL_CHART_TYPE.LINE, Inches(2),Inches(2),Inches(6),Inches(4),chart_data).chart
chart.has_title = True
chart.chart_title.text_frame.text = '銷售額'
chart.has_legend = True # 顯示圖例
chart.legend.position = XL_LEGEND_POSITION.RIGHT

# 3. 保存ppt文件
prs.save('yinlei.pptx')

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章