Python excel文件操作及封装

本文介绍了如何使用Python的openpyxl库来读取和写入Excel文件,包括加载workbook、获取worksheet、访问cell、获取最大/小行数与列数以及向Excel写入数据的方法。还提供了一个封装好的ExcelTool类,方便进行Excel文件操作。

        在Python对Excel文件进行处理常用模块有xlrd、xlwt、openpyxl,其中xlrd主要用于读取Excel文件,xlwt用于向Excel中写入数据,openpyxl既能读取Excel文件也能向其中写入数据。openpyxl是一个用于读取/写入Excel 2010 xlsx、xlsm、xltm、xltx文件的库。

1、openpyxl中的常用方法

        openpyxl中有几个基本概念,其中workbook表示整个Excel工作表对象,Worksheet表示Excel表格中的一张表对象,Cell表示单元格对象。

        (1)加载Excel文件,获取workbook对象

import openpyxl

workbook = openpyxl.load_workbook('./test.xlsx')
print(workbook)

# <openpyxl.workbook.workbook.Workbook object at 0x000001768C808978>

        (2)获取worksheet对象

# 读取工作表中所有的sheet, 返回一个list
sheets = wb.sheetnames
print(sheets)
# ['Sheet1', 'Sheet2', 'Sheet3']

# 获取某个sheet, 返回Worksheet对象
sheet = wb[sheets[0]] 
print(sheet)
# <Worksheet "Sheet1">

        (3)访问Cell对象

"""
    访问单个cell:
        Worksheet.cell(row, column), 如Worksheet.cell(1, 1)
        Worksheet[position], 获取指定位置的cell, 如Worksheet['A3']

    访问多个cell,使用切片:
        Worksheet[num], 获取第num行的cell, 如Worksheet[1]
        Worksheet[num1:num2], 获取第num1到num2行的所有cell, Worksheet[1:3]
        Worksheet['pos1':'pos2'], 获取从pos1到pos2之间的所有cell, Worksheet['A1': 'D4']

    获取cell的值:
        获取指定位置单元格的值, Worksheet['position'].value
        获取指定位置单元格的值, Worksheet.cell(row, column, value).value
            row: 指定行
            colum: 指定列
            value: 默认为None, 单元值为空时的返回值
        获取sheet所有的值:
            sheet.values
"""
# 获取单个cell
cell = sheet.cell(3, 4)
print("cell:", cell)
# cell: <Cell 'Sheet1'.D3>

cell = sheet['d4']
print("cell", cell)
# cell: <Cell 'Sheet1'.D4>

# 获取多个cell A1-D4 区间内所有cell, 返回值是一个元组
cell = sheet['A1': 'D4']
print("cell:", cell)


# 获取B1 B2 B3 B4 四个单元格的cell, 返回值也是元组
cell = sheet['B1:B4']
print("cell:", cell)

# 获取1-3行的cell, 返回值也是元组
cell = sheet[1:3]
print("cell:", cell)

# 获取指定行的cell, 返回值也是元组
cell = sheet[1]
print("cell:", cell)

# 以行方式访问指定行到指定列之间所有的cell
for col in sheet.iter_rows(min_row=1, min_col=2, max_col=3, max_row=3):
    for cell in col:
        print(cell)
            
# 以列方式访问指定行到指定列之间所有的cell      
for col in sheet.iter_cols(min_row=1, min_col=2, max_col=3, max_row=3):
    for cell in col:
        print(cell)

# 获取所有行的cell,Worksheet.rows, 它是一个可迭代对象, 需要转换为tuple再进行访问
rows =  sheet.rows
print(tuple(rows))

# 以列方式获取所有cell, Worksheet.columns, 它是一个可迭代对象, 需要转换为tuple再进行访问
cols =  sheet.columns
print(tuple(rows))

# 获取指定位置单元格的值
data = sheet['A4'].value
print('data:', data)
# data: assd


# 获取所有值, 返回值是一个元组
data = tuple(sheet.values)
print("sheet的所有值为:", data)

        (4)获取sheet的最大/小行数与列数

# sheet.max_row, 最大行数
data = sheet.max_row
print('当前sheet的最大行数为:{}'.format(data))

# sheet.min_row,最小行数
data = sheet.min_row
print('当前sheet的最小行数为:{}'.format(data))

# sheet.max_column,最大列数
data = sheet.max_column
print('当前sheet的最大列数为:{}'.format(data))

# sheet.min_column,最小列数
data = sheet.min_column
print('当前sheet的最小列数为:{}'.format(data))

        (5)向Excel文件中写入数据

# 获取当前正在活动的sheet
sheet = workbook.active

# 向指定的cell赋值
sheet.cell(row, column, value)

# 保存excel文件到指定路径,不传值则默认覆盖原文件
workbook.save(filename=path)

注意:在向Excel文件写数据时,应该关闭Excel文件以避免报错

2、基于常用方法的封装(封装一个工具类处理Excel文件)

# -*- coding: utf-8 -*-
# description: 封装对excel文件的操作

import openpyxl

