Python-使用openpyxl讀取excel內容

来源:https://www.cnblogs.com/xiaoguoic/p/18069103
-Advertisement-
Play Games

1. 本篇文章目標 將下麵的excel中的寄存器表單讀入並構建一個字典 2. openpyxl的各種基本使用方法 2.1 打開工作簿 wb = openpyxl.load_workbook('test_workbook.xlsx') 2.2 獲取工作簿中工作表名字並得到工作表 ws = wb[wb. ...


1. 本篇文章目標

將下麵的excel中的寄存器表單讀入並構建一個字典

2. openpyxl的各種基本使用方法

2.1 打開工作簿

wb = openpyxl.load_workbook('test_workbook.xlsx')

2.2 獲取工作簿中工作表名字並得到工作表

ws = wb[wb.sheetnames[0]]

wb.sheetnames 會返回一個列表,列表中是每個工作表的名稱,數據類型為str。執行上述代碼後ws就是獲取的工作表。

2.3 讀取某個單元格的值

d = ws.cell(row=1, column=1).value
print(d)

使用sheet.cell會返回cell對象,再使用cell.value才能返回單元格的值,執行上述代碼的結果如下:

2.4 按行讀取

按行讀取可以用iter_rows()方法。

for row in ws.iter_rows():
    print(row)

執行上述代碼的輸出如下:

由圖可知,該方法應當是一個迭代器,返回的是row是一個tuple,裡邊是各個單元格cell。可以按照如下方法獲取每列的值。

import pprint as pp
excel_list = []
for row in ws.iter_rows():
    row = list(row)
    for i in range(len(row)):
        row[i] = row[i].value
    excel_list.append(row)

pp.pprint(excel_list)

這裡用到了一個模塊pprint,用來使列印出的列表、字典等美觀易讀。print結果如下:

可以看到已經將excel中的內容構建了一個列表,但是下邊一些沒有內容的行也讀了進來,儘管每個單元的值是None,這是因為之前對下邊的行做過編輯,然後又刪掉,導致這些無內容的單元具有單元格格式,openpyxl會將這些單元格也識別進來,所以要想避免這種情況,使用xlrd庫是一種辦法,或者採用下麵的辦法:

excel_list = []
for row in ws.iter_rows():
    row = list(row)
    if row[3].value != None:
        for i in range(len(row)):
            row[i] = row[i].value
        excel_list.append(row)

pp.pprint(excel_list)

執行結果如下,可以看到全為None的行被過濾掉了。

按列讀取方法類似,使用iter_cols()。

2.5切片讀取

有時候我們並不想讀取表格裡的全部內容,只想讀取一部分,這時候可以用iter_rows()和iter_cols()的切片功能。

excel_list = []
for row in ws.iter_rows(min_row=2, min_col=2, max_row=3, max_col=3):
    row = list(row)
    if row[1].value != None:
        for i in range(len(row)):
            row[i] = row[i].value
        excel_list.append(row)

pp.pprint(excel_list)

執行結果如下,可以看到只獲取了表格二行二列至三行三列的內容。

2.6 利用表格行列坐標直接獲取單元格、單元格的值、切片

除了上述使用sheet.cell(row, col)來獲取單元格值,以及iter_rows/cols獲取行、列、切片外,還可以直接用excel的行列坐標表示來獲取上述內容。

pp.pprint(ws['B3'])  #獲取B3單元格的cell對象
pp.pprint(ws['B3'].value) #獲取B3單元格cell對象的值
pp.pprint(ws['A1':'B2']) # 獲取A1:B2這個切片的cell們
pp.pprint(ws['A:B']) # 獲取A列到B列的所有cell對象
pp.pprint(ws[1:2]) # 獲取行1到行2兩行的所有cell對象

這裡要註意使用這種切片、獲取行列對象值的時候不能直接用.value方法,.value只是單獨cell即一個單元格的cell時才能直接用,所以要想用這種方法獲取切片、行列的值時要配合遍歷、列表等方法構建。

2.7快速獲得工作表的行們和列們

使用sheet.rows 和sheet.cols。

pp.pprint(list(ws.rows))

執行結果如下:

3.構建本任務所需字典

代碼如下:

class ReadRegListExcel:
    def __init__(self, this_ws):
        self.reg_dic = {}
        self.ws = this_ws

    def excel_max_rows(self):
        max_rows = 0
        for row in ws.rows:
            if row[3].value != None:
                max_rows += 1
        return max_rows

    def construct_dic(self):
        max_rows = self.excel_max_rows()
        self.reg_dic['module name'] = self.ws.cell(row=1, column=2).value
        self.reg_dic['module base address'] = self.ws.cell(row=1, column=4).value
        self.reg_dic['registers'] = []
        row = 3
        all_rows = list(self.ws.rows)
        print(all_rows)
        while row <= max_rows:
            if all_rows[row-1][0].value != None:
                self.reg_dic['registers'].append({})
                self.reg_dic['registers'][-1]['register name'] = all_rows[row-1][0].value
                self.reg_dic['registers'][-1]['register address'] = all_rows[row-1][1].value
                self.reg_dic['registers'][-1]['fields'] = [[value.value for value in all_rows[row-1][2:7]]]
            else:
                self.reg_dic['registers'][-1]['fields'].append([value.value for value in all_rows[row-1][2:7]])
            row += 1
        return self.reg_dic

if __name__ == "__main__":
    reg_dic_obj = ReadRegListExcel(ws)
    reg_dic = reg_dic_obj.construct_dic()
    pp.pprint(reg_dic)

最後得到的寄存器字典如下:

至此讀入寄存器列表文件並構建出結構化的寄存器字典任務完成。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • v-model 是 Vue.js 框架中用於實現雙向數據綁定的指令。它充分體現了 MVVM(Model-View-ViewModel)模式中的雙向數據綁定特性。下麵我們將詳細解釋 v-model 如何體現 MVVM 和雙向綁定: 1.MVVM 模式 MVVM 模式是一種軟體架構設計模式,它將應用程式 ...
  • 在你的 TypeScript 代碼中,當調用 nextPage_TopSelling() 或 prevPage_TopSelling() 方法時,雖然你更新了 currentPage_TopSelling 的值並調用了 reloadTopSelling() 方法,但是 Angular 並不會自動檢測 ...
  • 零售商家為什麼要建設線上商城 傳統的實體門店服務範圍有限,只能吸引周邊500米內的消費者。因此,如何拓展服務範圍,吸引更多消費者到店,成為了店家迫切需要解決的問題。 缺乏忠實顧客,客戶基礎不穩,往往是一次性購物,門店無法形成有效的顧客迴流。在當前的市場環境下,構建並維護粉絲群體,成為了商家的核心競爭 ...
  • 背景 在一個微服務架構的項目中,一個業務操作可能涉及到多個服務,這些服務往往是獨立部署,構成一個個獨立的系統。這種分散式的系統架構往往面臨著分散式事務的問題。為了保證系統數據的一致性,我們需要確保這些服務中的操作要麼全部成功,要麼全部失敗。通過使用RocketMQ實現分散式事務,我們可以協調這些服務 ...
  • 最近項目中有一個需要使用QT生成固定長度隨機字元串的需求,需求也很簡單,就是生成一個n位的僅包含0-9以及大寫字母的字元串,因為這也是第一次使用QT自身的隨機數,這裡就做一下簡單記錄。 廢話不多說,直接上代碼。 1 QString getRandomString(int length) 2 { 3 ...
  • 8.1 C++內聯函數 提出的目的:為了提高程式運行速度。 內聯函數和普通函數的區別: 編譯方式: 內聯函數在編譯時會被直接替換到調用處,而不是像普通函數那樣通過函數調用的方式執行。這樣可以減少函數調用的開銷,提高程式執行效率。 普通函數則是通過函數調用的方式執行,會涉及函數棧的壓棧和出棧操作。 代 ...
  • Java Iterator Iterator 介面提供了一種迭代集合的方法,即順序訪問集合中的每個元素。它支持 hasNext() 和 next() 方法,用於檢查是否存在下一個元素以及獲取下一個元素。 獲取 Iterator 可以使用集合的 iterator() 方法獲取 Iterator 實例: ...
  • 摘要: 銀行卡歸屬地查詢介面是一種高效的方式,通過銀行卡號查詢銀行名稱、卡種、卡品牌以及發卡省份和城市等信息。本文將詳細介紹如何使用該介面,並附帶代碼說明。同時,也介紹了介面的特點和適用範圍,讓讀者能夠充分瞭解和運用該介面,方便快捷地獲取銀行卡發卡行所在地信息。 一、介面簡介 銀行卡歸屬地查詢介面是 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...