python第三方庫——openpyxl

Bokeh是一個Python庫,用于對Excel 2010 xlsx/xlsm/xltx/xltm文件進行讀寫操作。

官網對該工具的介紹為:

openpyxl is a Python library to read/write Excel 2010 xlsx/xlsm/xltx/xltm files.It was born from lack of existing library to read/write natively from Python the Office Open XML format.All kudos to the PHPExcel team as openpyxl was initially based on PHPExcel.
官網地址為:https://foss.heptapod.net/openpyxl/openpyxl

本文檔只說明某些接口的使用,作為對該工具的學習總結。

文件的打開,創建,保存

創建一個工作簿

from openpyxl import Workbookwb = Workbook()

打開一個已經存在的工作簿

from openpyxl import load_workbookwb = load_workbook('sample.xlsx')

在load_workbook()中存在幾個可選參數:

  • data_only=True表示只讀取單元格的值,而不是公式
  • read_only=True表示以只讀模式打開Excel文件,這樣可以提高讀取速度
  • keep_vba=True表示保留Excel文件中的宏代碼

保存為工作薄

wb.save('sample.xlsx')

創建一個工作表

ws = wb.create_sheet("Mysheet") # insert at the end (default)
ws = wb.create_sheet("Mysheet", 0) # insert at first position
ws = wb.create_sheet("Mysheet", -1) # insert at the penultimate position

激活某個工作表

ws = wb.active

該值默認為0,除非手動修改活動工作表,否則通過該方法只會獲取第一個工作表的引用。不然要明確指明激活的工作表,下面代碼就是獲取名字為new_sheet的工作表的引用:

ws = wb["new_sheet"]

重命名工作表

在使用Workbook創建工作簿時,會自動創建一個名為Sheet的工作表。并且在工作薄中創建的工作表會采用自動命名的形式,如Sheet1、Sheet2、Sheet3。如果需要對該名稱進行修改,可以使用title屬性進行修改,如下所示:

ws.title = "New Title"

獲取工作薄中所有工作表的名稱

wb.sheetnames

或者采用遍歷工作薄的形式:

for sheet in wb:print(sheet.title)

復制工作表

new_ws = wb.copy_worksheet(ws)

單元格的操作

獲取單元格的引用

cell = ws["A4"]
cell = ws.cell(row=4, column=1)

但需注意的是,ws["A4"]的引用方式和excel中單元格的表示方式相同,但是使用cell()方法時,row和column的索引都是從1開始的數字,而不是字母,這意味著,需要將A4轉換為(4,1)。

獲取單元格的值

value = ws["A4"].value
value = ws.cell(row=4, column=1).value

單元格賦值

ws["A4"] = 10
ws["A4"].value = 10
ws.cell(row=4, column=1, value=10)

當創建工作薄時,雖然它包含一個工作表,但是該工作表中并不包含任何單元格。只有在訪問單元格時,才會創建它們。因此使用ws.cell(row=4, column=1)雖然沒有賦值,但是也會在內存中創建單元格,因此要盡量避免對空單元格的引用。

插入整行或整列、刪除整行或整列

ws.insert_rows(7, 3) ? ? ? ? ? ?# 表示在原來idx=7的行前插入3行,默認一行
ws.insert_cols(2, 3) ? ? ? ? ? ?# 表示在原來idx=2的列前插入3列,默認一列
ws.append([1, 2, 3]) ? ? ? ? ? ?# 表示在最后一行插入數據,不足的部分用None填充ws.delete_cols(6, 3) ? ? ? ? ? ?# 表示刪除idx=6的列,刪除3列,默認一列
ws.delete_rows(6, 3) ? ? ? ? ? ?# 表示刪除idx=6的行,刪除3行,默認一行

訪問整列或整行

cells = ws["A"] ? ? ? ? ? ? ?# 獲取A列的所有單元格
cells = ws[1] ? ? ? ? ? ? ? ?# 獲取第一行的所有單元格

訪問矩形區域

cells = ws["A:C"] ? ? ? # 獲取A到C列的所有單元格
cells = ws[1:3] ? ? ? ? # 獲取第1到3行的所有單元格
cells = ws["A1:C3"] ? ? # 獲取A1到C3的所有單元格

但需要注意,對于整列或整行的訪問返回的是一維元組,而對于矩形區域的訪問返回的是二維元組。因此,對于矩形區域的訪問,需要使用兩層循環來遍歷。

