欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

python自動(dòng)化辦公操作excel的示例詳解

 更新時(shí)間:2024年03月24日 15:59:57   作者:z先生的備忘錄  
這篇文章主要為大家詳細(xì)介紹了如何利用python來(lái)實(shí)現(xiàn)自動(dòng)化辦公操作excel文件進(jìn)行各種樣式展示,并自動(dòng)發(fā)送文件給"老板"的郵箱,希望對(duì)大家有所幫助

本文涉及的python庫(kù)版本信息如下:

!pip install pyjanitor==0.26.0
!pip install plottable==0.1.5 
!pip install mpl_font==1.1.0
!pip install  xlsxwriter==3.2.0
!pip install  openpyxl==3.1.2

excel相關(guān)的背景知識(shí)

Excel中常見(jiàn)的文件格式(xls, xlsx, xlsm, xlsb, xla, xlam等等);在操作excel類常見(jiàn)的有三大數(shù)據(jù)對(duì)象,分別如下:

  • WorkBook:工作簿對(duì)象
  • Sheet:表單對(duì)象
  • Cell:表格對(duì)象

本文主要使用XlsxWriter庫(kù)和openpyxl庫(kù)來(lái)實(shí)現(xiàn)自動(dòng)化操作excel文件數(shù)據(jù)和樣式。下面進(jìn)入我們的正題~

對(duì)單個(gè)單元格進(jìn)行操作

# 導(dǎo)入xlsxwriter庫(kù),用于創(chuàng)建Excel文件
import xlsxwriter

# 創(chuàng)建一個(gè)名為"demo.xlsx"的工作簿(即Excel文件)
workbook = xlsxwriter.Workbook("demo.xlsx")

# 在工作簿中添加一個(gè)名為'sheet1'的工作表
worksheet = workbook.add_worksheet(name='sheet1')

# 在B1單元格寫(xiě)入數(shù)值500
worksheet.write("B1", 500)

# 在第0行第1列等價(jià)于B1單元格寫(xiě)入數(shù)值500
worksheet.write(0, 1, 500)

# 在B2單元格寫(xiě)入公式,計(jì)算B1單元格數(shù)值的平方
worksheet.write_formula("B2", "{=SUM(B1*B1)}")

# 設(shè)置A列的寬度為40
worksheet.set_column("A:A", 40)

# 創(chuàng)建兩個(gè)格式對(duì)象,分別設(shè)置縮進(jìn)級(jí)別為1和2
indent1 = workbook.add_format({"indent": 1})  # 第1級(jí)縮進(jìn)格式
indent2 = workbook.add_format({"indent": 2})  # 第2級(jí)縮進(jìn)格式

# 使用不同的縮進(jìn)格式在A1和A2單元格寫(xiě)入文本,并設(shè)置相應(yīng)的縮進(jìn)
worksheet.write("A1", "This text is indented 1 level", indent1)  # A1單元格內(nèi)容縮進(jìn)1級(jí)
worksheet.write("A2", "This text is indented 2 levels", indent2)  # A2單元格內(nèi)容縮進(jìn)2級(jí)

# 關(guān)閉并保存工作簿
workbook.close()

將二維list數(shù)組插入excel中

# 定義表格的表頭信息以及相關(guān)數(shù)據(jù)
headings = ["Number", "Batch 1", "Batch 2"]  # 表頭列表
data = [                      # 數(shù)據(jù)列表
    [2, 3, 4, 5, 6, 7],       # 第一行:編號(hào)
    [40, 40, 50, 30, 25, 50], # 第二行:批次1的數(shù)據(jù)
    [30, 25, 30, 10, 5, 10],   # 第三行:批次2的數(shù)據(jù)
]
# 創(chuàng)建一個(gè)加粗格式樣式以突出顯示表頭
bold = workbook.add_format({"bold": 1})
# 將表頭信息寫(xiě)入到第一行(從A1開(kāi)始)
worksheet.write_row("A1", headings, bold)
# 將數(shù)據(jù)按列依次寫(xiě)入工作表
worksheet.write_column("A2", data[0])  # 寫(xiě)入編號(hào)數(shù)據(jù)到A列
worksheet.write_column("B2", data[1])  # 寫(xiě)入批次1的數(shù)據(jù)到B列
worksheet.write_column("C2", data[2])  # 寫(xiě)入批次2的數(shù)據(jù)到C列
# 關(guān)閉并保存工作簿
workbook.close()

