zoukankan      html  css  js  c++  java
  • 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"datauser1.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
    
    
  • 相关阅读:
    Oracle SQL语句大全—查看表空间
    Class to disable copy and assign constructor
    在moss上自己总结了点小经验。。高手可以飘过 转贴
    在MOSS中直接嵌入ASP.NET Page zt
    Project Web Access 2007自定义FORM验证登录实现 zt
    SharePoint Portal Server 2003 中的单一登录 zt
    vs2008 开发 MOSS 顺序工作流
    VS2008开发MOSS工作流几个需要注意的地方
    向MOSS页面中添加服务器端代码的另外一种方式 zt
    状态机工作流的 SpecialPermissions
  • 原文地址:https://www.cnblogs.com/lanyinhao/p/10721039.html
Copyright © 2011-2022 走看看