或者可以通過ws.iter_rows()或ws.iter_cols()來獲取單元格:

for rows in ws.iter_rows():for cell in rows:print(cell.value)for cols in ws.iter_cols(min_row=1, max_col=3, max_row=2):for cell in cols:print(cell.value)for values in ws.iter_cols(min_row=1, max_col=3, max_row=2, values_only=True):for value in values:print(value)

從上面可以看出

  • iter_rows()和iter_cols()方法都可以接收min_row、max_row、min_col、max_col、values_only這四個參數
  • 這幾個參數都是可選的,如果不指定,則默認為min_row=1、max_row=ws.max_row、min_col=1、max_col=ws.max_column,values_only=False
  • iter_rows()方法按行遍歷,iter_cols()方法按列遍歷
  • values_only = True表示只迭代值

另外ws.iter_rows()無參數的調用即可遍歷所有行,ws.iter_cols()無參數的調用即可遍歷所有列。等效于下面的用法:

for rows in ws.rows:for cell in rows:print(cell.value)for cols in ws.columns:for cell in cols:print(cell.value)

不過因為性能問題,只讀模式下ws.iter_cols()方法和ws.columns不可用。

而如果只是想要獲取單元格中的內容,則可以使用ws.values:

for values in ws.values:for value in values:print(value)

從結果可以看出,ws.values是按行迭代的。

移動區域

ws.move_range("D4:F10", rows=-1, cols=2) ? ? ? ?# 表示將D4:F10的單元格向上移動一行,向右移動兩列,即移動到E3:G9

合并/拆分單元格

ws.merge_cells('A2:D2')
ws.unmerge_cells('A2:D2')# 與下面的設置等效
ws.merge_cells(start_row=2, start_column=1, end_row=4, end_column=4)
ws.unmerge_cells(start_row=2, start_column=1, end_row=4, end_column=4)

而對比合并后的單元格的格式設置,只需要對合并單元格的左上角單元格進行設置即可。

字體、顏色、樣式

默認設置為:

from openpyxl.styles import PatternFill, Border, Side, Alignment, Protection, Fontfont = Font(name='Calibri',size=11,bold=False,italic=False,vertAlign=None,underline='none',strike=False,color='FF000000')fill = PatternFill(fill_type=None,start_color='FFFFFFFF',end_color='FF000000')border = Border(left=Side(border_style=None,color='FF000000'),right=Side(border_style=None,color='FF000000'),top=Side(border_style=None,color='FF000000'),bottom=Side(border_style=None,color='FF000000'),diagonal=Side(border_style=None,color='FF000000'),diagonal_direction=0,outline=Side(border_style=None,color='FF000000'),vertical=Side(border_style=None,color='FF000000'),horizontal=Side(border_style=None,color='FF000000'))alignment=Alignment(horizontal='general',vertical='bottom',text_rotation=0,wrap_text=False,shrink_to_fit=False,indent=0)protection = Protection(locked=True,hidden=False)

設置字體、顏色、大小

from openpyxl.styles import Font# 斜體,紅色,20號,字體為Arial,加粗
ft = Font(name='Arial', size=20, bold=True, italic=True, color='FF0000')ws["A4"].font = ftwb.save('sample.xlsx')

設置單元格填充

from openpyxl.styles import PatternFill# 紅色填充
ft = PatternFill(fill_type='solid', fgColor='FF0000')ws["A3"].fill = ftwb.save('sample.xlsx')

設置對齊方式

from openpyxl.styles import Alignment# 左對齊,上對齊
al = Alignment(horizontal='left', vertical='top')ws["A3"].alignment = alwb.save('sample.xlsx')

在選擇對齊方式中:

  • horizontal的參數選擇范圍為:'fill', 'right', 'justify', 'general', 'distributed', 'center', 'centerContinuous', 'left'
  • vertical的參數選擇范圍為:'bottom', 'top', 'distributed', 'justify', 'center'

單元格邊框

from openpyxl.styles import Border, Sideleft_side = Side(border_style='thin', color='FF0000')
right_side = Side(border_style='thin', color='00FF00')
top_side = Side(border_style='thin', color='0000FF')
bottom_side = Side(border_style='thin', color='FFFF00')ws["A3"].border = Border(left=left_side, right=right_side, top=top_side, bottom=bottom_side)wb.save('sample.xlsx')

border_style可以為:'dashDot', 'mediumDashDot', 'slantDashDot', 'thick', 'dashed', 'hair', 'mediumDashDotDot', 'medium', 'thin', 'dotted', 'double', 'mediumDashed', 'dashDotDot'