設(shè)置單元格樣式

# 創(chuàng)建三種不同對(duì)角線樣式的格式:
format1 = workbook.add_format({"diag_type": 1}) # - format1: 對(duì)角線類型1
format2 = workbook.add_format({"diag_type": 2}) # - format2: 對(duì)角線類型2
format3 = workbook.add_format({"diag_type": 3}) # - format3: 對(duì)角線類型3
# 創(chuàng)建一個(gè)帶有紅色對(duì)角線、對(duì)角線類型為3且邊框線型為7的格式
format4 = workbook.add_format({
    "diag_type": 3,
    "diag_border": 7,
    "diag_color": "red",
})
# 使用不同對(duì)角線樣式寫(xiě)入單元格內(nèi)容
worksheet.write("B1", "Text", format1)  # 使用format1樣式寫(xiě)入
worksheet.write("B2", "Text", format2)  # 使用format2樣式寫(xiě)入
worksheet.write("B3", "Text", format3)  # 使用format3樣式寫(xiě)入
worksheet.write("B4", "Text", format4)  # 使用format4樣式寫(xiě)入
# 創(chuàng)建一個(gè)居中并對(duì)齊、加粗的單元格格式
centered_format = workbook.add_format({"align": 'center', 'valign': 'vcenter', "bold": True})
# 使用居中對(duì)齊格式寫(xiě)入單元格內(nèi)容
worksheet.write("A2", "Text", centered_format) 
# 最后關(guān)閉并保存工作簿
workbook.close()

插入圖表到excel文件中

# 在工作表的A1單元格嵌入圖片"demo.png"
# 注意:此操作默認(rèn)會(huì)按照?qǐng)D片原始尺寸插入
worksheet.insert_image("A1", "demo.png")
# 注:若要實(shí)現(xiàn)圖片自適應(yīng)單元格大小,可能需要在插入圖片時(shí)直接指定寬度和高度。
worksheet.insert_image("A1", "demo.png", {"x_scale": 0.5, "y_scale": 0.5})
# 最后,關(guān)閉并保存工作簿
workbook.close()

插入超鏈接在單元格中

# 設(shè)置第一列(A列)的寬度為30
worksheet.set_column("A:A", 30)
# 創(chuàng)建一個(gè)樣本格式:紅色字體、加粗、下劃線、字號(hào)為12
red_format = workbook.add_format({
    "font_color": "red",  # 文字顏色設(shè)為紅色
    "bold": 1,            # 字體加粗
    "underline": 1,       # 文字下劃線
    "font_size": 12,      # 字號(hào)為12
})
# 寫(xiě)入一些超鏈接
# A1單元格包含一個(gè)隱式格式的超鏈接至 http://www.python.org/
worksheet.write_url("A1", "http://www.python.org/")
# A3單元格包含一個(gè)顯示文本為"Python Home"的超鏈接至 http://www.python.org/
worksheet.write_url("A3", "http://www.python.org/", string="Python Home")
# A5單元格包含一個(gè)提示信息為"Click here"的超鏈接至 http://www.python.org/
worksheet.write_url("A5", "http://www.python.org/", tip="Click here")
# A7單元格包含一個(gè)應(yīng)用了紅色格式的超鏈接至 http://www.python.org/
worksheet.write_url("A7", "http://www.python.org/", red_format)
# A9單元格包含一個(gè)電子郵件鏈接至jmcnamara@cpan.org,顯示文本為"Mail me"
worksheet.write_url("A9", "mailto:jmcnamara@cpan.org", string="Mail me")
# 最后,關(guān)閉并保存工作簿
workbook.close()

