python-封裝方法用於讀取excel


利用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')
View Code

解決辦法二:直接使用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')
View Code

 

 
       


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM