自動化辦公02 用openpyxl庫操作excel.xlsx文件(新版本)

目錄

一、文件讀操作

二、文件寫操作

三、修改單元格樣式


openpyxl 是一個處理Excel表格的第三方庫。openpyxl 庫可以處理Excel2010以后的電子表格格式,包括:xlsx/xlsm/xltx/xltm。

openpyxl教程

一、文件讀操作

工作簿(workbook): excel文件
工作表(worksheet): 工作簿中的每一個活動就是一個工作表
單元格(cell): 工作表中用來存儲數據的每個格子

注意:openpyxl只能操作新版本的excel文件(后綴為.xlsx)

1. 打開excel文件,得到一個工作簿對象

openpyxl.load_workbook(excel文件路徑)

2. 獲取工作簿相關信息

1)獲取工作簿中所有的工作表的名稱

變量 = 工作簿.sheetnames

2) 獲取所有的工作表,返回值是一個列表,列表中的元素是工作表對象

變量 = 工作簿.worksheets

3) 獲取指定工作表:

變量 = 工作簿對象[表名]

4) 獲取活躍表(當前處于選中狀態的工作表)

變量 = 工作簿.active

3. 獲取工作表的相關信息

1) 獲取數據的最大行數和列數
? ?工作表對象.max_row ? - ?獲取最大行數
? ?工作表對象.max_column ?- ? 獲取最大列數

2) 獲取指定單元格(注意這里寫的是行號和列號,都是從1開始)

變量 = 工作表.cell(row, column)

4. 獲取單元格相關信息

獲取單元格內容

變量 = 工作表.cell(row, column).value

import openpyxl
# 注意:openpyxl只能操作新版本的excel文件(后綴為.xlsx)# 工作簿(workbook): excel文件
# 工作表(worksheet): 工作簿中的每一個活動就是一個工作表
# 單元格(cell): 工作表中用來存儲數據的每個格子# 1. 打開excel文件,得到一個工作簿對象
# openpyxl.load_workbook(excel文件路徑)
workbook = openpyxl.load_workbook('files/2020年銷售數據.xlsx')# 2. 獲取工作簿相關信息
# 1)獲取工作簿中所有的工作表的名稱
names = workbook.sheetnames
print(names)# 2)獲取所有的工作表,返回值是一個列表,列表中的元素是工作表對象
all_sheet = workbook.worksheets
print(all_sheet)# 3)獲取指定工作表: 工作簿對象[表名]
sheet1 = workbook['data']
print(sheet1)# 4)獲取活躍表(當前處于選中狀態的工作表)
sheet2 = workbook.active
print(sheet2)# 3. 獲取工作表的相關信息
# 1)獲取數據的最大行數和列數
# 工作表對象.max_row   -  獲取最大行數
# 工作表對象.max_column  -   獲取最大列數
print(sheet1.max_row, sheet1.max_column)
print(sheet2.max_row, sheet2.max_column)# 2)獲取指定單元格
# 注意這里寫的是行號和列號,都是從1開始
cell1 = sheet1.cell(7, 4)
print(cell1)# 4. 獲取單元格相關信息
# 獲取單元格內容
result = cell1.value
print(result)

練習:

