天天看点

python对于openpyxl的封装

openpyxl版本: 2.5.0, pandas版本: 0.22      
# -*- coding:utf-8 -*-

from pandas import DataFrame
from openpyxl import load_workbook
from openpyxl.utils.dataframe import dataframe_to_rows
from Tools.tools import decoLOG
from Tools.Log import Log

'''
    功能:      Excel类
    作者: 
    作成时间:
    更新内容:
    更新时间:
'''

class Excel(object):
    def __init__(self, filename=""):
        # excel file
        self.fileName = filename
        self.workbook = None

    # open excel
    def openFile(self, filename=""):
        if filename == "" and self.fileName == "":
            Log().logger.error("Open Excel Error![Filename is nothing]")
            return None
        else:
            try:
                self.fileName = (filename if filename!="" else self.fileName)
                self.workbook = load_workbook(filename=self.fileName, read_only=False,
                                data_only=True, keep_vba=True)
            except Exception as e:
                Log().logger.error("Open Excel Error![MSG=%s,Filename=%s]"%(str(e),self.fileName))
                return None
            return self.workbook

    # excel is opened or not
    def isOpen(self):
        if self.workbook is None:
            return False
        else:
            return True

    # close excel
    def close(self):
        if self.isOpen():
            self.workbook.close()

    # read sheet to array
    @decoLOG
    def readSheetToArray(self, sheetname):
        if self.fileName == "":
            Log().logger.error("Filename is nothing! Read Sheet Error!")
            return None
        if not self.isOpen():
            if self.openFile() is None:
                return None
        try:
            data = self.workbook[sheetname].values
        except Exception as e:
            Log().logger.error("Read Sheet Error![MSG=%s, Filename=%s, Sheetname=%s]"%(str(e),self.fileName,sheetname))
            return None
        return DataFrame(data)

    # write array to sheet
    def writeSheetbyArray(self, sheetname, df):
        if self.fileName == "":
            Log().logger.error("Filename is nothing! Read Sheet Error!")
            return None
        if not self.isOpen():
            if self.openFile() is None:
                return None
        if sheetname in self.workbook.sheetnames:
            self.workbook.remove(self.workbook[sheetname])
        ws = self.workbook.create_sheet(sheetname, len(self.workbook.sheetnames))
        for r in dataframe_to_rows(df, index=False, header=False):
            ws.append(r)

    # save excel
    def save(self):
        if not self.workbook.read_only:
            self.workbook.save(self.fileName)