execel.py 3.13 KB
# coding:utf-8

import os

from openpyxl import Workbook, load_workbook


class SheetIndexError(Exception):
    """Sheet数目下标获取异常"""
    message = "sheet下标超过范围"


class Excel(object):
    """Excel 基类"""

    @staticmethod
    def _load_file(file_name):

        if not os.path.exists(file_name):
            raise FileNotFoundError(
                "file '{file_name}' is not found.".format(file_name=file_name))

        return load_workbook(file_name)

    def write_header(self, head: list):
        """生成excel头部信息。

        :param head: excel头部列表
        :type head: list
        :return:
        """
        self.write_row(1, head)

    def write_row(self, row_num, values):
        """写一行。"""
        for column, value in enumerate(values):
            self._cell(row=row_num, column=column + 1, value=value)

    def write_rows(self, row_start, rows):
        """写多行。"""

        row_num = row_start
        for row in rows:
            self.write_row(row_num, row)
            row_num += 1

    def save(self):
        self.save2file(self._file)

    def save2file(self, file_name):
        """保存到指定文件。"""

        self._excel.save(file_name)

    def set_sheet_title(self, title):
        self._current_sheet.title = title

    def _cell(self, row, column, value=None):
        return self._current_sheet.cell(row, column, value)

    def sheet_select(self, index):
        """选取某个sheet作为当前活动sheet"""
        try:
            self._current_sheet = self._excel.get_index(index)
        except IndexError:
            raise SheetIndexError(SheetIndexError.message)

    @property
    def row_number(self):
        """获取当前excel的row。"""

        return self._current_sheet.max_row

    @property
    def column_number(self):
        """获取excel的column。"""

        return self._current_sheet.max_column

    def read_rows(self, min_row=None, max_row=None, max_col=None):
        """读取第row行的数据。"""
        # iter_rows(self, range_string=None, min_row=None, max_row=None, min_col=None, max_col=None,
        #           row_offset=0, column_offset=0):
        rows = []
        for row in  self._current_sheet.iter_rows(min_row=min_row, max_row=max_row, max_col=max_col):
            row_data = []
            for cell in row:
                row_data.append(cell.value)
            rows.append(row_data)

        return rows

    def read_column(self, col):
        """读取第column列的数据。"""
        # iter_cols(self, min_col=None, max_col=None, min_row=None, max_row=None):
        data = self._current_sheet.iter_cols(min_col=col, max_col=col)
        res = []
        for item in data:
            for i in item:
                res.append(i.value)

        return res


class ExcelReader(Excel):

    def __init__(self, file_name):
        self._file = file_name

        self._excel = self._load_file(self._file)
        self._current_sheet = self._excel.active


class ExcelWriter(Excel):

    def __init__(self, file_name):
        self._file = file_name

        self._excel = Workbook()
        self._current_sheet = self._excel.active