import openpyxl# 獲取工作簿
wb = openpyxl.load_workbook('files/2020年銷售數據.xlsx')
# 獲取工作表
datasheet = wb['data']#  案例:獲取第五行
max_col = datasheet.max_column  # 最大列數
data = []
for col in range(1, max_col + 1):cell = datasheet.cell(5, col)data.append(cell.value)
print(data)print('-----------------------分------割------線-----------------------')# 練習1:獲取data中第5列所有的數據
data1 = []
max_row = datasheet.max_row
for row in range(1, max_row + 1):cell = datasheet.cell(row, 5)data1.append(cell.value)
print(data1)print('-----------------------分------割------線-----------------------')# 練習2:獲取所有的品牌(列表去重)
brand_list = []
max_row = datasheet.max_row
for row in range(3, max_row + 1):value = datasheet.cell(row, 5).valueif value not in brand_list:brand_list.append(value)
print(brand_list)print('-----------------------分------割------線-----------------------')# 練習3:計算不同品牌的總的銷售額
# 方法1:使用上面已經搜索出來的品牌列表
sale = {}
for b in brand_list:sum1 = 0for row in range(3, max_row+1):if datasheet.cell(row, 5).value == b:sum1 += datasheet.cell(row, 8).valuesale[b] = sum1
print(sale)print('-----------------------分------割------線-----------------------')# print(type(datasheet.cell(row, 5).value))
# 方法2:
dic = {}
for row in range(3, max_row + 1):brand = datasheet.cell(row, 5).valuesale = datasheet.cell(row, 8).value# a.使用setdefault函數添加鍵值對# dic.setdefault(brand, 0)# dic[brand] += sale# b.使用if判斷# if brand in dic:#     dic[brand] += sale# else:#     dic[brand] = sale# c.使用.get()方法讀取第一個數據,則不會報錯dic[brand] = dic.get(brand, 0) + sale
print(dic)print('-----------------------分------割------線-----------------------')dic = {'八匹馬': 0, '皮皮蝦': 0, '壁虎': 0, '花花姑娘': 0, '啊喲喂': 0}
# dic = {}
max_row = datasheet.max_row
for row in range(3, max_row + 1):value = datasheet.cell(row, 5).valuefor d in list(dic.keys()):if value == d:dic[d] += datasheet.cell(row, 8).value
print(dic)print('-----------------------分------割------線-----------------------')# data2 = []
# for row in range(1, max_row):
#     temp = []
#     for col in range(1, max_col):
#         cell = datasheet.cell(row, col)
#         temp.append(cell.value)
#     data2.append(temp)
# print(data2)

二、文件寫操作

注意:所有寫操作在保存后才會有效

1. 新建工作簿(創建一個工作簿對象)

新建的工作簿中默認有一個工作表

變量 = openpyxl.Workbook()

2. 添加工作表

工作簿對象.create_sheet() ?- ?在工作簿的最后添加一個名字為Sheet?的工作表

工作簿對象.create_sheet(表名) ? ?- ? 在工作簿的最后添加一個名字為指定值的工作表

工作簿對象.create_sheet(表名,下標) ?- ?在指定下標對應位置添加名字為指定值的工作表

3. 刪除工作表

工作簿對象.remove(工作簿[表名])

del 工作簿[表名]?

4.修改單元格內容

工作表.cell(row, column, 修改/添加內容)

工作表.cell(row, column).value =?修改/添加內容

import openpyxl# 1. 新建工作簿(創建一個工作簿對象)
wb = openpyxl.Workbook()# 2. 添加工作表
wb.create_sheet()# 注意:添加工作表的邏輯 - 不存在才添加
if 'students' not in wb.sheetnames:wb.create_sheet('students')wb.create_sheet('teachers', 0)# 3. 刪除工作表
# 工作簿對象.remove(工作簿[表名])
# del 工作簿[表名]
if 'Sheet' in wb.sheetnames:wb.remove(wb['Sheet'])if 'Sheet1' in wb.sheetnames:del wb['Sheet1']# 4.修改單元格內容
students_sheet = wb['students']
students_sheet.cell(1, 1, '姓名')     # 方法1
students_sheet.cell(1, 2).value = '年齡'    # 方法2wb.save('files/school.xlsx')

案例:

import openpyxl# 1.將data數據寫深入到新建的excel中默認的工作表中的第二行
data = ['2020-1-1', '上海', '天貓', '205654-021', '八匹馬', 169, 85, 14365]# 準備工作表
wb1 = openpyxl.Workbook()
sheet = wb1.active# 寫入數據
for x in range(len(data)):value = data[x]col = x + 1sheet.cell(2, col, value)wb1.save('files/data1.xlsx')