應用到整行或整列

col = ws.column_dimensions['A']
col.font = Font(bold=True)row = ws.row_dimensions[1]
row.font = Font(underline="single")

列寬和行高

在openpyxl中,column_dimensions和rows_dimensions都是一個字典,key為列或行的索引,value為ColumnDimension或RowDimension對象。該對象為表格中每行或每列的信息,主要包括:

  • width 屬性:獲取或設置列的寬度。
  • hidden 屬性:獲取或設置列的隱藏狀態。
  • bestFit 屬性:獲取或設置列的自動調整大小。
  • style 屬性:獲取或設置列的樣式。
  • number_format 屬性:獲取或設置列的數字格式。
col = ws.column_dimensions['A']
col.width = 20.0
col.hidden = False
col.bestFit = True
col.number_format = "0.00"row = ws.row_dimensions[1]
row.height = 40.0
row.hidden = False
row.bestFit = True
row.number_format = "0.00"

頁面設置

工作表中頁面設置可以通過page_setup屬性進行設置,page_setup屬性是一個PageSetup對象,該對象包含了頁面設置的各種屬性,如紙張大小、方向、頁邊距等。

以下是一些常用的 PageSetup 類的屬性和方法:

  • orientation 屬性:設置頁面的方向,可以是 PageSetup.ORIENTATION_PORTRAIT(縱向)或 PageSetup.ORIENTATION_LANDSCAPE(橫向)。
  • paperSize 屬性:設置紙張大小,可以是預定義的常量,如 PageSetup.PAPERSIZE_A4。
  • leftMargin、rightMargin、topMargin、bottomMargin 屬性:設置工作表的左、右、上、下頁邊距。
  • printArea 屬性:設置打印區域。

示例代碼如下:

# 設置頁面方向為橫向
ws.page_setup.orientation = ws.ORIENTATION_LANDSCAPE# 設置紙張大小為A4
ws.page_setup.paperSize = ws.PAPERSIZE_A4# 設置邊距
ws.page_setup.leftMargin = 0.5
ws.page_setup.rightMargin = 0.5
ws.page_setup.topMargin = 0.5
ws.page_setup.bottomMargin = 0.5# 設置打印區域
ws.page_setup.printArea = 'A1:F20'# 保存工作簿
wb.save("sample.xlsx")

樣式保存

上面的格式配置可以保存為NamedStyle對象,然后應用到單元格上:

from openpyxl.styles import NamedStylemy_style = NamedStyle(name='my_style')
my_style.font = Font(bold=True, size=20)
my_style.alignment = Alignment(horizontal='center', vertical='center')wb.add_named_style(my_style) ? ? ? ?# 創建樣式后,可以將該樣式注冊到工作簿中
# ws["A1"].style = my_style ? ? ? ? ? # 將樣式賦值給單元格也可以完成自動注冊# 注冊完成后,就可以通過以下方式直接使用樣式
ws["A1"].style = "my_style"

內建樣式

openpyxl中還存在很多內建樣式,用戶可以直接通過樣式名稱使用,詳情可查看openpyxl.styles.builtins。

‘Normal’:就是無樣式

Number formats:

  • ‘Comma’
  • ‘Comma [0]’
  • ‘Currency’
  • ‘Currency [0]’
  • ‘Percent’

Informative:

  • ‘Calculation’
  • ‘Total’
  • ‘Note’
  • ‘Warning Text’
  • ‘Explanatory Text’

Text styles:

  • ‘Title’
  • ‘Headline 1’
  • ‘Headline 2’
  • ‘Headline 3’
  • ‘Headline 4’
  • ‘Hyperlink’
  • ‘Followed Hyperlink’
  • ‘Linked Cell’

Comparisons:

  • ‘Input’
  • ‘Output’
  • ‘Check Cell’
  • ‘Good’
  • ‘Bad’
  • ‘Neutral’

Highlights:

  • ‘Accent1’
  • ‘20 % - Accent1’
  • ‘40 % - Accent1’
  • ‘60 % - Accent1’
  • ‘Accent2’
  • ‘20 % - Accent2’
  • ‘40 % - Accent2’
  • ‘60 % - Accent2’
  • ‘Accent3’
  • ‘20 % - Accent3’
  • ‘40 % - Accent3’
  • ‘60 % - Accent3’
  • ‘Accent4’
  • ‘20 % - Accent4’
  • ‘40 % - Accent4’
  • ‘60 % - Accent4’
  • ‘Accent5’
  • ‘20 % - Accent5’
  • ‘40 % - Accent5’
  • ‘60 % - Accent5’
  • ‘Accent6’
  • ‘20 % - Accent6’
  • ‘40 % - Accent6’
  • ‘60 % - Accent6’
  • ‘Pandas’

