openpyxl模塊(excel操做)

openpyxl模塊介紹

openpyxl模塊是一個讀寫Excel 2010文檔的Python庫,若是要處理更早格式的Excel文檔,須要用到額外的庫,openpyxl是一個比較綜合的工具,可以同時讀取和修改Excel文檔。其餘不少的與Excel相關的項目基本只支持讀或者寫Excel一種功能。app

安裝openpyxl模塊

pip3 install openpyxlide

openpyxl基本用法

 想要操做Excel首先要了解Excel 基本概念,Excel中列以字幕命名,行以數字命名,好比左上角第一個單元格的座標爲A1,下面的爲A2,右邊的B1。函數

  openpyxl中有三個不一樣層次的類,Workbook是對工做簿的抽象,Worksheet是對錶格的抽象,Cell是對單元格的抽象,每個類都包含了許多屬性和方法。工具

操做Excel的通常場景:編碼

打開或者建立一個Excel須要建立一個Workbook對象
獲取一個表則須要先建立一個Workbook對象,而後使用該對象的方法來獲得一個Worksheet對象
若是要獲取表中的數據,那麼獲得Worksheet對象之後再從中獲取表明單元格的Cell對象

Workbook對象

一個Workbook對象表明一個Excel文檔,所以在操做Excel以前,都應該先建立一個Workbook對象。對於建立一個新的Excel文檔,直接進行Workbook類的調用便可,對於一個已經存在的Excel文檔,可使用openpyxl模塊的load_workbook函數進行讀取,該函數包涵多個參數,但只有filename參數爲必傳參數。filename 是一個文件名,也能夠是一個打開的文件對象。excel

>>> import openpyxl
>>> excel = openpyxl.Workbook(‘hello.xlxs‘)
>>> excel1 = openpyxl.load_workbook(‘abc.xlsx‘)
>>>

PS:Workbook和load_workbook相同,返回的都是一個Workbook對象。code

  Workbook對象提供了不少屬性和方法,其中,大部分方法都與sheet有關,部分屬性以下:orm

active:獲取當前活躍的Worksheet
worksheets:以列表的形式返回全部的Worksheet(表格)
read_only:判斷是否以read_only模式打開Excel文檔
encoding:獲取文檔的字符集編碼
properties:獲取文檔的元數據,如標題,建立者,建立日期等
sheetnames:獲取工做簿中的表(列表)
>>> import openpyxl
>>> excel2 = openpyxl.load_workbook(‘abc.xlsx‘)
>>> excel2.active
<Worksheet "abc">
>>> excel.read_only
False
>>> excel2.worksheets
[<Worksheet "abc">, <Worksheet "def">]
>>> excel2.properties
<openpyxl.packaging.core.DocumentProperties object>
Parameters:
creator=‘openpyxl‘, title=None, description=None, subject=None, identifier=None, language=None, created=datetime.datetime(2006, 9, 16, 0, 0), modified=datetime.datetime(2018, 2, 5, 7, 25, 18), lastModifiedBy=‘Are you SuperMan‘, category=None, contentStatus=None, version=None, revision=None, keywords=None, lastPrinted=None
>>> excel2.encoding
‘utf-8‘
>>>

Workbook提供的方法以下:

get_sheet_names:獲取全部表格的名稱(新版已經不建議使用,經過Workbook的sheetnames屬性便可獲取)
get_sheet_by_name:經過表格名稱獲取Worksheet對象(新版也不建議使用,經過Worksheet[‘表名‘]獲取)
get_active_sheet:獲取活躍的表格(新版建議經過active屬性獲取)
remove_sheet:刪除一個表格
create_sheet:建立一個空的表格
copy_worksheet:在Workbook內拷貝表格
>>> excel2.get_sheet_names()

Warning (from warnings module):
  File "__main__", line 1
DeprecationWarning: Call to deprecated function get_sheet_names (Use wb.sheetnames).
[‘abc‘, ‘def‘]
>>> excel2.sheetnames
[‘abc‘, ‘def‘]
>>> excel2.get_sheet_by_name(‘def‘)

Warning (from warnings module):
  File "__main__", line 1
DeprecationWarning: Call to deprecated function get_sheet_by_name (Use wb[sheetname]).
<Worksheet "def">
>>> excel2[‘def‘]
<Worksheet "def">
>>> excel2.get_active_sheet()

Warning (from warnings module):
  File "__main__", line 1
DeprecationWarning: Call to deprecated function get_active_sheet (Use the .active property).
<Worksheet "abc">
>>> excel2.create_sheet(‘ghk‘)
<Worksheet "ghk">

Worksheet對象

有了Worksheet對象之後,咱們能夠經過這個Worksheet對象獲取表格的屬性,獲得單元格中的數據,修改表格中的內容。openpyxl提供了很是靈活的方式來訪問表格中的單元格和數據,經常使用的Worksheet屬性以下:對象

title:表格的標題
dimensions:表格的大小,這裏的大小是指含有數據的表格的大小,即:左上角的座標:右下角的座標
max_row:表格的最大行
min_row:表格的最小行
max_column:表格的最大列
min_column:表格的最小列
rows:按行獲取單元格(Cell對象) - 生成器
columns:按列獲取單元格(Cell對象) - 生成器
freeze_panes:凍結窗格
values:按行獲取表格的內容(數據)  - 生成器