練習:

?練習1:將data中的寫入到新建的表中的第3列中

# 練習1:將data中的寫入到新建的表中的第3列中
data = ['八匹馬', '皮皮蝦', '壁虎', '花花姑娘', '啊喲喂']
sheet1 = wb1.create_sheet('練習1')for x in range(len(data)):row = x + 1value = data[x]sheet1.cell(row, 3, value)wb1.save('files/data1.xlsx')

?練習2:將class1中所有學生的信息以合理方式保存到新建的'學生表'中

# 練習2:將class1中所有學生的信息以合理方式保存到新建的'學生表'中
class1 = {'name': 'python2402','address': '6教室','lecturer': {'name': '余婷', 'age': 18, 'gender': '女', 'qq': '726550822'},'head_teacher': {'name': '舒嚒嚒', 'age': 18, 'gender': '女', 'tel': '110'},'students': [{'name': 'stu1', 'age': 17, 'gender': '男', 'score': 89, 'link_man': {'name': '張三', 'tel': '122334'}},{'name': 'stu2', 'age': 28, 'gender': '女', 'score': 99, 'link_man': {'name': '李四', 'tel': '29833'}},{'name': 'stu3', 'age': 22, 'gender': '女', 'score': 65, 'link_man': {'name': '王五', 'tel': '22223'}},{'name': 'stu4', 'age': 22, 'gender': '男', 'score': 77, 'link_man': {'name': '趙六', 'tel': '6544'}},{'name': 'stu5', 'age': 21, 'gender': '男', 'score': 46, 'link_man': {'name': '何七', 'tel': '664322'}},{'name': 'stu6', 'age': 16, 'gender': '女', 'score': 82, 'link_man': {'name': '李八', 'tel': '12278334'}}]
}
data = ['姓名', '年齡', '性別', '分數', '聯系人', '聯系人電話']
sheet2 = wb1.create_sheet('學生表')
for x in range(len(data)):col = x + 1value = data[x]sheet2.cell(1, col, value)
student_list = class1['students']
for x in range(len(student_list)):stu = student_list[x]row = x + 2stu_value = list(stu.values())link_man = stu_value.pop()# print(stu_value,link_man)   # ['stu1', 17, '男', 89] {'name': '張三', 'tel': '122334'}stu_value.append(link_man['name'])stu_value.append(link_man['tel'])# print(stu_value)    # ['stu1', 17, '男', 89, '張三', '122334']for y in range(len(stu_value)):col = y + 1value = stu_value[y]sheet2.cell(row, col, value)
wb1.save('files/data1.xlsx')

練習3:將所有的0分都替換成補考;添加總分列,并且計算出每個學生的總分?

import openpyxl# 練習3:將所有的0分都替換成補考;添加總分列,并且計算出每個學生的總分
wb = openpyxl.load_workbook('files/data2.xlsx')sheet1 = wb['Sheet1']max_row = sheet1.max_row  # 19
max_col = sheet1.max_column  # 5
sheet1.cell(1, max_col + 1, '總分')
for row in range(2, max_row + 1):sum1 = 0for col in range(2, max_col + 1):value = sheet1.cell(row, col).valuesum1 += valueif value == 0:sheet1.cell(row, col).value = '補考'sheet1.cell(row, max_col + 1).value = sum1wb.save('files/data2.xlsx')

三、修改單元格樣式

