《基於Python的全棧自動化測試》之 操作Excel,讀取數據

想要操作Excel,首先要導入 openpyxl 模塊:

openpyxl內包含新建,打開,讀寫、保存,等操作的方法,但是它只支持 xlsx 類型的文件:

  1. openpyxl.Workbook 是openpyxl的類文件,它用來新建;
  2. openpyxl.load_workbook 是openpyxl 的方法函數,類似open()函數,用來讀寫文件;

基本操作:

一、新建Excel

import openpyxl
"""新建、保存 Excel"""

"""先將 openpyxl 類實例化,創建個對象;"""
wb = openpyxl.Workbook()
"""用對象調用 save() 方法,將當前工作簿保存在指定的“文件名”下,如沒有該文件則會新建一個工作薄;"""
wb.save('excel_01.xlsx')  

二、操作Excel

import openpyxl

"""1. 打開Excel文件,使用 load_workbook 函數打開 Excel,並將文件對象賦值給 workbook,和open()非常相似"""
workbook = openpyxl.load_workbook('excel_01.xlsx')

"""2.定位表單,選擇我們想要操作的工作薄"""
# 方法一,已經過時,使用時會報 Warning
sheet_1 = workbook.get_sheet_by_name('Sheet')
# 方法二,目前用的
sheet_2 = workbook['Sheet']

"""3.定位單元格,單元格是按行列來定位,先行後列,都是用數值來表示"""
sheet_2.cell(row=1,column=2)  # 定位到第1行,第2列

"""4. 單元格-讀取"""
result = sheet_2.cell(row=1,column=2).value
print(result)

"""5. 單元格-寫入"""
sheet_2.cell(row=1,column=2).value='寫入單元格'
"""寫入後必須保存,寫入時必須關閉Excel,否則會報錯:沒有權限;"""
workbook.save('excel_01.xlsx') 

批量讀取:

    單個操作讀寫單元格效率很low,所以我們可以採用 for 循環來批量讀寫單元格:

  1. 獲取最大行數:sheet.max_row   
  2. 獲取最大列表 :sheet.max_row,注意這裏的sheet不是語法的,而是你定位到的表單!
  3. 使用 for 循環:
import openpyxl
book_1 = openpyxl.load_workbook('excel_01.xlsx')
sheet = book_1['Sheet']

"""獲取最大行數  sheet.max_row  """
"""獲取最大列數  sheet.max_column  """

"""用最大行數和列數進行 for 循環"""
for i in range(1, sheet.max_row+1):  # 循環 行
    for j in range(1, sheet.max_column+1):  # 循環 列
        result = sheet.cell(row=i, column=j).value
        print(f'讀取到的內容是:{result},它的數據類型是:{type(result)}')  #  打印結果和類型

 來看下我們要操作的 excel_01.xlsx 文件的內容:

再看下執行結果:

從結果上看,python會遍歷最大行數和列數之內的所有單元格,如果沒有內容的話就會返回 None 。

Excel的數據類型:

    在看下上面的執行結果的紅框部分,我們發現不管是 列表、元組、還是字典,它的數據類型都是 str。這是因爲常規下Excel只認識 str、int、float 三種數據類型,所以我們用python讀取出來也都是這三種。

    但是我們可以用 eval() 函數來轉換成原來的格式:

import openpyxl
book_1 = openpyxl.load_workbook('excel_01.xlsx')
sheet = book_1['Sheet']

for i in range(1, sheet.max_row+1):
    for j in range(1, sheet.max_column+1):
        result = sheet.cell(row=i, column=j).value
        """判斷爲空的不打印"""
        if result != None:
            if i == 1 and j in [3, 4, 5,]:
                """用 eval() 函數 將這幾個單元格的數據格式轉換原來的的類型"""
                result = eval(result)
                print(f'讀取到的內容是:{result},它的數據類型是:{type(result)}')
            else:
                print(f'讀取到的內容是:{result},它的數據類型是:{type(result)}')

執行結果:

數據類型已經轉換爲相對應的類型,注意:如果本身就是str的話,在使用 eval() 函數會報錯!

 

END!!!

 

 

 

 

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