想要操作Excel,首先要導入 openpyxl 模塊:
openpyxl內包含新建,打開,讀寫、保存,等操作的方法,但是它只支持 xlsx 類型的文件:
-
openpyxl.Workbook 是openpyxl的類文件,它用來新建;
-
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 循環來批量讀寫單元格:
- 獲取最大行數:sheet.max_row
- 獲取最大列表 :sheet.max_row,注意這裏的sheet不是語法的,而是你定位到的表單!
- 使用 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!!!