import openpyxl
from openpyxl.styles import Font, PatternFill, Border, Side, Alignment# 1.打開工作簿
wb = openpyxl.load_workbook('files/school.xlsx')
sheet = wb.active# 2.設置單元格字體樣式
"""
Font(name=None,      # 字體名,可以用字體名字的字符串strike=None,    # 刪除線,True/Falsecolor=None,     # 文字顏色size=None,      # 字號bold=None,      # 加粗, True/Falseitalic=None,    # 傾斜,Tue/Falseunderline=None # 下劃線, 'singleAccounting', 'double', 'single', 'doubleAccounting'
)
"""
# 1) 創建字體對象
font1 = Font(size=20,italic=True,color='ff0000',bold=True,strike=True
)
# 2) 設置指定單元格的字體
# 單元格對象.font = 字體對象
sheet['B2'].font = font1# 3. 設置單元格填充樣式
"""
PatternFill(fill_type=None,		# 設置填充樣式: 'darkGrid', 'darkTrellis', 'darkHorizontal', 'darkGray', 'lightDown', 'lightGray', 'solid', 'lightGrid', 'gray125', 'lightHorizontal', 'lightTrellis', 'darkDown', 'mediumGray', 'gray0625', 'darkUp', 'darkVertical', 'lightVertical', 'lightUp'start_color=None	# 設置填充顏色
)
"""
# 1) 設置填充對象
fill = PatternFill(fill_type='solid',start_color='ffff00'
)
# 2)設置單元格的填充樣式
# 單元格對象.fill = 填充對象
sheet['B2'].fill = fill# 4. 設置單元格對齊樣式
# 1)創建對象
al = Alignment(horizontal='right',     # 水平方向:center, left, rightvertical='top'       # 垂直方向: center, top, bottom
)
# 2) 設置單元格的對齊方式
sheet['B2'].alignment = al# 5. 設置邊框樣式
# 1)設置邊對象(四個邊的邊可以是一樣的也可以不同,如果不同就創建對個Side對象)
side = Side(border_style='thin', color='0000ff')
# 2) 設置邊框對象
# 這兒的left、right、top、bottom表示的是邊框的四個邊,這兒四個邊使用的是一個邊對象
bd = Border(left=side, right=side, top=side, bottom=side)
# 3)設置單元格的邊框
sheet['B2'].border = bd# 6.設置單元格的寬度和高度
# 設置指定列的寬度
sheet.column_dimensions['A'].width = 20
# 設置指定行的高度
sheet.row_dimensions[1].height = 45# 7. 保存
wb.save('files/school.xlsx')

簡單示例:

"""
Author:  余婷
Create Time: 2024/5/28 16:58
你只管努力,時間會給你驚喜!
"""
import openpyxl
from openpyxl.styles import Font, PatternFill, Border, Side, Alignmentwb = openpyxl.load_workbook('files/data1.xlsx')
sheet1 = wb['Sheet']# 1. 設置字體
# 1)創建字體對象
f1 = Font(name='楷體',color='990033',size=20,bold=True
)
# 2)設置單元格的字體
sheet1.cell(2, 2).font = f1# 2. 填充單元格
# 1)創建填充對象
fill1 = PatternFill(fill_type='solid',start_color='FFFFCC'
)
# 2)設置單元格的填充樣式
sheet1.cell(2, 2).fill = fill1# 3. 設置邊框樣式
# 1)創建邊對象
s1 = Side(border_style='medium',color='663366'
)
s2 = Side(border_style='mediumDashDot',color='009966'
)
# 2)創建邊框對象
border1 = Border(bottom=s1,top=s1,left=s2,right=s2
)# 3)設置單元格的邊框
sheet1.cell(2, 2).border = border1wb.save('files/data1.xlsx')

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/22812.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/22812.shtml
英文地址,請注明出處:http://en.pswp.cn/web/22812.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

word自帶公式編輯器技巧

1.實現多行公式換行且對齊 1.1 準備階段(默認Unicode模式) 進入公式編輯模式,輸入\eqarray,緊接著按下空格鍵輸入空格,如下 1.2 實現換行和對齊 將要編輯的公式輸入到括號內 &:實現位置對齊 &…

104.網絡游戲逆向分析與漏洞攻防-裝備系統數據分析-篩選與裝備有關的數據包

