python高階教程-python操作xlsx文件(openpyxl)

  • 2019 年 11 月 20 日
  • 筆記

本篇內容來自原創小冊子《python高階教程》,點擊查看目錄

背景

在處理一些作業時,經常會碰到統計未交人數、分數等需求,雖然我們在數據庫中有了對應的數據, 但是數據庫只是面向開發者的,仍然需要將其轉換為專業的可閱讀格式-excel表格。

目前常用的操作xlsx表格的是openpyxl, 官網地址

編程模型

讀取

from openpyxl import Workbook  from openpyxl.utils import get_column_letter     # 在內存中創建一個workbook對象,而且會至少創建一個 worksheet   wb = Workbook()     #獲取當前活躍的worksheet,默認就是第一個worksheet   ws = wb.active     #設置單元格的值,A1等於6(測試可知openpyxl的行和列編號從1開始計算),B1等於7   ws.cell(row=1, column=1).value = 6   ws.cell("B1").value = 7     #從第2行開始,寫入9行10列數據,值為對應的列序號A、B、C、D...   for row in range(2,11):    for col in range (1,11):     ws.cell(row=row, column=col).value = get_column_letter(col)     #可以使用append插入一行數據   ws.append(["我","你","她"])     #保存   wb.save(filename="/Users/budong/Desktop/a.xlsx")

寫入

from openpyxl import load_workbook    #打開一個workbook  wb = load_workbook(filename="/Users/budong/Desktop/a.xlsx")    #獲取當前活躍的worksheet,默認就是第一個worksheet  #ws = wb.active    #當然也可以使用下面的方法    #獲取所有表格(worksheet)的名字  sheets = wb.get_sheet_names()  #第一個表格的名稱  sheet_first = sheets[0]  #獲取特定的worksheet  ws = wb.get_sheet_by_name(sheet_first)    #獲取表格所有行和列,兩者都是可迭代的  rows = ws.rows  columns = ws.columns    #迭代所有的行  for row in rows:  line = [col.value for col in row]  print(line)    #通過坐標讀取值  print(ws.cell('A1').value) # A表示列,1表示行  print(ws.cell(row=1, column=1).value)

處理包含學生學號和學生姓名的表格

在該例子中,xlsx表格中只有兩列,第一列是學生學號,第二列是學生姓名, 使用get_stu可以獲取xlsx文件中的學號與姓名供使用,使用write_xlsx 可以向xlsx文件中寫入數據,其中data為二維列表。

from openpyxl import Workbook, load_workbook  src_name = 'students.xlsx'  def get_stu(file_name, type='code'):      wb = load_workbook(file_name)      ws = wb.active      stu_code = []      rows = ws.rows      for row in rows:          if type=='code':          # stu code              col = row[1]          elif type=='name':              col = row[2]          else:              col = row[1]          stu_code.append(str(col.value))      return stu_code  def write_xlsx(file_name, data):      wb = Workbook()      ws = wb.active      for row in range(1,len(data) + 1):          for column in range(1, len(data[row-1]) + 1):              ws.cell(row=row, column=column).value = data[row-1][column-1]      wb.save(filename=file_name)

參考:

  1. 腳本之家