顯示迷你圖

# 示例數(shù)據(jù)集,每個(gè)列表代表一行數(shù)據(jù)
data = [
    [-2, 2, 3, -1, 0],  # 第一行數(shù)據(jù)
    [30, 20, 33, 20, 15],  # 第二行數(shù)據(jù)
    [1, -1, -1, 1, -1],  # 第三行數(shù)據(jù)
]
# 將示例數(shù)據(jù)寫(xiě)入到工作表中
worksheet.write_row("A1", data[0])  # 寫(xiě)入第一行數(shù)據(jù)
worksheet.write_row("A2", data[1])  # 寫(xiě)入第二行數(shù)據(jù)
worksheet.write_row("A3", data[2])  # 寫(xiě)入第三行數(shù)據(jù)
# 在F1單元格添加一條帶標(biāo)記點(diǎn)的默認(rèn)折線型sparkline圖表(基于A1到E1區(qū)域的數(shù)據(jù))
worksheet.add_sparkline("F1", {"range": "Sheet1!A1:E1", "markers": True})
# 在F2單元格添加一條柱狀sparkline圖表,采用非默認(rèn)風(fēng)格(基于A2到E2區(qū)域的數(shù)據(jù))
# 同時(shí)顯示第一個(gè)點(diǎn)和最后一個(gè)點(diǎn)
worksheet.add_sparkline("F2", {
    "range": "Sheet1!A2:E2", 
    "type": "column", 
    "style": 12, 
    "first_point": True, 
    "last_point": True
})
# 在F3單元格添加一條勝敗(Win/Loss)類型的sparkline圖表(基于A3到E3區(qū)域的數(shù)據(jù))
# 高亮顯示負(fù)值區(qū)域,并顯示最高點(diǎn)和最低點(diǎn)
worksheet.add_sparkline("F3", {
    "range": "Sheet1!A3:E3", 
    "type": "win_loss", 
    "negative_points": True,
    "high_point": True, 
    "low_point": True
})
# 最后,關(guān)閉并保存工作簿
workbook.close()

設(shè)置單元格保護(hù)防止修改

# 創(chuàng)建兩種具有保護(hù)屬性的單元格格式:
# - unlocked: 不鎖定的格式,可以編輯
# - hidden: 隱藏格式,公式不可見(jiàn)
unlocked = workbook.add_format({"locked": False})  # 創(chuàng)建不鎖定的格式
hidden = workbook.add_format({"hidden": True})     # 創(chuàng)建隱藏公式的格式
# 設(shè)置A列的寬度為40,以便更好地展示文本
worksheet.set_column("A:A", 40)
# 開(kāi)啟工作表保護(hù)模式
worksheet.protect()  # 默認(rèn)情況下所有單元格都會(huì)被鎖定
# 分別寫(xiě)入鎖定、解鎖及隱藏公式的單元格內(nèi)容
worksheet.write("A1", "Cell B1 is locked. It cannot be edited.")  # B1默認(rèn)鎖定
worksheet.write("A2", "Cell B2 is unlocked. It can be edited.")
worksheet.write("A3", "Cell B3 is hidden. The formula isn't visible.")
# 寫(xiě)入具有不同保護(hù)屬性的公式
worksheet.write_formula("B1", "=1+2")  # 默認(rèn)鎖定,無(wú)法編輯公式
worksheet.write_formula("B2", "=1+2", unlocked)  # 公式所在單元格已解鎖,可以編輯
worksheet.write_formula("B3", "=1+2", hidden)  # 公式所在單元格被隱藏,公式不可見(jiàn)
# 關(guān)閉并保存工作簿
workbook.close()

顯示色階圖

這里使用openpyxl庫(kù)來(lái)實(shí)現(xiàn)色階圖輸出到excel文件中。