免責聲明:內容僅供學習參考,請合法利用知識,禁止進行違法犯罪活動! 如果看不懂、不知道現在做的什么,那就跟著做完看效果,代碼看不懂是正常的,只要會抄就行,抄著抄著就能懂了 內容…

【Android】PopupWindow焦點控制方式解析

touchable 指定pop是否可觸摸 當設置為false時,pop的所有觸摸事件會直接傳到下方Window,pop會關閉 focusable 指定pop是否可獲得焦點 當設置為true時,如果pop中包含可獲取焦點的控件,舊的Window會自動失去焦點 另外&#xf…

postman教程-15-前置腳本

上一小節我們學習了Postman生成隨機數的方法,本小節我們講解一下Postman前置腳本的使用方法。 Postman中的前置腳本(Pre-request Script)允許你在發送請求之前運行JavaScript代碼。這可以用于修改請求頭、查詢參數、請求體等,或者…

合作伙伴中心是什么?

目錄 合作伙伴中心介紹 合作伙伴中心的功能 合作伙伴中心介紹 合作伙伴中心,作為Microsoft合作伙伴與Microsoft及其客戶之間關系管理的重要工具,為合作伙伴提供了簡化業務流程的便利。通過合作伙伴中心,合作伙伴可以輕松地管理Microsoft賬戶和用戶,與客戶互動,建立與其他…

web學習筆記(六十二)

目錄 1.鍵盤事件 2.KeepAlive 3.組件傳值 3.1 兄弟組件傳值 3.2 組件樹傳值 3.3 發布訂閱者傳值 1.鍵盤事件 keydown表示鍵盤事件&#xff0c;在不加修飾符的情況下&#xff0c;點擊鍵盤上的任意位置都可以觸發鍵盤事件&#xff0c; <template><div><!--…

word 無法自動檢測拼寫

word 有時候不能分辨是哪種語言,比如把英語錯認為法語 。 例如&#xff1a;Interlaayer spacace,發現誤認為是法語。 1、選中Interlaayer spacace 2、點擊語言下拉按鈕 選擇設置校對語言 發現校對語言為法語 3、手動修改校對語言為英語&#xff0c;并點擊確認。 4、發現現…

什么是 Batch Normalization 批標準化和全連接層

Batch Normalization 神經元在經過激活函數之后會處于飽和狀態&#xff0c;無論后續怎么變化都不會再起作用。 每一層都會進行batch normalization的處理&#xff01; without normalization 會導致數據分布再飽和區 全連接層&#xff1a; 全連接層(fully connected layers&a…

十四、返回Insert操作自增索引值

分為兩部分&#xff0c;解析初始化和使用 拿含有selectkey標簽的insert語句解析來說 解析部分 1.解析時看有沒有selectkey標簽&#xff0c;有的話先解析selectkey的內容&#xff0c;包括對其SQL的解析并封裝成一個MappedStatement和創建KeyGenerator放入configuration中 2.解…

SpringBoot集成ClickHouse,含集成kerberos認證

需求&#xff1a;項目中要使用ClickHouse做數據庫。 具體實現&#xff1a; 1&#xff0c;在pom.xml中添加clickhouse依賴 <!-- https://mvnrepository.com/artifact/com.clickhouse/clickhouse-jdbc --> <dependency><groupId>com.clickhouse</groupId&g…

SpringBoot前端URL訪問本地磁盤文件

SpringBoot前端通過 URL訪問本地磁盤文件&#xff0c;其實就是 SpringBoot訪問web中的靜態資源的處理方式。 SpringBoot 訪問web中的靜態資源&#xff1a;https://blog.csdn.net/qq_42402854/article/details/90295079 首先&#xff0c;我們知道瀏覽器訪問本地磁盤文件的方式為…

LLM的基礎模型5:Embedding模型