class ExcelTool:
    """
    封装一个处理excel文件的工具类
    """
    def __init__(self, path):
        """
        加载文件, 创建一个workbook对象
        :param path, excel文件路径
        """
        self.workbook = openpyxl.load_workbook(path)
        self.worksheet = None

    def get_sheet(self, var):
        """
        通过索引或者名字获取sheet
        :param var: 索引or名字
        :return: sheet
        """
        if isinstance(var, int):
            self.worksheet = self.workbook[self.workbook.sheetnames[var]]
            return self.worksheet

        if isinstance(var, str):
            self.worksheet = self.workbook[var]
            return self.worksheet

    def get_cell_value(self, row, col):
        """
        获取cell的值
        :param row: cell所在行
        :param col: cell所在列
        :return: cell的值
        """
        try:
            return self.worksheet.cell(row=row, column=col).value
        except BaseException as e:
            return None

    def get_max_row(self):
        """
        获取最大行数
        :return: 最大行数
        """
        return self.worksheet.max_row

    def get_min_row(self):
        """
        获取最小行数
        :return: 最小行数
        """
        return self.worksheet.min_row

    def get_max_col(self):
        """
        获取最大列数
        :return: 最大列数
        """
        return self.worksheet.max_column

    def get_min_col(self):
        """
        获取最小列数
        :return: 最小列数
        """
        return self.worksheet.min_column

    def get_all_value(self):
        """
        获取所有数据
        :return:
        """
        return tuple(self.worksheet.values)

    def get_row_data(self, row):
        """
        获取指定行的所有数据
        :param row: 指定行
        :return: 所有行数据组成的列表
        """
        return list(self.get_all_value()[row])

    def get_col_data(self, col):
        """
        获取指定列的所有数据
        :param col: 指定列, 如'A'
        :return: 所有列数据组成的列表
        """
        col_data_list = []
        for i in self.worksheet[col]:
            col_data_list.append(i.value)
        return col_data_list

    def write_data(self, row, col, value, path):
        """
        写入数据
        :param row: 指定cell所在行
        :param col: 指定cell所在列
        :param value: cell的值
        :param path: 保存文件路径
        """
        try:
            self.worksheet = self.workbook.active
            self.worksheet.cell(column=col, row=row, value=value)
            self.workbook.save(path)
        except BaseException as e:
            print(e)
            return None

if __name__ == '__main__':
    path = './test_case.xlsx'
    workbook = ExcelTool(path)

    workbook.get_sheet(1)
    print(workbook.get_sheet(1))
    # >>> <Worksheet "Sheet2">

    # 获取指定sheet
    workbook.get_sheet('Sheet1')
    print(workbook.get_sheet('Sheet1'))
    # >>> <Worksheet "Sheet1">

    # 获取指定cell的值
    data = workbook.get_cell_value(1, 3)
    print("data:", data)

    # 获取当前sheet某一行、列的数据
    data = workbook.get_row_data(2)
    print('第2行的数据为:', data)

    data = workbook.get_col_data('C')
    print('第c列的数据为:', data)

    # 写入数据
    workbook.write_data(11, 2, 'excel dispose', path)
以下是一个简单的 Python Excel 文件读写操作的类封装示例: ```python import pandas as pd class ExcelFile: def __init__(self, file_path): self.file_path = file_path self.data = None # 读取 Excel 文件 def read_file(self): try: # 使用 pandas 库读取 Excel 文件 self.data = pd.read_excel(self.file_path) except FileNotFoundError: print(f"File {self.file_path} not found.") # 写入 Excel 文件 def write_file(self): try: # 将数据写入到 Excel 文件中 writer = pd.ExcelWriter(self.file_path) self.data.to_excel(writer, index=False) writer.save() print(f"File {self.file_path} saved successfully.") except: print(f"Failed to save file {self.file_path}.") # 测试代码 if __name__ == "__main__": # 创建 ExcelFile 对象 excel_file = ExcelFile("example.xlsx") # 读取 Excel 文件 excel_file.read_file() if excel_file.data is not None: print(excel_file.data) # 写入 Excel 文件 new_data = {"Name": ["John", "Mary", "Peter"], "Age": [30, 25, 40]} df = pd.DataFrame(new_data) excel_file.data = df excel_file.write_file() ``` 在这个示例中,我们定义了一个名为 `ExcelFile` 的类,这个类封装Excel 文件的读取和写入操作。在初始化函数中,我们传入一个文件路径,并将其保存为类的属性。`read_file` 函数尝试读取这个文件,并将读取到的数据保存为类的属性。`write_file` 函数将类的属性中的数据写入到对应的文件中。 在测试代码中,我们首先创建一个 `ExcelFile` 对象,并调用 `read_file` 函数来读取一个名为 `example.xlsx` 的 Excel 文件,并将读取到的数据输出到控制台。然后我们创建一个新的 DataFrame 对象,并将其保存为 `ExcelFile` 对象的属性,最后调用 `write_file` 函数将这个 DataFrame 中的数据写入到一个名为 `example.xlsx` 的 Excel 文件中。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值