from openpyxl import Workbook
from openpyxl.formatting.rule import ColorScaleRule
# 創(chuàng)建一個(gè)新的工作簿
workbook = Workbook()
# 選擇或創(chuàng)建一個(gè)工作表
worksheet = workbook.active
worksheet.title = 'Color Scale Test'
# 假設(shè)我們有以下一列測(cè)試數(shù)據(jù)
data = [30, 60, 90, 120, 150, 180, 210, 240, 270, 300]
# 將數(shù)據(jù)寫(xiě)入單元格
for row, value in enumerate(data, 1):
    ws.cell(row=row, column=1, value=value)
# 定義色階規(guī)則
rule = ColorScaleRule(start_type='min', start_color='FF0000',
                      mid_type='percentile', mid_value=50, mid_color='FFFF00',
                      end_type='max', end_color='00FF00')
# 應(yīng)用色階到數(shù)據(jù)所在列 (這里是第一列A)
worksheet.conditional_formatting.add('A1:A{}'.format(len(data)), rule)

# 保存Excel文件
wb.save('demo.xlsx')

顯示條件格式圖

這里使用openpyxl庫(kù)來(lái)實(shí)現(xiàn)條件格式圖輸出到excel文件中。

# 導(dǎo)入所需庫(kù)
from openpyxl import Workbook
from openpyxl.formatting.rule import ColorScaleRule, DataBarRule
from openpyxl.styles.colors import Color
# 1. 創(chuàng)建一個(gè)新的Excel工作簿
workbook = Workbook()
# 2. 選擇或獲取工作簿的第一個(gè)工作表,并設(shè)置其標(biāo)題
worksheet = workbook.active
worksheet.title = 'Color Scale Test'
# 3. 假設(shè)有如下一列測(cè)試數(shù)據(jù)
data = [30, 60, 90, 120, 150, 180, 210, 240, 270, 300]
# 4. 將測(cè)試數(shù)據(jù)寫(xiě)入Excel工作表的A列,從第二行開(kāi)始(Excel表格的第一行默認(rèn)為表頭)
for row_index, value in enumerate(data, 1):  # 使用enumerate()函數(shù),索引從1開(kāi)始
    worksheet.cell(row=row_index, column=1, value=value)  # 設(shè)置單元格內(nèi)容
# 5. 定義數(shù)據(jù)所在的區(qū)域,即A2到A10這一列(由于enumerate()從1開(kāi)始,所以此處是A1到A10)
data_range = worksheet['A1:A10']
# 6. 創(chuàng)建一個(gè)DataBarRule實(shí)例,用于在指定范圍內(nèi)應(yīng)用數(shù)據(jù)條(顏色條)條件格式
rule = DataBarRule(
    start_type='min',  # 數(shù)據(jù)條的起點(diǎn)基于該列的最小值
    end_type='max',   # 數(shù)據(jù)條的終點(diǎn)基于該列的最大值
    color=Color(rgb='00FF00'),  # 數(shù)據(jù)條的顏色為綠色
    showValue=True,           # 顯示數(shù)據(jù)條旁邊的實(shí)際數(shù)值
    minLength=None,            # 數(shù)據(jù)條的最小長(zhǎng)度將由程序自動(dòng)計(jì)算,保持默認(rèn)值
    maxLength=None             # 數(shù)據(jù)條的最大長(zhǎng)度將由程序自動(dòng)計(jì)算,保持默認(rèn)值
)
# 7. 將數(shù)據(jù)條條件格式規(guī)則應(yīng)用到指定的單元格區(qū)域
worksheet.conditional_formatting.add('A1:A10', rule)  # 將規(guī)則應(yīng)用到A1到A10這一列
# 8. 保存已應(yīng)用條件格式的工作簿至Excel文件
workbook.save('demo.xlsx')  # 文件名:demo.xlsx

利用calamine讀取excel大文件數(shù)據(jù)性能測(cè)試

