博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
python-封装方法用于读取excel
阅读量:4648 次
发布时间:2019-06-09

本文共 6015 字,大约阅读时间需要 20 分钟。

利用openpyxl方法实现读写excel表格

from openpyxl.reader.excel import load_workbookimport osclass 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-8import 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-8import xlrdclass 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_workbookfrom xlutils.copy import copyimport osdri_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对象的方法获得要操作的sheettable.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, xlrdfrom xlutils.copy import copyclass 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_workbookimport osclass 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

 

 

转载于:https://www.cnblogs.com/lanyinhao/p/10721039.html

你可能感兴趣的文章
移动开发js库Zepto.js使用中的一些注意点
查看>>
Android学习笔记View的工作原理
查看>>
中文词频统计
查看>>
华为S5024p交换机配端口镜像
查看>>
VirtualBox虚拟机配置CentOS7网络图文详解教程
查看>>
[Asp.net 5] DependencyInjection项目代码分析-目录
查看>>
努比亚(nubia) V18 NX612J 解锁BootLoader 并刷入recovery ROOT
查看>>
SOAP协议初级指南(7)
查看>>
使用 IntraWeb (39) - THttpRequest、THttpReply
查看>>
ImageMagick还是GraphicsMagick?
查看>>
[BZOJ 4571][Scoi2016]美味(主席树)
查看>>
python网络-计算机网络基础(23)
查看>>
Mysql5.7.16安装过程
查看>>
Linux文件查找命令find用法整理(locate/find)
查看>>
20175333曹雅坤实验四《Android程序设计》实验报告
查看>>
max(min)-device-width和max(min)-width的区别
查看>>
geolocation/ 百度地图api Geolocation 定位当前城市信息
查看>>
JAVA基础
查看>>
ruby的optparse使用小记
查看>>
Helper Devise: could not find the `Warden::Proxy` instance on request environment
查看>>