圖表

圖表實際使用的并不多,這里只是簡單介紹一下,詳細的可以參考官方文檔。

from openpyxl.chart import BarChart, Series, Reference# 創建一個柱狀圖,指定圖表類型為col,標題為Bar Chart,橫坐標為time,縱坐標為value
chart = BarChart()
chart.type = "col"
chart.title = "Bar Chart"
chart.x_axis.title = 'time'
chart.y_axis.title = 'value'
chart.legend = None# 設置數據來源
data = Reference(ws, min_col=2, min_row=1, max_col=3, max_row=6)
cats = Reference(ws, min_col=1, min_row=2, max_row=6)# 將數據添加到圖表中
chart.add_data(data, titles_from_data=True)
chart.set_categories(cats)# 將圖表添加到E1單元格中
ws.add_chart(chart, "E1")
wb.save('sample.xlsx')

上面內容只是對openpyxl的一些常見的部分進行了簡單的介紹,其他更多內容,如過濾、排序、數據有效性驗證等,可以參考官方文檔。

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

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

相關文章

使用Java實現漢諾塔問題

文章目錄 漢諾塔問題 今天和大家來看看漢諾塔問題,這也是一個經典的算法 漢諾塔問題 分治算法經典問題:漢諾塔問題 漢諾塔的傳說 漢諾塔:漢諾塔(又稱河內塔)問題是源于印度一個古老傳說的益智玩具。大梵天創造世界的…

Git 克隆子目錄

背景 有時候,一個倉庫太大(包含很多個工程),下載費時,又占電腦的空間。 如何只下載其中一個工程(子目錄)呢? 稀疏檢出(Spare Checkout) git 的 Spare Chec…

Java項目-瑞吉外賣Day5

視線新增套餐功能: 創建SetmealDish,SetmealDto類,與相關的mapper,service,serviceImpl,controller類。 Setmeal表示套餐,SetmealDish表示套餐對應的菜品。 交互過程: 前端請求&a…

TCP 和 UDP 區別? 2、TCP/IP 協議涉及哪幾層架構? 3、描述下 TCP 連接 4 次揮手的過程?為什么要 4 次揮手?

文章目錄 1、TCP 和 UDP 區別?2、TCP/IP 協議涉及哪幾層架構?3、描述下 TCP 連接 4 次揮手的過程?為什么要 4 次揮手?4、計算機插上電源操作系統做了什么?5、Linux 操作系統設備文件有哪些? 1、TCP 和 UDP …

RE2文本匹配調優實戰

引言 在RE2文本匹配實戰的最后,博主說過會結合詞向量以及其他技巧來對效果進行調優,本篇文章對整個過程進行詳細記錄。其他文本匹配系列實戰后續也會進行類似的調優,方法是一樣的,不再贅述。 本文所用到的詞向量可以在Gensim訓練…

2023年度盤點:智能汽車、自動駕駛、車聯網必讀書單

【文末送書】今天推薦幾本自動駕駛領域優質書籍 前言 2023年,智能駕駛和新能源汽車行業仍然有著肉眼可見的新進展。自動駕駛技術繼續嘗試從輔助駕駛向自動駕駛的過渡,更重要的是相關技術成本的下降。根據《全球電動汽車展望2023》等行業報告&#xff0c…

進程、容器與虛擬機的區別

進程、容器與虛擬機 參考:關于進程、容器與虛擬機的區別,你想知道的都在這! 進程、容器與虛擬機的結構圖 進程 介紹 進程是一個正在運行的程序,它是一個個可執行文件的實例。當一個可執行文件從硬盤加載到內存中的時候&#xf…

如何用CHAT寫方案?

問CHAT:幫我寫一份航空無動力樂園的可執行方案 CHAT回復: 方案一:概念及地點篩選 航空無動力樂園是指以航空運動為主題,利用自然地形與風力進行滑翔、跳傘等無動力航空運動的戶外休閑娛樂樂園。鑒于此,首需要確定樂園…

Shiro 框架中如何更新Redis的超時登錄時間?