PS:freeze_panes,參數比較特別,主要用於在表格較大時凍結頂部的行或左邊的行。對於凍結的行,在用戶滾動時,是始終可見的,能夠設置爲一個Cell對象或一個端元個座標的字符串,單元格上面的行和左邊的列將會凍結(單元格所在的行和列不會被凍結)。例如咱們要凍結第一行那麼設置A2爲freeze_panes,若是要凍結第一列,freeze_panes取值爲B1,若是要同時凍結第一行和第一列,那麼須要設置B2爲freeze_panes,freeze_panes值爲none時 表示 不凍結任何列。ip

  經常使用的Worksheet方法以下:

iter_rows:按行獲取全部單元格,內置屬性有(min_row,max_row,min_col,max_col)
iter_columns:按列獲取全部的單元格
append:在表格末尾添加數據
merged_cells:合併多個單元格
unmerged_cells:移除合併的單元格
>>> for row in excel2[‘金融‘].iter_rows(min_row=2,max_row=4,min_col=2,max_col=4):
    print(row)

(<Cell ‘abc‘.B2>, <Cell ‘abc‘.C2>, <Cell ‘abc‘.D2>)
(<Cell ‘abc‘.B3>, <Cell ‘abc‘.C3>, <Cell ‘abc‘.D3>)
(<Cell ‘abc‘.B4>, <Cell ‘abc‘.C4>, <Cell ‘abc‘.D4>)

PS:從Worksheet對象的屬性和方法能夠看到,大部分都是返回的是一個Cell對象,一個Cell對象表明一個單元格,咱們可使用Excel座標的方式來獲取Cell對象,也可使用Worksheet的cell方法獲取Cell對象。

>>> excel2[‘abc‘][‘A1‘]
<Cell ‘abc‘.A1>
>>> excel2[‘abc‘].cell(row=1,column=2)
<Cell ‘abc‘.B1>
>>>

Cell對象

Cell對象比較簡單,經常使用的屬性以下:

row:單元格所在的行
column:單元格坐在的列
value:單元格的值
coordinate:單元格的座標
>>> excel2[‘abc‘].cell(row=1,column=2).coordinate
‘B1‘
>>> excel2[‘abc‘].cell(row=1,column=2).value
‘test‘
>>> excel2[‘abc‘].cell(row=1,column=2).row
1
>>> excel2[‘abc‘].cell(row=1,column=2).column
‘B‘

打印表中數據的幾種方式

# ---------- 方式1 ----------
>>> for row in excel2[‘abc‘].rows:
    print( *[ cell.value for cell in row ])

# ---------- 方式2 ----------
>>> for row in excel2[‘abc‘].values:
    print(*row)

獲取最大值

import openpyxl
file = openpyxl.load_workbook('111.xlsx')

info = file.worksheets[0]
print (info.max_column) #獲取最大列數
print (info.max_row)    #獲取最大行數

寫入讀寫實例

寫入實例:

import openpyxl
import time

ls = [['馬坡','接入交換','192.168.1.1','G0/3','AAAA-AAAA-AAAA'],
      ['馬坡','接入交換','192.168.1.2','G0/8','BBBB-BBBB-BBBB'],
      ['馬坡','接入交換','192.168.1.2','G0/8','CCCC-CCCC-CCCC'],
      ['馬坡','接入交換','192.168.1.2','G0/8','DDDD-DDDD-DDDD']]

##定義數據

time_format = '%Y-%m-%d__%H:%M:%S'
time_current = time.strftime(time_format)
##定義時間格式

def savetoexcel(data,sheetname,wbname):
    print("寫入excel:")
    wb=openpyxl.load_workbook(filename=wbname)
    ##打開excel文件

    sheet=wb.active #關聯excel活動的Sheet(這裏關聯的是Sheet1)
    max_row = sheet.max_row #獲取Sheet1中當前數據最大的行數
    row = max_row + 3   #將新數據寫入最大行數+3的位置
    data_len=row+len(data)  #計算當前數據長度

    for data_row in range(row,data_len):  # 寫入數據
    ##輪詢每一行進行寫入數據。
        for data_col1 in range(2,7):
        ##針對每一行下面還要進行for循環來寫入列的數據
            _ =sheet.cell(row=data_row, column=1, value=str(time_current))
            ##每行第一列寫入時間
            _ =sheet.cell(row=data_row,column=data_col1,value=str(data[data_row-data_len][data_col1-2]))
            #從第二列開始寫入數據

    wb.save(filename=wbname)    #保存數據
    print("保存成功")

savetoexcel(ls,"Sheet1","111.xlsx")
import openpyxl

wb=openpyxl.load_workbook("111.xlsx")
the_list =[]

while True:
    info = input('請輸入關鍵字查找:').upper().strip()
    if len(info) == 0:  # 輸入的關鍵字不能爲空,不然繼續循環
        continue
    count = 0
    for line1 in wb['Sheet1'].values:  # 輪詢列表
        if None not in line1:   
        ##excel中空行的數據表示None,當這裏匹配None時就不會在進行for循環,因此須要匹配非None的數據才能進行下面的for循環。
            for line2 in line1:  # 因爲列表中還存在元組,因此須要將元組的內容也輪詢一遍
                if info in line2:
                    count += 1  # 統計關鍵字被匹配了多少次
                    print(line1) #匹配關鍵字後打印元組信息

    else:
        print('匹配"%s"的數量統計:%s個條目被匹配' % (info, count))  # 打印查找的關鍵字被匹配了多少次
相關文章
相關標籤/搜索