利用openpyxl方法實現讀寫excel表格
from openpyxl.reader.excel import load_workbook import os class ExcelMethod(): def __init__(self, filename, sheetName): self.filename = filename self.wb = load_workbook(filename) # 通過工作的表名獲取一個工作表對象 self.sheet = self.wb[sheetName] # 獲取工作表中的最大行號 self.maxRowNum = self.sheet.max_row # 獲取工作表中的最大列號 self.max_column = self.sheet.max_column # 獲取總的行 self.row = self.sheet.max_row def readExcel(self): dataList = [] try: for row in self.sheet.rows: tmpList = [] for cell in row: tmpList.append(cell.value) dataList.append(tmpList) except: print("%s加載失敗" % self.filename) else: return dataList[1:] def saveExcel(self, row, text): try: self.sheet.cell(row, self.max_column, text) self.wb.save(self.filename) except: print("%s 保存失敗" % self.filename) if __name__=="__main__": dri_url = os.path.join(os.getcwd() + r"\User1.xlsx") excel = ExcelMethod(dri_url,"Sheet1") dataJson = excel.readExcel() print(dataJson) excel.saveExcel(4,'pass')
1.實現獲取excel某張表的行數、單元格數據
#coding=utf-8 import xlrd #獲取excel文件 data = xlrd.open_workbook('file_path/xxx.xls')#存放excle表格的路徑 #獲取第一張表數據 tables = data.sheets()[0] #打印表行數 print(tables.nrows) #打印第4行,第3列單元格數據 print(tables.cell_value(3,2))
2.封裝獲取表格方法
此方法需要實現的作用是:其他方法再調用此方法時,如果傳入file_name和sheet_id,就調用對應路徑的excel文件和對應的表。如果不傳這兩個字段,就調用默認表格。
def __init__(self,file_name=None,sheet_id=None): if file_name: self.file_name = file_name self.sheet_id = sheet_id else: self.file_name = 'file_path/xxx.xls' self.sheet_id = 0 self.data = self.get_data()
3.封裝獲取表格數據方法
封裝獲取tables的方法,用以之后獲取單元格行數、單元格數據,或其他表信息使用。
def get_data(self): data = xlrd.open_workbook(self.file_name) tables = data.sheets()[self.sheet_id] return tables
4.封裝獲取單元格行數方法
def get_lines(self): tables = self.data return tables.nrows
5.封裝獲取單元格數據的方法
def get_value(self,row,col): return self.data.cell_value(row,col)
6.封裝獲取總行數和總列數
def get_nrown_ncols(self): #獲取總行數 rowNum = self.data.nrows #獲取總列數 colNum = self.data.ncols return rowNum ,colNum
7.寫入數據到excel
def write_excel(self,row,column,value_back): ''' :param row: 某一列 :param value: 需要寫入的值 :return: ''' wb=load_workbook(self.file_name) sheel = wb[self.sheel_name] #把值寫到row,column組成的單元格 sheel.cell(row,column).value = value_back #保存excel wb.save(self.file_name)
8.根據行號查找對應內容
#根據行號,找到該行的內容 def get_row_values(self,row): tales = self.data row_data = tales.row_values(row) return row_data
整體代碼如下:
#coding: utf-8 import xlrd class OpeExcel: def __init__(self,file_name=None,sheet_id=None): if file_name: self.file_name = file_name self.sheet_id = sheet_id else: self.file_name = 'file_path/xxx.xls' self.sheet_id = 0 self.data = self.get_data() #獲取sheets的內容 def get_data(self): data = xlrd.open_workbook(self.file_name) tables = data.sheets()[self.sheet_id] return tables #獲取單元格行數 def get_lines(self): tables = self.data return tables.nrows #獲取單元格數據 def get_value(self,row,col): return self.data.cell_value(row,col) if __name__ == '__main__': opers = OpeExcel() print(opers.get_lines()) print(opers.get_value(3,2))
9.給一個excel文件追加內容:
from xlrd import open_workbook from xlutils.copy import copy import os dri_url = os.path.join(os.getcwd()+r"\user.xls") rexcel = open_workbook(dri_url)# 用wlrd提供的方法讀取一個excel文件 rows = rexcel.sheets()[0].nrows # 用wlrd提供的方法獲得現在已有的行數 excel = copy(rexcel) # 用xlutils提供的copy方法將xlrd的對象轉化為xlwt的對象 table = excel.get_sheet(0) # 用xlwt對象的方法獲得要操作的sheet table.write(1, 3, 'pass') # xlwt對象的寫方法,參數分別是行、列、值 excel.save(dri_url) # xlwt對象的保存方法,這時便覆蓋掉了原來的excel
python編輯已存在的excel坑: BadZipFile: File is not a zip file
為了能反復編輯已存在的excel文件並保存,需要xlwt、xlrd、xlutils組合起來使用,代碼如下:

import xlwt, os, xlrd from xlutils.copy import copy class Do_Excel: def __init__(self,filename,sheetname="Sheet1"): self.filename = filename self.sheetname = sheetname #讀取excel def excel_read(self,x,y): data = xlrd.open_workbook(self.filename) tabel = data.sheet_by_name(self.sheetname) return tabel.cell_value(x,y) #判斷exce文件是否存在,不存在則創建,存在則直接打開編輯 def excel_create(self): if not os.path.exists(self.filename): data = xlwt.Workbook() table = data.add_sheet(self.sheetname) table.write(0,0,"id") data.save(self.filename) #綜合xlw/xlrd/xlutis.copy 讀寫excle def write(self,row,col,value): self.excel_create() rb = xlrd.open_workbook(self.filename) wb = copy(rb) ws = wb.get_sheet(0)#1代表是寫到第幾個工作表里,從0開始算是第一個。 ws.write(row,col,value) wb.save(self.filename) if __name__=="__main__": dir = os.path.split(os.path.split(os.path.realpath(__file__))[0])[0] dir_excel = os.path.join(dir+r"\data\user1.xlsx") Do_Excel(dir_excel).write(2,5,'pass')
解決辦法二:直接使用openpyxl的Workbook和load_workbook,簡單直接

rom openpyxl import Workbook,load_workbook import os class Do_Excel: def __init__(self,filename,sheetname='Sheet1'): self.filename=filename self.sheetname=sheetname def write(self,i,j,value): if not os.path.exists(self.filename): wb = Workbook() sh = wb.create_sheet(self.sheetname) else: wb = load_workbook(self.filename) sh = wb[self.sheetname] sh.cell(i,j).value=value wb.save(self.filename) Do_Excel('test222.xlsx').write(1,1,'sdcds') Do_Excel('test222.xlsx').write(1,2,'change') Do_Excel('test222.xlsx').write(3,2,'pass')