# 生成一個(gè)50000行、5列的隨機(jī)數(shù)二維數(shù)組
data = np.random.random(size=(50000, 5))
# 將生成的隨機(jī)數(shù)組轉(zhuǎn)換為Pandas DataFrame,這是一個(gè)表格型數(shù)據(jù)結(jié)構(gòu),便于進(jìn)行數(shù)據(jù)分析和操作
pf = pd.DataFrame(data)
# 利用openpyxl引擎寫(xiě)入excel文件
%timeit pf.to_excel("demo.xlsx",index=False, engine= 'openpyxl')
# 4.33 s ± 16.1 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
# 利用calamine引擎讀excel文件
%timeit pd.read_excel("demo.xlsx", engine= 'calamine')
# 344 ms ± 1.76 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
# 利用openpyxl引擎讀excel文件
%timeit pd.read_excel("demo.xlsx", engine= 'openpyxl')
# 3.33 s ± 26.7 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

通過(guò)實(shí)驗(yàn)看出:在5萬(wàn)行*5數(shù)據(jù)中,通過(guò)calamine引擎讀excel文件比傳統(tǒng)openpyxl快9倍多。

將生成的excel文件發(fā)送到'老板'的郵箱

以163為例,打開(kāi)郵箱設(shè)置對(duì)應(yīng)的smtp服務(wù)

在開(kāi)啟的同時(shí)會(huì)彈出‘授權(quán)密碼’,下面會(huì)用到。

編寫(xiě)python代碼將excel文件發(fā)送指定郵箱

import smtplib
from email.mime.multipart import MIMEMultipart
from email.mime.base import MIMEBase
from email.mime.text import MIMEText
from email.utils import COMMASPACE
from email import encoders
import os

# 配置SMTP服務(wù)器和登錄信息
smtp_server = 'smtp.163.com' #使用163郵箱作為發(fā)送服務(wù)器,也可以使用其他郵箱
smtp_port = 25 #端口號(hào)
username = 'your_email@163.com' #你的163郵箱,也可以使用其他郵箱
password = 'xxxxx' #你郵箱對(duì)應(yīng)smtp的授權(quán)密碼
sender_email = 'your_email@163.com'
receiver_emails = ['recipient1@qq.com',]  # 收件人列表

# 創(chuàng)建MIMEMultipart對(duì)象以便容納多部分郵件內(nèi)容
msg = MIMEMultipart()
msg['From'] = sender_email
msg['To'] = COMMASPACE.join(receiver_emails)
msg['Subject'] = '測(cè)試文件'

# 創(chuàng)建郵件正文
body = '這是今天的測(cè)試文檔.'
msg.attach(MIMEText(body))

# 打開(kāi)并讀取Excel文件
filename = 'demo.xlsx'  # 要發(fā)送的Excel文件路徑
with open(filename, 'rb') as f:
    attachment = MIMEBase('application', 'vnd.openxmlformats-officedocument.spreadsheetml.sheet')
    attachment.set_payload(f.read())
    encoders.encode_base64(attachment)  # 對(duì)附件內(nèi)容進(jìn)行base64編碼
    attachment.add_header('Content-Disposition', f'attachment; filename="{os.path.basename(filename)}"')
    msg.attach(attachment)

# 連接SMTP服務(wù)器并發(fā)送郵件
try:
    server = smtplib.SMTP(smtp_server, smtp_port)
    server.starttls()  # 如果使用的是非安全端口,需要啟用TLS加密
    server.login(username, password)
    server.sendmail(sender_email, receiver_emails, msg.as_string())
    server.quit()
    print("Email sent successfully.")
except Exception as e:
    print("Error occurred while sending email:", e)

效果展示

