1. 程式人生 > >Python處理excel檔案

Python處理excel檔案

Python處理excel檔案

​ 這裡只介紹幾種常用的庫。對於2003以前的excel版本,即.xls檔案,只能用xlrd和xlwt庫來處理;對於2003及以後的excel檔案,即.xlsx檔案,需要使用openpyxl庫來處理,這裡著重介紹這三個第三方庫。

​ 注:Workbook是對工作簿(excel)的抽象,Worksheet是對錶格(sheet)的抽象,Cell是對單元格的抽象

Python處理.xlsx檔案

  1. 匯入模組

    import openpyxl
    
  2. 讀入一個已有的excel

    # 當前路徑下
    r_wb = openpyxl.load_workbook('test-openpyxl.xlsx')
    # 指定路徑下
    r_wb = openpyxl.load_workbook(r'C:\Users\y84107470\PycharmProjects\excel-fun\test-openpyxl.xlsx')
    
  3. 新建一個excel

    # 無論是匯入的還是新建的excel,後面對Wb(Workbook),ws(worksheet)和cell的操作是一樣的
    w_wb = openpyxl.Workbook() 
    
  4. sheet的屬性與操作

    • 獲取所有sheet的名稱

      r_sheetnames = r_wb.get_sheet_names()# 目前已棄用,不會報錯,但是又警告,建議用下面的方法
      r_sheetnames = r_wb.sheetnames
      
    • 獲取某個sheet的三種方法

      # 按索引,獲取第一個sheet
      r_ws = r_wb.get_sheet_by_name(r_sheetnames[0])
      # 按名稱,獲取指定名稱的sheet
      r_ws = r_wb.get_sheet_by_name('Sheet1') # 目前已棄用,不會報錯,但是又警告,建議用下面的方法
      r_ws = r_wb['Sheet1']
      # 呼叫正在執行的sheet
      r_ws = r_wb.active
      
    • 新建刪除sheet

      # 新建sheet,不加index引數預設插在最後
      ws1 = r_wb.create_sheet(title = "page1", index = 0) 
      # 刪除sheet
      r_wb.remove_sheet(ws1) 
      
    • 常用sheet屬性

      • title:表格的標題
      • dimensions:表格的大小,這裡的大小是指含有資料的表格的大小,即:左上角的座標:右下角的座標
      • max_row:表格的最大行
      • min_row:表格的最小行
      • max_column:表格的最大列
      • min_column:表格的最小列
      • rows:按行獲取單元格(Cell物件) - 生成器
      • columns:按列獲取單元格(Cell物件) - 生成器
      • freeze_panes:凍結窗格
      • values:按行獲取表格的內容(資料) - 生成器
    • 獲取或修改屬性

      # 修改標題
      ws1.title = "Changed"
      # 打印表格大小
      print('dimensions:', r_ws.dimensions) #輸出:A1:C4
      # 獲取表格的最小行(最大行,最大最小列同理)
      min_r = r_ws.min_row
      #凍結第一行標題行
      ws.freeze_panes = 'A2'
      
  5. cell的屬性與操作

    • 獲取cell

      # 直接根據單元格的索引獲取,座標從(1, 1)開始
      d = ws.cell(row = 4, column = 2) #通過行列讀
      
    • cell常用屬性

      • row:單元格所在的行
      • column:單元格坐在的列
      • coordinate:單元格的座標
      • value:單元格的值
    • 獲取或修改屬性

      # 列印
      print('row:', r_ws.cell(row=2, column=2).row)
      print('column:', r_ws.cell(row=2, column=2).column)
      print('coordinate:', r_ws.cell(row=2, column=2).coordinate)
      print('value:', r_ws.cell(row=2, column=2).value)
      # 修改
      r_ws.cell(row=2, column=2).value = '連海平'
      r_ws.cell(row=2, column=2, value = '共潮生')
      
  6. 遍歷表格資料

    • 使用迭代器

      # 按行操作
      for row in r_ws.iter_rows('A1:C3'):
      	# 兩種方式作用是一樣的
          for cell in row:
              print('cell-value:', cell.value)
          for i in range(len(row)):
              print('row[i]:', row[i].value)
      
    • 按行列操作

      # 用行數列數
      for row in range(1, 4):
          for col in range(1, 4):
              w_ws.cell(row= row, column= col, value= 'test')
              print('row:', row, 'col:', col, 'value:', w_ws.cell(row= row, column= col).value)
      
  7. 利用公式

    • 求和

      r_ws['C5'] = "=SUM(C2:C4)"
      
    • 除法

      r_ws['C6'] = "=SUM(C2:C3)/C4"
      
  8. 例項

    例子說明:讀入一個excel,內容如下:
    這裡寫圖片描述
    將其按得分排序後,在第一列插入一列排名,結果如下:
    這裡寫圖片描述
    程式碼如下:

    #!/usr/bin/env python 
    # -*- coding:utf-8 -*-
    
    import openpyxl
    
    # 讀入已有的excel(修改為自己檔案的路徑)
    r_wb = openpyxl.load_workbook(r'C:\Users\69540\Desktop\test-openpyxl.xlsx')
    
    # 獲取r_wb的sheet1
    r_ws = r_wb.get_sheet_by_name('Sheet1')
    
    # 獲取讀入的資料
    title = []
    data = []
    data_line = []
    for n_row in range(r_ws.min_row, r_ws.max_row + 1):
        for n_col in range(r_ws.min_column, r_ws.max_column + 1):
            # 獲取標題行
            if n_row == r_ws.min_row:
                title.append(r_ws.cell(row= n_row, column= n_col).value)
            # 獲取一行資料
            else:
                data_line.append(r_ws.cell(row= n_row, column= n_col).value)
        # 將一行資料儲存至data列表,並清零data_line
        if data_line:
            data.append(data_line)
            data_line = []
    
    # 處理資料
    title_out = title
    data_out = data
    # 標題行第一列新增字串‘排名’
    title_out.insert(0, '排名')
    # 資料部分按第三列的得分排序,降序排列
    data_out.sort(key= lambda elem:elem[2], reverse= True)
    for i in range(len(data_out)):
        data_out[i].insert(0, i + 1)
    #將title的合併進data_out列表中
    data_out.insert(0, title_out)
    
    # 新建excel及sheet,sheet命名為rank,將資料寫入
    w_wb = openpyxl.Workbook()
    w_ws = w_wb.create_sheet(title = 'rank', index= 0)
    n_max_row = len(data_out)
    n_max_col = len(data_out[1])
    for row in range(n_max_row):
        for col in range(n_max_col):
                # 寫入資料
                w_ws.cell(row=row + 1, column=col + 1, value=data_out[row][col])
    
    #將新建的excel以指定的名稱儲存在指定的路徑下(修改為自己檔案的路徑)
    w_wb.save(r'C:\Users\69540\Desktop\rank.xlsx')
    