在Shiro框架中,可以通過實現SessionDAO接口來將會話信息保存到Redis中,并且可以通過實現SessionValidationScheduler接口來定期檢查會話是否過期。因此,要更新Redis中的超時登錄時間,可以按照以下步驟進行操作: 實現Se…

基于SpringBoot+Vue會員制醫療預約服務管理信息系統(Java畢業設計)

點擊咨詢源碼 大家好,我是DeBug,很高興你能來閱讀!作為一名熱愛編程的程序員,我希望通過這些教學筆記與大家分享我的編程經驗和知識。在這里,我將會結合實際項目經驗,分享編程技巧、最佳實踐以及解決問題的…

RT-Thread 工程創建(1)

方式一, 利用已經有的bsp進行創建 距離BearPi IOT Std 板 1. 下載 RT-Thread 官方 Env工具a. 下載 [Env 工具下載](https://www.rt-thread.org/download.html#download-rt-thread-env-tool) , 并解壓縮b. 將env注冊到系統中, 這樣就在右鍵菜單中出現&am…

PHP案例:探究MySQL應用開發喜好的網絡調查

文章目錄 一、知識準備(一)數據庫與表的創建(二)錄入調查選項(三)創建問卷頁面(四)處理投票數據(五)顯示調查結果二、實現步驟(一)創建數據庫與表(二)錄入若干調查選項(三)創建問卷頁面(四)創建調查結果頁面(五)體驗運行結果(六)查看最終生成的HTML代碼很…

Java - 線程間的通信方式

線程通信的方式 線程中通信是指多個線程之間通過某種機制進行協調和交互 線程通信主要可以分為三種方式,分別為共享內存、消息傳遞和管道流。每種方式有不同的方法來實現 共享內存:線程之間共享程序的公共狀態,線程之間通過讀-寫內存中的公…

前端知識筆記(四十五)———前端開發與后端開發有什么區別

前端開發和后端開發是Web開發中的兩個關鍵領域,它們負責不同的任務和功能。下面是前端開發和后端開發之間的主要區別: 前端開發: 用戶界面:前端開發主要關注用戶界面的開發,包括網頁的布局、樣式、交互等方面。前端技…

Android集成科大訊飛語音識別與語音喚醒簡易封裝

目錄 一、語音喚醒部分 1、首先在科大訊飛官網注冊開發者賬號 2、配置喚醒詞然后下載sdk 3、選擇對應功能下載 4、語音喚醒lib包全部復制到工程目錄下 5、把語音喚醒詞文件復制到工程的assets目錄 6、復制對應權限到AndroidManifest.xml中 7、喚醒工具類封裝 二、語音識…

Linux學習第46天:Linux音頻驅動試驗:能不能?不行也得行。

Linux版本號4.1.15 芯片I.MX6ULL 大叔學Linux 品人間百味 思文短情長 CAN 是目前應用非常廣泛的現場總線之一,主要應用于汽車電子和工業領域,尤其是汽車 領域,汽車上大量的傳感器與模塊都是通過 C…

十二、MapReduce概述

1、MapReduce (1)采用框架 MapReduce是“分散——>匯總”模式的分布式計算框架,可供開發人員進行相應計算 (2)編程接口: ~Map ~Reduce 其中,Map功能接口提供了“分散”的功能&#xff…

【Java期末復習資料】(1)知識點總結

本文章主要是知識點,后續會出模擬卷 以下是選擇、填空可能考的知識點,多看幾遍,混個眼熟 面向對象程序設計的基本特征是:抽象、封裝、繼承、多態(后三個是三大特性)Java源文件的擴綴名是.java編譯Java App…

知識筆記(五十三)———MySQL 刪除數據表

MySQL中刪除數據表是非常容易操作的,但是你在進行刪除表操作時要非常小心,因為執行刪除命令后所有數據都會消失。 語法 以下為刪除 MySQL 數據表的通用語法: DROP TABLE table_name ; -- 直接刪除表,不檢查是否存在 或 DROP…

neuq-acm預備隊訓練week 8 P8794 [藍橋杯 2022 國 A] 環境治理

題目描述 輸入格式 輸出格式 輸出一行包含一個整數表示答案。 輸入輸出樣例 解題思路 最短路二分 AC代碼 #include<bits/stdc.h> using namespace std; long long temp,n, Q; long long f[105][105],min_f[105][105],cut[105],dis[105][105];//cut為減少多少&#x…