以上就是python自動(dòng)化辦公操作excel的示例詳解的詳細(xì)內(nèi)容,更多關(guān)于python自動(dòng)化操作excel的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 使用python的pyplot繪制函數(shù)實(shí)例

    使用python的pyplot繪制函數(shù)實(shí)例

    今天小編就為大家分享一篇使用python的pyplot繪制函數(shù)實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-02-02
  • Python opencv醫(yī)學(xué)處理的實(shí)現(xiàn)過(guò)程

    Python opencv醫(yī)學(xué)處理的實(shí)現(xiàn)過(guò)程

    這篇文章主要介紹了Python opencv醫(yī)學(xué)處理的實(shí)現(xiàn)過(guò)程,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-05-05
  • Python模擬登錄微博并爬取表情包

    Python模擬登錄微博并爬取表情包

    前段時(shí)間爬取的知乎表情包用完了嗎?今天再帶大家去微博爬一波表情包吧.文中有非常詳細(xì)的代碼示例,廢話不多說(shuō),讓我們愉快地開(kāi)始吧,需要的朋友可以參考下
    2021-06-06
  • Python中所有子圖標(biāo)簽Legend顯示問(wèn)題記錄

    Python中所有子圖標(biāo)簽Legend顯示問(wèn)題記錄

    在Python中,利用matplotlib創(chuàng)建的子圖可以很容易地添加圖例,無(wú)論是為每個(gè)子圖單獨(dú)添加,還是統(tǒng)一在一起,本文詳細(xì)介紹了如何在多個(gè)子圖中顯示圖例,包括全局圖例的顯示、圖例樣式的調(diào)整和圖例位置的調(diào)整等,需要的朋友可以參考下
    2024-12-12
  • python實(shí)現(xiàn)掃雷游戲的示例

    python實(shí)現(xiàn)掃雷游戲的示例

    這篇文章主要介紹了python實(shí)現(xiàn)掃雷游戲的示例,幫助大家更好的理解和學(xué)習(xí)python,感興趣的朋友可以了解下
    2020-10-10
  • pycharm如何設(shè)置自動(dòng)生成作者信息

    pycharm如何設(shè)置自動(dòng)生成作者信息

    這篇文章主要介紹了pycharm如何設(shè)置自動(dòng)生成作者信息,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-02-02
  • python將多個(gè)py文件和其他文件打包為exe可執(zhí)行文件

    python將多個(gè)py文件和其他文件打包為exe可執(zhí)行文件

    這篇文章主要介紹了python將多個(gè)py文件和其他文件打包為exe可執(zhí)行文件,通過(guò)準(zhǔn)備要打包的工程文件展開(kāi)詳情,需要的小伙伴可以參考一下
    2022-05-05
  • python雙向鏈表原理與實(shí)現(xiàn)方法詳解

    python雙向鏈表原理與實(shí)現(xiàn)方法詳解

    這篇文章主要介紹了python雙向鏈表原理與實(shí)現(xiàn)方法,結(jié)合實(shí)例形式分析了Python雙向鏈表的定義、以及節(jié)點(diǎn)的判斷、遍歷、添加、刪除等相關(guān)操作技巧,需要的朋友可以參考下
    2019-12-12
  • Python實(shí)現(xiàn)提取JSON數(shù)據(jù)中的鍵值對(duì)并保存為.csv文件

    Python實(shí)現(xiàn)提取JSON數(shù)據(jù)中的鍵值對(duì)并保存為.csv文件

    這篇文章主要為大家詳細(xì)介紹了如何基于Python實(shí)現(xiàn)讀取JSON文件數(shù)據(jù),并將JSON文件中指定的鍵值對(duì)數(shù)據(jù)轉(zhuǎn)換為.csv格式文件,感興趣的小伙伴可以了解下
    2023-09-09
  • Python萬(wàn)字深入內(nèi)存管理講解

    Python萬(wàn)字深入內(nèi)存管理講解

    內(nèi)存管理是指在程序的運(yùn)行過(guò)程中,分配內(nèi)容和回收內(nèi)存的過(guò)程。如果只分配,不回收,電腦上那點(diǎn)內(nèi)存很快就被用光。幸運(yùn)的是,Python和Java等高級(jí)語(yǔ)言會(huì)自動(dòng)管理內(nèi)存的分配和回收
    2022-07-07

最新評(píng)論