Python處理.xls檔案

讀excel:使用xlrd庫

import xlrd

# 開啟一個已有的excel(當前路徑下,指定路徑下)
# workbook = xlrd.open_workbook('test-xlrd.xls')
workbook = xlrd.open_workbook(r'C:\Users\y84107470\PycharmProjects\excel-fun\test-xlrd.xls')

# sheet的操作
# 抓取所有sheet頁的名稱並列印
worksheets_name = workbook.sheet_names()
print('worksheets are:', worksheets_name)
# 定位到sheet: 1. 指定名稱獲取
#worksheet1 = workbook.sheet_by_name(u'Sheet1')
# 2.1 通過索引順序獲取
#worksheet1 = workbook.sheets()[0]
# 2.2 通過索引順序獲取
worksheet1 = workbook.sheet_by_index(0)
# 列印sheet的名稱,行數,列數
print('sheet_attr:', worksheet1.name, worksheet1.nrows, worksheet1.ncols)

# 讀取表值
# 遍歷sheet1中所有行row
num_rows = worksheet1.nrows
for curr_row in range(num_rows):
    row_val = worksheet1.row_values(curr_row)
    print('row%s is %s' % (curr_row, row_val))
# 遍歷sheet1中所有列col
num_cols = worksheet1.ncols
for curr_col in range(num_cols):
    col_val = worksheet1.col_values(curr_col)
    print('col%s is %s' % (curr_col, col_val))
# 遍歷sheet1中所有單元格cell
for rown in range(num_rows):
    for coln in range(num_cols):
        cell_val = worksheet1.cell_value(rown, coln)
        print(cell_val)

#獲取單元格內容的資料型別(說明:ctype : 0 empty,1 string, 2 number, 3 date, 4 boolean, 5 error)
print('(1, 0)的型別為:', worksheet1.cell(1, 0).ctype) #第2行第1列:張三 為string型別
print('(1, 1)的型別為:', worksheet1.cell(1, 1).ctype) #第2行第2列:15 為number型別

寫excel:使用xlwt庫

#新建excel檔案並寫入資料,xlwt

import xlwt
#建立workbook和sheet物件
workbook = xlwt.Workbook() #注意Workbook的開頭W要大寫
sheet1 = workbook.add_sheet('sheet1', cell_overwrite_ok=True)
sheet2 = workbook.add_sheet('sheet2', cell_overwrite_ok=True)
#向sheet頁中寫入資料
name = ('李老栓', '張得帥', '曾牛逼')
score = ('22', '33', '44')
sheet1.write(0, 0, '姓名')
sheet1.write(0, 1, '得分')
for i in range(len(name)):
    sheet1.write(i + 1, 0, name[i])
for i in range(len(score)):
    sheet1.write(i + 1, 1, score[i])
#儲存該excel檔案,有同名檔案時直接覆蓋(儲存在當前資料夾下)
workbook.save('test-xlwt.xls')
#儲存該excel檔案,有同名檔案時直接覆蓋(儲存在指定資料夾下)
#workbook.save(r'C:\Users\y84107470\Desktop\test-xlwt.xls')
print('建立excel檔案完成!')

補充:寫excel的庫xlutils

import xlrd
import xlutils.copy
#開啟一個workbook
rb = xlrd.open_workbook('test.xls')
wb = xlutils.copy.copy(rb)
#獲取sheet物件,通過sheet_by_index()獲取的sheet物件沒有write()方法
ws = wb.get_sheet(0)
#寫入資料
ws.write(1, 1, 'changed!')
#新增sheet頁
wb.add_sheet('sheetnnn2', cell_overwrite_ok=True)
#利用儲存時同名覆蓋達到修改excel檔案的目的,注意未被修改的內容保持不變
wb.save('test.xls')

參考:

https://blog.csdn.net/test_soy/article/details/79714858

http://www.mamicode.com/info-detail-2206758.html