python-封装方法用于读取excel

本文详细介绍了使用Python进行Excel读写操作的多种方法,包括利用openpyxl和xlrd库读取Excel数据、获取行数和单元格内容,以及如何追加和修改Excel文件。通过封装函数,实现了灵活的表格数据读取和写入,适用于自动化办公场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

利用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

 

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

<think>嗯,用户让我介绍如何用Python封装一个读取Excel文件的方法。首先,我需要确定用户的需求是什么。他们可能经常需要处理Excel文件,希望有一个通用的方法来简化读取过程,避免重复代码。用户可能对Python的库不太熟悉,或者希望提高代码的可维护性。 接下来,我要选择合适的库。Python中处理Excel的常用库有pandas、openpyxl和xlrd。考虑到pandas功能强大且使用简便,适合处理各种格式的Excel文件,而openpyxl支持.xlsx格式,xlrd则用于旧版.xls。不过注意xlrd现在可能不支持.xlsx了,所以可能需要结合openpyxl和xlrd来处理不同格式。 然后,确定封装方法需要哪些参数。用户可能需要指定文件路径、工作表名称或索引,是否包含标题行,以及特定的列或行范围。此外,错误处理也很重要,比如文件不存在或格式错误时的异常捕获。 接着,设计函数的返回类型。通常返回DataFrame比较方便,因为pandas的DataFrame易于操作和分析。但也要考虑用户是否需要更底层的数据结构,比如列表的列表,但考虑到通用性,返回DataFrame可能更合适。 然后,考虑如何处理不同的Excel格式。需要根据文件扩展名自动选择引擎,或者让用户指定。例如,.xlsx用openpyxl,.xls用xlrd。不过pandas的read_excel已经可以自动处理,只要安装了相应的库。 然后,异常处理部分。需要捕获FileNotFoundError、ValueError(工作表不存在)、KeyError(列名错误)以及通用的异常,并给出友好的错误提示。 测试用例部分,需要示范如何调用函数,并处理可能的情况,比如读取指定工作表、无标题的情况,以及异常处理。 最后,提示扩展功能,比如读取多个工作表、数据清洗或写入Excel,让用户可以根据需要进一步开发。 总结一下,封装这样一个方法需要考虑库的选择、参数设置、返回类型、异常处理,以及扩展性。确保代码健壮且易于使用,同时提供足够的灵活性来处理不同情况。</think>我将分步骤为您讲解如何用Python封装一个通用的Excel文件读取方法: 1. **环境准备** ```python pip install pandas openpyxl xlrd ``` - `pandas`:核心数据处理库 - `openpyxl`:处理.xlsx格式文件 - `xlrd`:处理旧版.xls格式文件 2. **基础方法封装** ```python import pandas as pd from typing import Union def read_excel_file( file_path: str, sheet_name: Union[str, int, None] = 0, header: Union[int, None] = 0, usecols: Union[list, str, None] = None, skiprows: Union[int, list, None] = None ) -> pd.DataFrame: """ 通用Excel文件读取方法 参数: file_path: Excel文件路径 sheet_name: 工作表名称/索引(默认第一个工作表) header: 标题行索引(默认第0行) usecols: 指定读取列(字母或索引) skiprows: 跳过的行数 返回: pandas DataFrame对象 """ try: # 根据文件扩展选择引擎 engine = 'openpyxl' if file_path.endswith('.xlsx') else 'xlrd' df = pd.read_excel( file_path, sheet_name=sheet_name, header=header, usecols=usecols, skiprows=skiprows, engine=engine ) return df except FileNotFoundError: raise ValueError(f"文件 {file_path} 不存在") except Exception as e: raise RuntimeError(f"读取文件失败: {str(e)}") ``` 3. **功能扩展建议** - 添加数据类型转换 - 处理合并单元格 - 自定义空值处理 - 多工作表读取支持 - 大数据分块读取 4. **使用示例** ```python # 基础用法 df = read_excel_file("data.xlsx") # 读取第二个工作表(索引从0开始) df = read_excel_file("data.xlsx", sheet_name=1) # 读取指定列(支持字母或索引) df = read_excel_file("data.xlsx", usecols=["A", "C"]) # 按列字母 df = read_excel_file("data.xlsx", usecols=[0, 2]) # 按列索引 # 跳过前两行 df = read_excel_file("data.xlsx", skiprows=2) ``` 5. **异常处理增强版** ```python def safe_read_excel(...): # 包含基础版的try-catch,添加具体错误处理 try: # 原读取逻辑 except KeyError: raise ValueError("指定的工作表不存在") except PermissionError: raise RuntimeError("文件被其他程序占用") except ValueError as ve: if "Worksheet" in str(ve): raise ValueError("无效的工作表参数") else: raise ``` 6. **性能优化建议** - 大文件使用`chunksize`参数分块读取 - 禁用类型推断`dtype=object`提升速度 - 指定`nrows`参数限制读取行数 **完整最佳实践方案**: ```python from pathlib import Path def enhanced_excel_reader( file_path: str, sheet_name: Union[str, int, list, None] = 0, header: Union[int, list, None] = 0, dtype: dict = None, chunksize: int = None, na_values: list = ['', 'NA', 'NULL'] ) -> Union[pd.DataFrame, pd.io.excel.ExcelFile]: """ 增强型Excel读取器 参数: file_path: 文件路径 sheet_name: 支持多工作表读取 dtype: 列数据类型强制转换 chunksize: 分块读取大小 na_values: 自定义空值标识 """ if not Path(file_path).exists(): raise FileNotFoundError(f"文件路径不存在: {file_path}") if not Path(file_path).suffix.lower() in ['.xls', '.xlsx']: raise ValueError("仅支持Excel文件格式") try: return pd.read_excel( file_path, sheet_name=sheet_name, header=header, dtype=dtype, chunksize=chunksize, na_values=na_values, engine='openpyxl' if file_path.endswith('.xlsx') else 'xlrd' ) except Exception as e: error_mapping = { 'Workbook': "文件损坏或加密", 'Worksheet': "工作表不存在", 'password': "文件受密码保护" } for key, msg in error_mapping.items(): if key in str(e): raise RuntimeError(msg) from e raise ``` **使用场景示例**: ```python # 读取加密文件 try: df = enhanced_excel_reader("secret_data.xlsx") except RuntimeError as e: if "password" in str(e): print("需要密码才能打开文件") # 处理大数据文件 chunk_iter = enhanced_excel_reader("big_data.xlsx", chunksize=5000) for chunk in chunk_iter: process(chunk) # 自定义处理函数 ``` **注意事项**: 1. 不同版本Excel文件可能存在兼容性问题 2. 合并单元格会导致数据错位 3. 公式计算值可能需要特殊处理 4. 日期格式建议统一转换为datetime类型 5. 注意字符编码问题(特别是中文内容) 建议根据具体需求在此基础版本上进行功能扩展,例如添加自动类型推断、数据校验、日志记录等功能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值