大模型技術論文不斷&#xff0c;每個月總會新增上千篇。本專欄精選論文重點解讀&#xff0c;主題還是圍繞著行業實踐和工程量產。若在某個環節出現卡點&#xff0c;可以回到大模型必備腔調或者LLM背后的基礎模型新閱讀。而最新科技&#xff08;Mamba,xLSTM,KAN&#xff09;則提…

面試高頻問題----4

一、redis和mysql一致性怎么保證&#xff1f; 1.編寫刪除緩存的接口&#xff0c;在更新數據庫的同時&#xff0c;調用刪除緩存的接口刪除緩存中的數據。 2.消息隊列&#xff1a;ActiveMQ、消息通知&#xff1b;將更新操作發送到消息隊列中&#xff0c;順序更新mysql和redis。…

三十七、openlayers官網示例Earthquakes Heatmap解析——在地圖上加載熱力圖

官網demo地址&#xff1a; Earthquakes Heatmap 這篇主要介紹了熱力圖HeatmapLayer HeatmapLayer 是一個用于在地圖上顯示熱力圖的圖層類型&#xff0c;通常用于表示地理數據中的密度或強度。例如&#xff0c;它可以用來顯示地震、人口密度或其他空間數據的熱點區域。在這個示…

Siemens-NXUG二次開發-創建倒斜角特征、邊倒圓角特征、設置對象顏色、獲取面信息[Python UF][20240605]

Siemens-NXUG二次開發-創建倒斜角特征、邊倒圓角特征、設置對象顏色、獲取面信息[Python UF][20240605] 1.python uf函數1.1 NXOpen.UF.Modeling.AskFaceData1.2 NXOpen.UF.Modeling.CreateChamfer1.3 NXOpen.UF.ModlFeatures.CreateBlend1.4 NXOpen.UF.Obj.SetColor 2.實體目標…

lib庫和dll庫的介紹和使用

lib&#xff08;靜態庫&#xff09; 靜態庫定義&#xff1a;.lib文件是靜態庫文件&#xff0c;包含了在編譯時被鏈接到目標程序的代碼。使用靜態庫時&#xff0c;庫的代碼會被復制到最終生成的可執行文件中。優點&#xff1a; 性能&#xff1a;由于庫代碼在編譯時就被集成到可…

分布式架構與分布式理論

文章目錄 分布式架構什么是分布式系統分布式系統特性分布式系統面臨的問題 分布式理論數據一致性CAP理論BASE理論 分布式架構 什么是分布式系統 分布式系統是一個硬件或軟件組件分布在不同的網絡計算機上&#xff0c;彼此之間僅僅通過消息傳遞進行通信和協調的系統。 所謂分…

Vue的APP實現下載文件功能,并將文件保存到手機中

Vue的APP實現下載文件功能&#xff0c;并將文件保存到手機中 文字說明后臺核心代碼前臺核心代碼運行截圖項目鏈接 文字說明 本文介紹Vue實現的APP&#xff0c;將文件下載并保存到手機中&#xff0c;為系統提供導出功能&#xff1b;同時支持導入&#xff0c;即選擇本地的文件后&…

Ubuntu18.04 文件管理器無法打開的解決方法

問題&#xff1a;打開Ubuntu虛擬機發現文件管理器無法打開,一直在轉圈圈 在終端中輸入 nautilus 顯示如下信息 nautilus: symbol lookup error: /usr/lib/x86_64-linux-gnu/tracker-2.0/libtracker-data.so.0: undefined symbol: sqlite3_bind_pointer 解決措施&#xff1a…

LabVIEW 反向工程的實現與法律地位

什么是LabVIEW反向工程&#xff1f; 反向工程是指從現有的應用程序或軟件中推導出其設計、架構、代碼等信息的過程。對于LabVIEW而言&#xff0c;反向工程涉及從現有的VI&#xff08;虛擬儀器&#xff09;文件、項目或應用程序中提取出設計思路、功能模塊、算法實現等。 LabV…