1.Excel Code

import os
import time
import re
import win32com.client


def dealpath(pathname='') -> str:
    """
    deal with windows file path

    :param pathname: path name of excel
    :return: path
    """
    if pathname:
        pathname = pathname.strip()
    if pathname:
        pathname = r'%s' % pathname
        pathname = pathname.replace('/', '\\')
        pathname = os.path.abspath(pathname)
        if pathname.find(":\\") == -1:
            pathname = os.path.join(os.getcwd(), pathname)
    return pathname


def tuple_to_list(data: tuple) -> list:
    """
    convert tuple to list

    :param data: One/two-dimensional tuple
    :return: list
    """
    ret = list(data)
    for index in range(len(ret)):
        if isinstance(ret[index], tuple):
            ret[index] = list(ret[index])
    return ret


class EasyExcel(object):

    def __init__(self, visible=False):
        """initial excel application"""
        self.m_filename = ''
        self.m_book = None
        self.m_exists = False
        self.m_excel = win32com.client.DispatchEx('Excel.Application')
        # self.m_excel.Visible = visible
        self.m_excel.DisplayAlerts = False

    @staticmethod
    def getColDict():
        """

        :return:
        """
        dict = {'A': 1, 'B': 2, 'C': 3,
                'D': 4, 'E': 5, 'F': 6,
                'G': 7, 'H': 8, 'I': 9,
                'J': 10, 'K': 11, 'L': 12,
                'M': 13, 'N': 14, 'O': 15,
                'P': 16, 'Q': 17, 'R': 18,
                'S': 19, 'T': 20, 'U': 21,
                'V': 22, 'W': 23, 'X': 24,
                'Y': 25, 'Z': 26, 'AA': 27,
                'AB': 28, 'AC': 29, 'AD': 30,
                'AE': 31, 'AF': 32, 'AG': 33,
                'AH': 34, 'AI': 35, 'AJ': 36,
                'AK': 37, 'AL': 38, 'AM': 39,
                'AN': 40, 'AO': 41, 'AP': 42,
                'AQ': 43, 'AR': 44, 'AS': 45,
                'AT': 46, 'AU': 47, 'AV': 48,
                'AW': 49, 'AX': 50, 'AY': 51,
                'AZ': 52, 'BA': 53, 'BB': 54,
                'BC': 55, 'BD': 56, 'BE': 57,
                'BF': 58, 'BG': 59, }
        return dict

    def open(self, filename=''):
        """open excel file

        :param filename:
        :return:
        """
        if getattr(self, 'm_book', False):
            self.m_book.Close()
        self.m_filename = dealpath(filename) or ''
        self.m_exists = os.path.isfile(self.m_filename)
        if not self.m_filename or not self.m_exists:
            self.m_book = self.m_excel.Workbooks.Add()
        else:
            self.m_book = self.m_excel.Workbooks.Open(self.m_filename)

        return self

    def reset(self):
        """
        reset class
        """
        self.m_book = None
        self.m_excel = None
        self.m_filename = ''

    def save(self, newfile=''):
        """
        save excel

        :param newfile: new file path or name
        :return:
        """
        assert type(newfile) is str, ''
        newfile = dealpath(newfile) or self.m_filename
        if not newfile or (self.m_exists and newfile == self.m_filename):
            self.m_book.Save()
        else:
            pathname = os.path.dirname(newfile)
            # 不存在则创建
            if not os.path.isdir(pathname):
                os.makedirs(pathname)
                self.m_filename = newfile
                self.m_book.SaveAs(newfile)
            else:
                self.m_filename = newfile
                self.m_book.SaveAs(newfile)
        self.close()

    def close(self):
        """
        close the application
        """

        self.m_book.Close(SaveChanges=1)
        self.m_excel.Quit()
        time.sleep(2)
        self.reset()

    def addSheet(self, sheetname=None):
        """add new sheet, the name of sheet can be modify,but the workbook can't

        :param sheetname: sheet name
        :return:
        """
        sht = self.m_book.Worksheets.Add()
        sht.Name = sheetname if sheetname else sht.Name
        return sht

    def getSheet(self, sheet):
        """get the sheet object by the sheet index

        :param sheet:sheet index or sheet name
        :return: sheet object
        """
        return self.m_book.Worksheets[sheet]

    def getSheetCount(self):
        """

        get the number of sheet
        """
        return self.m_book.Worksheets.Count

    def getCell(self, sheet, row=1, col=1):
        """
        get the cell object

        :param sheet:  sheet name
        :param row: row index
        :param col: col index
        :return: cell data
        """
        # assert row > 0 and col > 0, 'the row and column index must bigger then 0'
        return self.getSheet(sheet).Cells(row, col)

    def getRow(self, sheet, row=1):
        """
        get the row object

        :param sheet: sheet name
        :param row: row index
        :return: row data
        """
        assert row > 0, 'the row index must bigger then 0'
        return self.getSheet(sheet).Rows(row)

    def getCol(self, sheet, col):
        """get the column object

        :param sheet: sheet name or index
        :param col: column index
        :return: column data
        """
        # assert col > 0, 'the column index must bigger then 0'
        return self.getSheet(sheet).Columns(col)

    def getRange(self, sheet, row1, col1, row2, col2):
        """get the range object

        :param sheet:sheet name or sheet index
        :param row1:
        :param col1:
        :param row2:
        :param col2:
        :return:
        """
        sht = self.getSheet(sheet)
        return sht.Range(self.getCell(sheet, row1, col1), self.getCell(sheet, row2, col2))

    def getCellValue(self, sheet, row, col):
        """Get value of one cell

        :param sheet: sheet name or sheet index
        :param row: row index
        :param col: column index
        :return:
        """
        return self.getCell(sheet, row, col).Value

    def setCellValue(self, sheet, row, col, value):
        """set value of one cell

        :param sheet:
        :param row:
        :param col:
        :param value:
        """
        self.getCell(sheet, row, col).Value = value

    def getRowValue(self, sheet, row):
        """get the row values

        :param sheet:
        :param row:
        :return:
        """
        return self.getRow(sheet, row).Value

    def setRowValue(self, sheet, row, values):
        """set the row values

        :param sheet:
        :param row:
        :param values:
        """
        self.getRow(sheet, row).Value = values

    def getColValue(self, sheet, col):
        """get the row values

        :param sheet:
        :param col:
        :return:
        """
        return self.getCol(sheet, col).Value

    def setColValue(self, sheet, col, values):
        """set the row values

        :param sheet:  sheet name or sheet index
        :param col: column index
        :param values: value string
        """
        self.getCol(sheet, col).Value = values

    def getRangeValue(self, sheet, row1, col1, row2, col2):
        """
        return a tuples of tuple)

        :param sheet: sheet name or index
        :param row1: start row index
        :param col1: start col index
        :param row2: end row index
        :param col2: end col index
        :return:
        """
        return self.getRange(sheet, row1, col1, row2, col2).Value

    def setRangeValue(self, sheet, row1, col1, data):
        """
        set the range values

        :param sheet: sheet name or index
        :param row1: Start row index
        :param col1: Start col index
        :param data:Two-dimensional array [['A','B'],['C','D']]
        """
        row2 = row1 + len(data) - 1
        if data[0]:
            col2 = col1 + len(data[0]) - 1
        else:
            col2 = col1

        range = self.getRange(sheet, row1, col1, row2, col2)
        range.ClearContents()
        range.Value = data

    def getMaxRow(self, sheet):
        """get the max row number, not the count of used row number

        :param sheet:sheet name or sheet index
        :return:
        """
        return self.getSheet(sheet).Rows.Count

    def getCellName(self, sheet, row, col):
        """

        :param sheet:
        :param row:
        :param col:
        :return:
        """
        addr = self.getCell(sheet, row, col).Address
        return re.sub(r"[\s+\.\!\/_,$%^*(+\"\')]+|[+——()?【】“”!,。?、~@#¥%……&*()]+'", "", addr)

    def getMaxCol(self, sheet):
        """get the max col number, not the count of used col number

        :param sheet:
        :return:
        """
        return self.getSheet(sheet).Columns.Count

    def clearCell(self, sheet, row, col):
        """clear the content of the cell

        :param sheet:
        :param row:
        :param col:
        """
        self.getCell(sheet, row, col).Clear()

    def deleteCell(self, sheet, row, col):
        """delete the cell

        :param sheet:sheet name or sheet index
        :param row:
        :param col:
        """
        self.getCell(sheet, row, col).Delete()

    def clearRow(self, sheet, row):
        """clear the content of the row

        :param sheet:
        :param row:
        """
        self.getRow(sheet, row).Clear()

    def deleteRow(self, sheet, row):
        """delete the row

        :param sheet:
        :param row:
        """
        self.getRow(sheet, row).Delete()

    def clearCol(self, sheet, col):
        """clear the col

        :param sheet:sheet name or sheet index
        :param col:column index
        """
        self.getCol(sheet, col).Clear()

    def deleteCol(self, sheet, col):
        """delete the col

        :param sheet:sheet name or sheet index
        :param col:column index
        """
        self.getCol(sheet, col).Delete()

    def deleteColByName(self, sheet, col):
        """

        :param sheet:sheet name or sheet index
        :param col:
        """
        self.getColByName(sheet, col).Delete()

    def getColByName(self, sheet, col):
        """

        :param sheet:
        :param col:
        :return:
        """
        return self.getSheet(sheet).Columns[col]

    def clearSheet(self, sheet):
        """clear the hole sheet
        just all the content and formula
        :param sheet:
        """
        maxrow = self.getMaxRow(sheet)
        maxcol = self.getMaxCol(sheet)
        rh = self.getRange(sheet, 1, 1, maxrow, maxcol)
        return rh.ClearContents()

    def deleteSheet(self, sheet):
        """delete the hole sheet
        :param sheet:
        """
        self.getSheet(sheet).Delete()

    def deleteRows(self, sheet, fromRow, count=1):
        """delete count rows of the sheet
        :param sheet:
        :param fromRow:
        :param count:
        :return:
        """
        maxrow = self.getMaxRow(sheet)
        maxcol = self.getMaxCol(sheet)
        endrow = fromRow + count - 1
        if fromRow > maxrow or endrow < 1:
            return
        self.getRange(sheet, fromRow, 1, endrow, maxcol).Delete()

    def deleteCols(self, sheet, fromCol, count=1):
        """delete count cols of the sheet
        :param sheet:
        :param fromCol:
        :param count:
        :return:
        """
        maxrow = self.getMaxRow(sheet)
        maxcol = self.getMaxCol(sheet)
        endcol = fromCol + count - 1
        if fromCol > maxcol or endcol < 1:
            return
        self.getRange(sheet, 1, fromCol, maxrow, endcol).Delete()

    def clearRange(self, sheet, row1, col1, row2, col2):
        """clear range of sheet
        :param sheet:
        :param row1:
        :param col1:
        :param row2:
        :param col2:
        """
        self.getRange(sheet, row1, col1, row2, col2).Clear()

    def copyPasteRange(self, sheet, row1, col1, row2, col2):
        """
         copy sheet range to another sheet, keep the same sheet name

        :param sheet:sheet name or sheet index
        :param row1:start row
        :param col1:start column
        :param row2:end row
        :param col2:end column
        """
        self.getRange(sheet, row1, col1, row2, col2).Copy()
        sh_name = self.getSheet(sheet).Name
        self.addSheet(sheetname='Sheet1')
        self.pasteRange(sheet='Sheet1', row1=row1, col1=col1, row2=row2, col2=col2)
        self.deleteSheet(sh_name)
        self.getSheet(sheet='Sheet1').Name = sh_name

    def sortSheet(self, sheet, col, ascending=False):
        """
        sort sheet by column name or column index

        :param sheet:sheet name or sheet index
        :param col:column name or column index
        :param ascending:Ascending/descending
        :return:
        """
        maxrow = self.getMaxRow(sheet)
        maxcol = self.getMaxCol(sheet)

        if isinstance(col, int):
            cell_name = self.getCellName(sheet, 1, col)
        else:
            dic = self.getColDict()
            cell_name = self.getCellName(sheet, 1, dic[col])

        sh = self.m_book.Worksheets[sheet]

        ra = sh.Range(cell_name)
        if ascending:
            order = 1
        else:
            order = 2
        self.getRange(sheet, 1, 1, maxrow, maxcol).Sort(Key1=ra, Header=1, Order1=order, Orientation=1)
        return self

    def keepCol(self, sheet, row=5):
        """
        keep some columns and delete the other columns
        :param sheet:sheet name
        :param row: row index
        """
        maxcol = 60
        for item in range(maxcol, 0, -1):
            value = self.getCellValue(sheet, row, item)
            if value is None or value == '':
                self.deleteCol(sheet=sheet, col=item)
        return self

    def getLastRow(self, sheet, col=None):
        """get the last row index

        :param sheet:sheet name or sheet index
        :param col:column index
        :return:
        """
        maxrow = self.getMaxRow(sheet)

        for item in range(maxrow):
            item += 1
            if self.getCellValue(sheet=sheet, row=item, col=col) is None:
                return item - 1

    def getLast(self, sheet, col=None, start=None):
        """get the last row index

        :param sheet:sheet name or sheet index
        :param col:column index
        :return:
        """
        maxrow = self.getMaxRow(sheet)

        for item in range(start, maxrow):
            item += 1
            if self.getCellValue(sheet=sheet, row=item, col=col) is None:
                return item - 1

    def pasteRange(self, sheet, row1, col1, row2, col2):
        """
        paste range

        :param sheet: sheet name or sheet index
        :param row1: start row
        :param col1: start column
        :param row2: end row
        :param col2: end column
        :return:
        """
        return self.getSheet(sheet).Paste(self.getRange(sheet, row1, col1, row2, col2))

    def insertRow(self, sheet, row, data):
        """
        insert one row

        :param sheet: sheet name or sheet index
        :param row: row index
        :param data: data list
        """
        lent = len(data[0])
        sh = self.m_book.Worksheets[sheet]
        sh.Rows(row).Insert(1)
        range = self.getRange(sheet, row, 1, row, lent)
        range.Clear()
        range.Value = data[0]

    def dataShift(self, sheet, fromc, tocol, colcount, incheader=False):
        """
        data shift from a range to another

        :param sheet:sheet name or sheet index
        :param fromc: from column
        :param tocol: to column
        :param colcount: column count
        :param incheader:True -include header;False -exclude header
        """
        if incheader:
            srow = 1
        else:
            srow = 2

        erow = self.getLastRow(sheet=sheet, col=fromc)

        ecol = fromc + colcount
        etocol = tocol + colcount

        self.getRange(sheet, srow, fromc, erow, ecol).Cut()
        self.pasteRange(sheet, srow, tocol, erow, etocol)

    def dataShift1(self, sheet, fromc, tocol, starow, colcount, rowcount):
        """
        data shift from one range to another

        :param sheet: sheet name or sheet index
        :param fromc:from column
        :param tocol:to column
        :param starow: start row
        :param colcount: column count
        :param rowcount: row count
        """
        srow = starow
        erow = starow + rowcount - 1

        ecol = fromc + colcount - 1
        etocol = tocol + colcount - 1

        self.getRange(sheet, srow, fromc, erow, ecol).Cut()
        self.pasteRange(sheet, srow, tocol, erow, etocol)

    def negativeData(self, sheet, collist=None, includeHeader=False):
        """
        Some columns, take the opposite number

        :param sheet:sheet name or sheet index
        :param collist: column list to process
        :param includeHeader: True -include header; False -exclude header
        :return:
        """
        if collist is None:
            return
        if includeHeader:
            srow = 1
        else:
            srow = 2

        lastrow = self.getLastRow(sheet=sheet, col=collist[0])
        ind = srow
        for item in collist:
            ind = srow
            while ind <= lastrow:
                emp = self.m_book.Worksheets(sheet).Cells(ind, item).value
                self.m_book.Worksheets(sheet).Cells(ind, item).value = -emp
                ind += 1

    def del_colwithcolor(self, sheet, column, includehead=False):
        """
        delete rows that with color

        :param sheet:sheet name or sheet index
        :param column: column index
        :param includehead: True -include header; False -exclude header
        """
        lastrow = self.getLastRow(sheet=sheet, col=column)

        if includehead:
            srow = 1
        else:
            srow = 2
        sh = self.getSheet(sheet)
        for item in range(lastrow, srow-1, -1):
            if sh.Cells(item, column).Interior.ColorIndex > 0:
                self.deleteRow(sheet, item)

    def del_rowby(self, sheet, column, includhead=False, null=False):
        """
        delete rows by one column value is null or not null

        :param sheet: sheet name or sheet index
        :param column: column index
        :param includhead: True- include header; False - exclude header
        :param null:True -when not null ->delete; False- when null ->delete
        """
        lastrow = self.getLastRow(sheet=sheet, col=1)
        if includhead:
            srow = 1
        else:
            srow = 2
        sh = self.getSheet(sheet)
        for item in range(lastrow, srow-1, -1):
            if null:
                if sh.Cells(item, column).value is not None:
                    self.deleteRow(sheet, item)
            else:
                if sh.Cells(item, column).value is None:
                    self.deleteRow(sheet, item)

    def del_rowStartWith(self, sheet, col, st='', tof=False, head=False):
        """
        delete rows by one column value, which start/or not start with a str value

        :param sheet: sheet name or sheet index
        :param col: value condition column
        :param st: string
        :param tof:Ture - start with; False- not start with
        :param head:Ture -  include header; False - not include header
        """
        lastrow = self.getLastRow(sheet=sheet, col=1)
        if head:
            srow = 1
        else:
            srow = 2
        sh = self.getSheet(sheet)
        for item in range(lastrow, srow-1, -1):
            if tof:
                if str(sh.Cells(item, col).value).startswith(st):
                    self.deleteRow(sheet, item)
            else:
                if not str(sh.Cells(item, col).value).startswith(st):
                    self.deleteRow(sheet, item)

    def plus_cols(self, sheet, cols=None, rescol='', startrow=1):
        """
        Write the sum of several columns into another column

        :param sheet:sheet name or sheet index
        :param cols: columns index list for plus
        :param rescol: column index for total to write
        :param startrow: startrow index
        :return:
        """
        if cols is None:
            return
        sh = self.getSheet(sheet)
        while sh.Cells(startrow, cols[0]).value is not None:
            val = 0
            for item in cols:
                val = val + sh.Cells(startrow, item).value
            sh.Cells(startrow, rescol).value = val
            startrow += 1

    def cls_not_head(self, sheet, col):
        """
        clear columns not include the first row

        :param sheet: sheet name or sheet index
        :param col: columns index(not columns name)
        """
        head = self.getSheet(sheet).Cells(1, col).value
        self.clearCol(sheet, col)
        self.getSheet(sheet).Cells(1, col).value = head

    def with_color(self, sheet, col, row, date=False, pcstr=''):
        """
        special function: get dic of [col].value and [col+1].value with colors

        :param sheet: sheet name or sheet index
        :param col: column index
        :param row: row index
        :param date: if column value is date or not
        :return: dic
        """
        dic = {}
        strow = row
        maxrow = self.getMaxRow(sheet)
        sh = self.getSheet(sheet)
        while strow <= maxrow and sh.Cells(strow, col).value is not None:
            if sh.Cells(strow, col).Interior.ColorIndex > 0:
                if date:
                    dic[sh.Cells(strow, col).value.strftime(pcstr)] = sh.Cells(strow, col+1).value
                else:
                    dic[sh.Cells(strow, col).value] = sh.Cells(strow, col+1).value

            strow = strow + 1
        return dic

2. Config Code

import os.path
import datetime as dt
from pathhandle import *
import configparser
import xlrd


class Config(object):
    def __init__(self):
        """
        :self.xls  ->excel Suffix
        :self.xlsx ->excel Suffix
        :self.rfkrtim ->excel Prefix
        :self.customer ->excel Prefix
        :self.recon ->excel Prefix
        :self.input ->excel file name[input.xlsx]
        :self.emp ->excel file name[EMP.xlsx]
        :self.inputfm ->Date format of excel
        :self.template ->file folder
        :self.result ->file folder
        :self.pend ->Suffix part of file name
        :self.path ->work folder to store excel files[user config]
        :self.path1 ->path of file [RFKRTIMyyyy.mm.dd.xls]
        :self.path2 ->path of file [S_ALR_87012357 customer_yyyy.mm.dd.xlsx]
        :self.path3 ->path of file [FBL3N recon_yyyy.mm.dd.xlsx]
        :self.path4 ->same as path1
        :self.path5 ->path of file [input.xls]
        :self.path6 ->path of file [2021 Summary.xlsx]
        :self.path7 ->path of file [EMP.xlsx]
        :self.path8 ->path of file [RFKRTIMyyyy.mm.ddpending.xls](second time download)
        :self.path9 ->path of file [건별세금계산서_20210401.xlsx]
        :self.path10 ->path of file [Customer master.xlsx]
        :self.path11 ->path of file [SB upload20210401.xlsx]
        :self.folder ->folder name generate by date of yesterday [YYYYMMDD]
        :self.work_folder ->path [self.path + self.folder]
        :self.sheet4 ->sheet name of file [RFKRTIMyyyy.mm.dd.xls] format [YYYY.MM.DD]
        :self.sh_pending ->sheet name of file [RFKRTIMyyyy.mm.dd.xls] [Pending] [customer config]
        :self.sh_final ->sheet name of file [2021 Summary.xlsx] [Pending_final]
        :self.sapexe ->path of sap exe [customer config]
        :self.h_budat ->column name [Posting Date]
        :self.user ->user name of sap
        :self.passw ->password of sap
        :self.downloadp -> download path of sap
        :self.window ->window name of sap
        :self.yest ->date of yesterday
        :self.sh_rerun ->sheet name of file[RFKRTIMyyyy.mm.ddpending.xls]
        :self.sh_reco -sheet name of file[2021 Summary.xlsx] [Reconciliation]
        :self.sapdatefm -> date format of sap
        :self.fmstr ->python date format string depending on sap date
        :self.yyyymmdd ->header info of sheet [YYYY.MM.DD]
        :self.pending ->header info of sheet [Pending]
        :self.timestamp = []
        :self.currentmonth = sheet header of current month[YYYY.MM]
        :self.holiday_dict ->holiday list       20号 13号
        :self.post_date ->posting date list
        """
        self.xls = '.xls'
        self.xlsx = '.xlsx'
        self.rfkrtim = 'RFKRTIM'
        self.customer = 'S_ALR_87012357 customer_'
        self.recon = 'FBL3N recon_'
        self.input = 'input'
        self.emp = 'EMP'
        self.inputfm = '%Y.%m.%d'
        self.template = 'template'
        self.result = 'result'
        self.pend = 'pending'
        self.automatic = 'Y'

        self.visible = ''
        self.log1 = ''
        self.log2 = ''
        self.read = ''
        self.path = ''
        self.path1 = ''
        self.path1_bk = ''
        self.path2 = ''
        self.path2_bk = ''
        self.path3 = ''
        self.path3_bk = ''
        self.path4 = ''
        self.path5 = ''
        self.path6 = ''
        self.path7 = ''
        self.path8 = ''
        self.path9 = ''
        self.path10 = ''
        self.path11 = ''
        self.path12 = ''
        self.folder = ''
        self.work_folder = ''

        self.sheet4 = ''
        self.sh_pending = ''
        self.sh_final = ''
        self.h_budat = ''
        self.sh_rerun = ''
        self.sh_reco = ''
        self.sh_manual = ''

        self.sapexe = ''
        self.user = ''
        self.passw = ''
        self.window = ''

        self.downloadp = ''
        self.yest = ''
        self.yestfname = ''
        self.start = ''
        self.end = ''
        self.today = dt.date.today()
        # self.today = dt.datetime.strptime('2021.08.10', self.inputfm)

        self.sapdatefm = ''
        self.pcdatefm = ''
        self.fmstr = ''
        self.pcstr = ''

        self.yyyymmdd = []
        self.pending = []
        self.timestamp = []
        self.currentmonth = []
        self.holiday_dict = {}
        self.post_date = []

    def loadConfig(self, configfile='./config.ini'):
        """parse config file"""
        file = dealPath(configfile)
        if not os.path.isfile(file):
            print('Can not find the config.ini!')
            return False
        parser = configparser.ConfigParser()
        parser.read(file, encoding='UTF-8')

        self.folder = self.get_foldername()
        # self.folder = '2021.05.20'
        # self.yest = '2021.05.20'
        self.automatic = parser.get('pathconfig', 'automatic').strip()
        self.path = parser.get('pathconfig', 'path').strip()
        self.path5 = self.path + '\\' + self.template + '\\' + self.input + self.xls
        self.sapdatefm = parser.get('otherconfig', 'sapdatefm').strip()
        if self.sapdatefm == 'MM/DD/YYYY':
            self.fmstr = '%m/%d/%Y'
        elif self.sapdatefm == 'DD/MM/YYYY':
            self.fmstr = '%d/%m/%Y'
        elif self.sapdatefm == 'DD.MM.YYYY':
            self.fmstr = '%d.%m.%Y'
        elif self.sapdatefm == 'MM-DD-YYYY':
            self.fmstr = '%d-%d-%Y'
        elif self.sapdatefm == 'YYYY.MM.DD':
            self.fmstr = '%Y.%m.%d'
        elif self.sapdatefm == 'YYYY/MM/DD':
            self.fmstr = '%Y/%m/%d'
        elif self.sapdatefm == 'YYYY-MM-DD':
            self.fmstr = '%Y-%m-%d'

        self.get_holiday()
        self.Date_start_end()
        self.yest = self.get_yest()

        self.work_folder = self.path + "\\" + self.folder
        self.log1 = self.path + "\\" + self.folder + '\\' + 'log1.txt'
        self.log2 = self.path + "\\" + self.folder + '\\' + 'log2.txt'
        self.path1 = self.path + '\\' + self.folder + '\\' + self.rfkrtim + self.yest + self.xls
        self.path1_bk = self.path + '\\' + self.folder + '\\' + 'backup' + '\\' + self.rfkrtim + self.yest + self.xls

        self.sheet4 = self.rfkrtim + self.yest
        self.path2 = self.path + '\\' + self.folder + '\\' + self.customer + self.yest + self.xlsx
        self.path2_bk = self.path + '\\' + self.folder + '\\' + 'backup' + '\\' + self.customer + self.yest + self.xlsx
        self.h_budat = parser.get('pathconfig', 'h_budat').strip()
        self.path3 = self.path + '\\' + self.folder + '\\' + self.recon + self.yest + self.xlsx
        self.path3_bk = self.path + '\\' + self.folder + '\\' + 'backup' + '\\' + self.recon + self.yest + self.xlsx
        self.path4 = self.path1
        self.sh_pending = parser.get('pathconfig', 'sh_pending').strip()
        self.sh_final = parser.get('pathconfig', 'sh_final').strip()

        self.path6 = parser.get('pathconfig', 'path6').strip()
        self.path6 = self.path + '\\' + self.template + '\\' + self.path6
        self.sh_reco = parser.get('pathconfig', 'sh_reco').strip()
        self.path7 = self.path + '\\' + self.folder + '\\' + self.emp + self.xlsx
        self.path8 = self.path + '\\' + self.folder + '\\' + self.rfkrtim + self.yest + self.pend + self.xls
        self.sh_rerun = self.rfkrtim + self.yest + self.pend
        self.path9 = parser.get('pathconfig', 'path9').strip()
        self.path9 = self.path + '\\' + self.template + '\\' + self.path9 + self.folder + self.xlsx
        self.path10 = parser.get('pathconfig', 'path10').strip()
        self.path10 = self.path + '\\' + self.template + '\\' + self.path10
        self.path11 = parser.get('pathconfig', 'path11').strip()

        self.path12 = self.path + '\\' + self.folder + '\\' + self.path11 + self.folder + self.xlsx
        self.path11 = self.path + '\\' + self.template + '\\' + self.path11 + self.xlsx

        self.pcdatefm = parser.get('otherconfig', 'pcdatefm').strip()

        self.visible = parser.get('otherconfig', 'visible').strip()

        if self.pcdatefm == 'MM/DD/YYYY':
            self.pcstr = '%m/%d/%Y'
        elif self.pcdatefm == 'DD/MM/YYYY':
            self.pcstr = '%d/%m/%Y'
        elif self.pcdatefm == 'DD.MM.YYYY':
            self.pcstr = '%d.%m.%Y'
        elif self.pcdatefm == 'MM-DD-YYYY':
            self.pcstr = '%m-%d-%Y'
        elif self.pcdatefm == 'YYYY.MM.DD':
            self.pcstr = '%Y.%m.%d'
        elif self.pcdatefm == 'YYYY/MM/DD':
            self.pcstr = '%Y/%m/%d'
        elif self.pcdatefm == 'YYYY-MM-DD':
            self.pcstr = '%Y-%m-%d'

        ymd = parser.get('otherconfig', 'yyyymmdd').strip()
        pending = parser.get('otherconfig', 'pending').strip()
        timestamp = parser.get('otherconfig', 'timestamp').strip()
        currentmonth = parser.get('otherconfig', 'currentmonth').strip()

        self.read = parser.get('otherconfig', 'read').strip()
        self.user = parser.get('otherconfig', 'user').strip()
        self.passw = parser.get('otherconfig', 'pass').strip()
        self.window = parser.get('otherconfig', 'window').strip()
        self.sapexe = parser.get('pathconfig', 'sapexe').strip()
        self.downloadp = self.work_folder

        if ymd:
            a = list(map(str, ymd.split(";")))
            self.yyyymmdd.append(a)

        if pending:
            a = list(map(str, pending.split(";")))
            self.pending.append(a)

        if timestamp:
            a = list(map(str, timestamp.split(";")))
            self.timestamp.append(a)

        if currentmonth:
            a = list(map(str, currentmonth.split(";")))
            self.currentmonth.append(a)

        self.get_post_date()

    def get_foldername(self):
        """

        :return:
        """
        yesterday = self.today + dt.timedelta(-1)
        self.sh_manual = yesterday.strftime('%m%d')
        return yesterday.strftime('%Y%m%d')

    def get_yest(self):
        end = ''
        if self.start:
            start = dt.datetime.strptime(self.start, self.fmstr).strftime('%Y%m%d')
        if self.end:
            end = dt.datetime.strptime(self.end, self.fmstr).strftime('%Y%m%d')

        if end != '':
            return start + '-' + end
        else:
            return start

    def get_holiday(self):
        wb_input = xlrd.open_workbook(self.path5, encoding_override='utf-8')

        ws_input = wb_input.sheets()[0]
        row_num = ws_input.nrows
        key = ws_input.col_values(0)
        values = ws_input.col_values(1)
        for i in range(row_num):
            self.holiday_dict[key[i]] = values[i]
        self.holiday_dict.pop('Holiday')

    def get_post_date(self):
        """
        :
        """
        sunmmay = xlrd.open_workbook(self.path6)
        sunmmay_Date = sunmmay.sheet_by_name(u'Pending_final')
        detail_Date = sunmmay_Date.col_values(3)

        print(len(detail_Date))
        detail_Date.remove('Postg Date')
        while '' in detail_Date:
            detail_Date.remove('')
        detail_Date = list(set(detail_Date))
        detail_Date.sort()
        num = 0
        while num <= len(detail_Date) - 1:
            detail_Date[num] = self.Data_Name_Format(detail_Date[num])
            num = num + 1
        self.post_date = detail_Date

    def Data_Name_Format(self, data):
        if isinstance(data, float):
            DateObj = xlrd.xldate_as_datetime(data, 0)
            return DateObj.strftime(self.fmstr)
        else:
            return dt.datetime.strptime(data, self.inputfm).strftime(self.fmstr)

    def Date_start_end(self):
        if self.automatic == 'Y':
            # 如果是节假日
            # 这里判断的是字符串,所以如果节假日在list中,但是节假日以date的形式出现,会判断不准确
            if self.today.strftime(self.inputfm) in self.holiday_dict.keys():

                during = self.holiday_dict[self.today.strftime(self.inputfm)].split("-")
                print(during[0])
                self.start = self.Data_Name_Format(during[0])
                self.end = self.Data_Name_Format(during[1])
                print(self.start)
                print(self.end)
                print('yesterday is holiday')
            # 如果是周一
            elif self.today.strftime("%w") == '1':
                print(str(self.today + dt.timedelta(days=-3)))
                self.start = self.Data_Name_Format((self.today + dt.timedelta(days=-3)).strftime(self.inputfm))
                self.end = self.Data_Name_Format((self.today + dt.timedelta(days=-1)).strftime(self.inputfm))
                print(self.start)
                print(self.end)
                print('today is Monday')
            else:
                self.start = self.Data_Name_Format((self.today + dt.timedelta(days=-1)).strftime(self.inputfm))
                self.end = ''
                print('today is normal day')
                print(self.start)
        else:
            self.start = input('Please input start date:YYYY.MM.DD :')
            self.end = input('Please input end date:YYYY.MM.DD :')
            self.start = self.Data_Name_Format(self.start)
            self.end = self.Data_Name_Format(self.end)

            if self.start == self.end:
                self.end = ''

3. Sort handle code

import pandas as pd
from easyexcel import *
import datetime as dt
import win32timezone


def get_datelist(conf=None) -> list:
    """

    @param conf:
    @return: date list
    """
    start = None
    end = None
    days = 0
    day_list = []
    start = dt.datetime.strptime(conf.start, conf.fmstr)

    if conf.start != '':
        day_list.append(conf.start)

    if conf.end != '':
        end = dt.datetime.strptime(conf.end, conf.fmstr)
        days = (end - start).days
        for item in range(1, days):
            em = start + dt.timedelta(days=item)
            day_list.append(em.strftime(conf.fmstr))

        day_list.append(conf.end)
    return day_list


def pd_datefm(df, col=None, fm=''):
    try:
        df[col] = df[col].apply(lambda x: x.strftime(fm) if x != '' else '')
    except ValueError:
        pass
    return df


def pd_filter1(source, cond=None, conf=None) -> pd.DataFrame:
    """

    @param source: DataFrame data
    @param cond: posting date range
    @param strfm: date format
    @return:
    """
    if cond is None:
        cond = []

    cond = list(map(lambda x: dt.datetime.strptime(x, conf.fmstr).strftime(conf.pcstr), cond))
    lent = len(cond)

    df = source[source['Document Header Text'].isnull()]
    if lent == 1:
        df1 = df[df['Posting Date'] == cond[0]]
    else:
        df1 = df[(cond[0] <= df['Posting Date']) & (df['Posting Date'] <= cond[lent-1])]

    df1 = df1.dropna(axis=0, subset=['Fiscal Year'])

    return df1


def pd_write_toexcel(path='', sheet_name='', resource=None, from_cols=None, to_cols=None):
    """

    :param path: save path
    :param sheet_name:sheet name
    :param resource: resource data with type DataFrame
    :param from_cols:columns name of the source data ( list from_cols and to_cols must have the same length)
    :param to_cols: columns name of the target data ( list from_cols and to_cols must have the same length)
    :return:
    """

    if path == '':
        return

    all_sheet = pd.read_excel(path, sheet_name=None)
    keys = list(all_sheet.keys())
    assert isinstance(keys.index(sheet_name), int), 'sheet name' % sheet_name % 'does not exist'

    '''target file sheet list'''
    pro_sheet = all_sheet[sheet_name]

    '''header info'''
    head = resource.columns.values.tolist()

    '''delete the columns unused'''
    for item in head:
        try:
            from_cols.index(item)
        except ValueError:
            resource.drop(item, axis=1, inplace=True)

    listr = resource.values.tolist()
    pro_sheet.loc[0:len(listr), tuple(to_cols)] = listr
    writer = pd.ExcelWriter(path)

    for item in keys:
        if item != sheet_name:
            pd.DataFrame(all_sheet[item]).to_excel(writer, sheet_name=item, index=False)

    pd.DataFrame(pro_sheet).to_excel(writer, sheet_name=sheet_name, index=False)
    writer.save()
    return


def pd_write_excel(path='', source=None, sheet_name=''):
    all_sheet = pd.read_excel(path, sheet_name=None)
    keys = list(all_sheet.keys())
    writer = pd.ExcelWriter(path)

    for item in keys:
        pd.DataFrame(all_sheet[item]).to_excel(writer, sheet_name=item, index=False)

    pd.DataFrame(source).to_excel(writer, sheet_name=sheet_name, index=False)
    writer.save()
    return


def pd_sumData(file='', sheet_name='', header=''):
    """

    @param file:
    @param sheet_name:
    @param header:
    @return:
    """
    df = pd.read_excel(file, sheet_name=sheet_name)
    return df[header].sum()


def pd_getyes(yest=None):
    if yest is None or yest == '':
        yesterday = dt.date.today() + dt.timedelta(-1)
        return yesterday.strftime('%Y.%m.%d')
    else:
        return yest


def pd_getCelValue(file, sheet_name, header='', cond=None, col=None):
    cond = list(map(lambda x: dt.datetime.strptime(x, '%m/%d/%Y'), cond))

    df = pd.read_excel(file, sheet_name=sheet_name)
    if len(cond) == 1:
        df[df[header] == cond[0]]
    value = 0
    for item in cond:
        ind = df[df[header] == item].index
        assert df.iloc[ind, col].values[0], 'Can not get value of ' % item
        if df.iloc[ind, col].values[0] is not None:
            value = value + df.iloc[ind, col].values[0]
    return value


def pd_pivot(df_data=None, values=None, index=None):
    res = df_data.pivot_table(values=values, index=index, columns=None, aggfunc='sum', fill_value=None, dropna=True,
                              margins=False, margins_name='All')
    return res


def get_Holiday(file):
    dic = {}
    df = pd.read_excel(file, 'Sheet1')
    res = df.values.tolist()
    for item in res:
        dic[item[0]] = item[1]
    return dic


def pd_onetotwo(lst):
    b = []
    for item in lst:
        a = []
        if str(item) == 'nan':
            a.append('')
            b.append(a)
        else:
            a.append(item)
            b.append(a)
    return b


def pd_vlookup(taba, tabb, a_col, b_col, value_cols=None):
    """

    :param taba: source data
    :param tabb: condition data
    :param a_col: column of taba for 'ON'
    :param b_col: column of tabb for 'ON'
    :param value_cols:
    :return: data frame after vlook up
    """
    heada = taba.columns.values.tolist()
    headb = tabb.columns.values.tolist()

    try:
        heada.index(a_col)
    except ValueError:
        print('column' % a_col % 'do not exist!')
        return

    try:
        headb.index(b_col)
    except ValueError:
        print('column' % b_col % 'do not exist!')
        return

    for item in value_cols:
        try:
            heada.index(item)
        except ValueError:
            print('column' % item % 'do not exist!')
            return

    for item in heada:
        try:
            if item != a_col and not isinstance(value_cols.index(item), int):
                taba.drop(item, axis=1, inplace=True)
        except ValueError:
            taba.drop(item, axis=1, inplace=True)

    for item in headb:
        if item != b_col:
            tabb.drop(item, axis=1, inplace=True)

    lista = taba.values.tolist()
    listb = tabb.values.tolist()

    tabc = pd.DataFrame(lista, columns=value_cols)
    tabd = pd.DataFrame(listb, columns=[a_col])

    res = tabc.merge(tabd, on=a_col, how='right')
    return res


def pd_get_sheets(org_path='', sheet_name=None):
    return pd.read_excel(org_path, sheet_name)


def pd_get_rows(df, row_list=None):
    if row_list is None:
        row_list = []
    return df.loc[row_list]


def pd_get_header(df) -> list:
    """

    :param df: DataFrame
    :return: list of header info, first row info of excel sheet

    example :
    df = pd.read_excel('test.xlsx', sheet_name='sheet1')
    pd_get_header(df)
    """
    assert isinstance(df, pd.DataFrame), 'df is Not a DataFrame'
    return df.columns.values.tolist()


def pd_get_sortby(head: list, cond: list, con_tp=1) -> list:
    """

    :param head: header info list
    :param cond: condition list
    :param con_tp: condition type 1 sort by column name;2 sort by column index
    :return: sort by list

    example:
    head = ['Name','Age','Class','Gender']
    cond = ['A','B','C']
    con_tp = 1
    pd_get_sortby(head, cond, con_tp)
    """
    excel = EasyExcel(visible=False)
    col_dic = excel.getColDict()
    sort_list = []
    if con_tp == 1:
        for con in cond:
            sort_list.append(head[col_dic[con] - 1])
    elif con_tp == 2:
        for con in cond:
            sort_list.append(head[con - 1])
    elif con_tp == 3:
        sort_list = cond

    return sort_list


def pd_delete_data(df, cond_list=None, cond_type=0):
    """

    :param df: DataFrame
    :param cond_list: delete condition
    :param cond_type:
    0:delete by row index
    1:delete by column name['A','B','C']
    2:delete by column index
    3:delete by header (first row of sheet)
    :return:
    """

    if cond_list is None:
        cond_list = []
    if cond_type == 0:
        df.dorp(df.index[cond_list], inplace=True)
    elif cond_type == 1:
        header = pd_get_header(df)
        del_list = pd_get_sortby(header, cond_list, cond_type)
        df.dorp(del_list, axis=1, inplace=True)
    elif cond_type == 2:
        df.dorp(df.columns[cond_list], axis=1, inplace=True)
    elif cond_type == 3:
        df.dorp(cond_list, axis=1, inplace=True)
    return df


def pd_sort_data(org_path='', tag_path='', sheet_name='', ascending=False, cond_list=None, save=False, cond_type=1):
    """
     note: this function just Suitable for the sheet data with header info
     :param cond_type: 1 cond_list = columns name;2 cond_list = columns index;3 cond_list = header(first row info)
     :param cond_list:[A,B,C....] OR[1,2,3....],[header1,header2,....]
     :param ascending: Ascending or Descending
     :param save: if save Immediately
     :param org_path: original path of excel
     :param tag_path: target path of excel
     :param sheet_name: sheet to be process
     :return:target data after sort process

     example:
     pd_sort_data(org_path='test1.xlsx', sheet_name='S1', cond_list=['A', 'B'], cond_type=1, ascending=False, save=True)
     """

    if cond_list is None:
        cond_list = []
    if org_path:
        org_file = pd.read_excel(org_path, sheet_name=None)
    else:
        return
    tag_file: dict = {}
    for sh_name in org_file.keys():
        if sh_name == sheet_name:
            header = pd_get_header(org_file[sh_name])
            sort = pd_get_sortby(header, cond_list, cond_type)
            tag_file[sh_name] = org_file[sh_name].sort_values(by=sort, axis=0, ascending=ascending)
        else:
            tag_file[sh_name] = org_file[sh_name]
    if save:
        if not tag_path == '':
            writer = pd.ExcelWriter(tag_path)
        else:
            writer = pd.ExcelWriter(org_path)
        for sh in tag_file.keys():
            pd.DataFrame(tag_file[sh]).to_excel(writer, sheet_name=sh, index=False)
        writer.save()
    return tag_file


def write_to_reco(conf, dates, f, sum4=0):
    print('start write amount sheet->')
    f.write('start write amount sheet->' + '\n')
    try:
        cond = list(map(lambda x: dt.datetime.strptime(x, conf.fmstr), dates))
        lenth = len(cond)
        df = pd.read_excel(conf.path6, sheet_name=conf.sh_reco)
        if lenth == 1:
            df = df[df['GL by Day'] == cond[0]]
        else:
            df = df[(cond[0] <= df['GL by Day']) & (df['GL by Day'] <= cond[lenth-1])]
        df['GL by Day'] = df['GL by Day'].astype(str).apply(lambda x: dt.datetime.strptime(x, '%Y-%m-%d').strftime(conf.pcstr))
        df = df[['GL by Day', 'Unnamed: 7']]
        sum4 = df['Unnamed: 7'].sum()
        if df.empty:
            exl = EasyExcel(visible=conf.visible).open(filename=conf.path3)
            print('file open:', conf.path3)
            f.write('file open:' + conf.path3 + '\n')
            f.flush()
            try:
                recon = exl.with_color(sheet='Sheet1', col=16, row=2, date=True, pcstr=conf.pcstr)
                exl.close()
                print(conf.path3, ':Closed')
                f.write(conf.path3 + ':Closed' + '\n')
                f.flush()
                for item in cond:
                    k = item.strftime(conf.pcstr)
                    try:
                        recon[k]
                    except Exception as e:
                        str(e)
                        recon[k] = 0
                exl = EasyExcel(visible=conf.visible).open(conf.path6)
                print(conf.path6, ':Open')
                f.write(conf.path6 + ':Open' + '\n')
                f.flush()
                lstrow = exl.getLastRow(sheet=conf.sh_reco, col=7)
                ls_sort = sorted(recon)
                for item in ls_sort:
                    lstrow = lstrow + 1
                    exl.setCellValue(sheet=conf.sh_reco, row=lstrow, col=7, value=item)
                    exl.setCellValue(sheet=conf.sh_reco, row=lstrow, col=8, value=abs(recon[item]))
                    sum4 = sum4 + recon[item]
                exl.save()
                print(conf.path6, 'saved')
                f.write(conf.path6 + ':saved' + '\n')
                f.flush()
            except Exception as e:
                exl.close()
                str(e)
                print(str(e))
                f.write(str(e))
                f.flush()
                sum4 = 0
        return sum4
    except Exception as e:
        str(e)
        print(str(e))
        f.write(str(e))
        f.flush()
        return sum4

4. sap download

from datetime import datetime
import win32com.client
import subprocess
import win32con
import win32gui
import datetime
import time
import sys
import os


class KoreaDownLoad(object):
    def __init__(self, conf=None):
        self.date = ''
        self.year = ''
        self.start = conf.start
        self.end = conf.end
        self.session = None
        self.process = None
        self.conf = conf
        self.detail_Date = conf.post_date
        self.start_Date = conf.post_date[0]
        self.end_Date = conf.post_date[len(conf.post_date) - 1]
        self.start_Year = datetime.datetime.strptime(self.start_Date, conf.fmstr).strftime('%Y')
        self.end_Year = datetime.datetime.strptime(self.end_Date, conf.fmstr).strftime('%Y')

        # 处理月,获取到上上个月的最后一天
        last = datetime.date(conf.today.year, conf.today.month, 1) - datetime.timedelta(1)
        last = datetime.date(last.year, last.month, 1) - datetime.timedelta(1)

        self.result_last = last.strftime('%Y%m%d')
        self.copylist = []
        self.Get_copylist()
        self.first_Date = datetime.date(conf.today.year, conf.today.month - 1, 1).strftime(
            conf.fmstr)
        self.yesterday = (conf.today + datetime.timedelta(-1)).strftime(conf.fmstr)

    def Get_copylist(self):
        for i in self.detail_Date:
            em = datetime.datetime.strptime(i, self.conf.fmstr).strftime('%Y%m%d')
            if em <= self.result_last:
                self.copylist.append(i)
        return self.copylist

    def Date_Format(self, data):
        return datetime.datetime.strptime(data, self.conf.inputfm).strftime(self.conf.fmstr)

    def Refresh(self):
        self.date = ''
        self.year = ''
        self.start = ''
        self.end = ''
        self.session = None

    def OpenSap(self, user='', passw='', path='', window='SAP'):
        # 打开SAP

        self.process = subprocess.Popen(
            path,
            shell=True)
        while win32gui.FindWindow(None, window) == 0:
            time.sleep(0.5)
        else:
            sap_logon = win32gui.FindWindow(None, window)

        i_id = win32gui.FindWindowEx(sap_logon, 0, 'Edit', None)
        win32gui.SendMessage(i_id, win32con.WM_SETTEXT, None, user)

        i_password = win32gui.GetWindow(win32gui.FindWindowEx(sap_logon, 0, 'Edit', None), win32con.GW_HWNDNEXT)
        win32gui.SendMessage(i_password, win32con.WM_SETTEXT, None, passw)

        logon_button = win32gui.FindWindowEx(sap_logon, 0, 'Button', '&Log On')
        win32gui.SendMessage(sap_logon, win32con.WM_COMMAND, 1, logon_button)

        while win32gui.FindWindow(None, 'SAP Easy Access') == 0:
            time.sleep(0.5)
        else:
            sap_gui = win32com.client.GetObject('SAPGUI')
            application = sap_gui.GetScriptingEngine
            connection = application.Children(0)
            self.session = connection.Children(0)
        return self.session

    def CloseSap(self, session=None):
        if session is None:
            session = self.session

        session.findById("wnd[0]").close()
        session.findById("wnd[1]/usr/btnSPOP-OPTION1").press()
        os.system('taskkill /f /im saplogon.exe')
        self.Refresh()

    def Download_FBL3N(self):
        # 进入FBL3N,下载
        self.session.findById("/app/con[0]/ses[0]/wnd[0]/tbar[0]/okcd").text = "FBL3N"
        self.session.findById("/app/con[0]/ses[0]/wnd[0]").sendVKey(0)
        self.session.findById("wnd[0]/tbar[1]/btn[17]").press()
        self.session.findById("wnd[1]/usr/txtV-LOW").text = "KR OUTPUT"
        self.session.findById("wnd[1]/usr/txtENAME-LOW").text = ""
        self.session.findById("wnd[1]/usr/txtENAME-LOW").setFocus()
        self.session.findById("wnd[1]/usr/txtENAME-LOW").caretPosition = 0
        self.session.findById("wnd[1]/tbar[0]/btn[8]").press()

        self.session.findById("wnd[0]/usr/ctxtSO_BUDAT-LOW").text = self.start
        self.session.findById("wnd[0]/usr/ctxtSO_BUDAT-HIGH").text = self.end

        self.session.findById("wnd[0]/usr/ctxtSO_BUDAT-LOW").setFocus()
        self.session.findById("wnd[0]/usr/ctxtSO_BUDAT-LOW").caretPosition = 5
        self.session.findById("wnd[0]/tbar[1]/btn[8]").press()
        self.session.findById("wnd[0]/usr/lbl[139,5]").setFocus()
        self.session.findById("wnd[0]/usr/lbl[139,5]").caretPosition = 5
        self.session.findById("wnd[0]").sendVKey(2)
        self.session.findById("wnd[0]/tbar[1]/btn[25]").press()
        self.session.findById("wnd[0]/mbar/menu[0]/menu[3]/menu[1]").select()
        self.session.findById("wnd[1]/tbar[0]/btn[0]").press()
        # 此处为存放的路径,需要设置为变量
        self.session.findById("wnd[1]/usr/ctxtDY_PATH").text = self.conf.work_folder

        self.session.findById("wnd[1]/usr/ctxtDY_FILENAME").text = self.conf.recon + self.conf.yest + self.conf.xlsx
        self.session.findById("wnd[1]/usr/ctxtDY_FILENAME").caretPosition = 10
        self.session.findById("wnd[1]/tbar[0]/btn[0]").press()

        s = win32gui.FindWindow(None, self.conf.recon + self.conf.yest + self.conf.xlsx + " - Excel")
        while s == 0:
            time.sleep(0.5)
            s = win32gui.FindWindow(None, self.conf.recon + self.conf.yest + self.conf.xlsx + " - Excel")

        win32gui.PostMessage(s, win32con.WM_CLOSE, 0, 0)

    def Download_S_ALR_87012357(self, f):
        time.sleep(1)
        self.session.findById("wnd[0]/tbar[0]/okcd").text = "/nS_ALR_87012357"
        self.session.findById("wnd[0]").sendVKey(0)
        self.session.findById("wnd[0]/tbar[1]/btn[17]").press()
        self.session.findById("wnd[1]/usr/txtV-LOW").text = "KR OUTPUT"
        self.session.findById("wnd[1]/usr/txtENAME-LOW").text = ""
        self.session.findById("wnd[1]/usr/txtENAME-LOW").setFocus()
        self.session.findById("wnd[1]/usr/txtENAME-LOW").caretPosition = 0
        self.session.findById("wnd[1]/tbar[0]/btn[8]").press()
        # self.session.findById("wnd[0]/usr/txtBR_GJAHR-LOW").text = self.start_Year
        # self.session.findById("wnd[0]/usr/txtBR_GJAHR-HIGH").text = self.end_Year
        self.session.findById("wnd[0]/usr/txtBR_GJAHR-HIGH").setFocus()
        self.session.findById("wnd[0]/usr/txtBR_GJAHR-HIGH").caretPosition = 4
        self.session.findById("wnd[0]/usr/btn%_BR_BUDAT_%_APP_%-VALU_PUSH").press()
        self.session.findById("wnd[1]/tbar[0]/btn[16]").press()
        # 此处需要一个循环,输入所有小于上上个月最后一天的日期
        f.write('posting date as follow:' + '\n')
        for i in range(0, len(self.copylist)):
            print(self.copylist[i])
            f.write(self.copylist[i] + '\n')
            self.session.findById("wnd[1]/tbar[0]/btn[13]").press()
            self.session.findById(
                "wnd[1]/usr/tabsTAB_STRIP/tabpSIVA/ssubSCREEN_HEADER:SAPLALDB:3010/tblSAPLALDBSINGLE/ctxtRSCSEL_255-SLOW_I[1,0]").text = \
                self.copylist[i]
            self.session.findById(
                "wnd[1]/usr/tabsTAB_STRIP/tabpSIVA/ssubSCREEN_HEADER:SAPLALDB:3010/tblSAPLALDBSINGLE/ctxtRSCSEL_255-SLOW_I[1,0]").caretPosition = 10

        self.session.findById("wnd[1]/usr/tabsTAB_STRIP/tabpINTL").select()
        self.session.findById(
            "wnd[1]/usr/tabsTAB_STRIP/tabpINTL/ssubSCREEN_HEADER:SAPLALDB:3020/tblSAPLALDBINTERVAL/ctxtRSCSEL_255-ILOW_I[1,0]").text = self.first_Date
        self.session.findById(
            "wnd[1]/usr/tabsTAB_STRIP/tabpINTL/ssubSCREEN_HEADER:SAPLALDB:3020/tblSAPLALDBINTERVAL/ctxtRSCSEL_255-IHIGH_I[2,0]").text = self.yesterday
        self.session.findById(
            "wnd[1]/usr/tabsTAB_STRIP/tabpINTL/ssubSCREEN_HEADER:SAPLALDB:3020/tblSAPLALDBINTERVAL/ctxtRSCSEL_255-IHIGH_I[2,0]").setFocus()
        self.session.findById(
            "wnd[1]/usr/tabsTAB_STRIP/tabpINTL/ssubSCREEN_HEADER:SAPLALDB:3020/tblSAPLALDBINTERVAL/ctxtRSCSEL_255-IHIGH_I[2,0]").caretPosition = 6
        self.session.findById("wnd[1]/tbar[0]/btn[8]").press()
        self.session.findById("wnd[0]/tbar[1]/btn[8]").press()
        self.session.findById("wnd[0]/tbar[1]/btn[43]").press()
        self.session.findById("wnd[1]/tbar[0]/btn[0]").press()
        self.session.findById("wnd[1]/usr/ctxtDY_PATH").text = self.conf.work_folder
        self.session.findById("wnd[1]/usr/ctxtDY_FILENAME").text = self.conf.customer + self.conf.yest + self.conf.xlsx
        self.session.findById("wnd[1]/usr/ctxtDY_FILENAME").caretPosition = 17
        self.session.findById("wnd[1]/tbar[0]/btn[0]").press()
        self.session.findById("wnd[0]/tbar[0]/btn[12]").press()

        s = win32gui.FindWindow(None, self.conf.customer + self.conf.yest + self.conf.xlsx + " - Excel")
        while s == 0:
            time.sleep(0.5)
            s = win32gui.FindWindow(None, self.conf.customer + self.conf.yest + self.conf.xlsx + " - Excel")

        win32gui.PostMessage(s, win32con.WM_CLOSE, 0, 0)

    def Download_RFKRTIM(self):
        self.session.findById("wnd[0]/tbar[0]/okcd").text = "/nRFKRTIM"
        self.session.findById("wnd[0]").sendVKey(0)
        time.sleep(3)
        if self.session.findById("/app/con[0]/ses[0]/wnd[0]/titl").text == "Time-Stamp Tax Invoices South Korea)":
            self.session.findById("wnd[0]/tbar[1]/btn[17]").press()
            self.session.findById("wnd[1]/usr/cntlALV_CONTAINER_1/shellcont/shell").currentCellRow = 1
        else:
            time.sleep(5)
            self.session.findById("wnd[0]/tbar[1]/btn[17]").press()
            self.session.findById("wnd[1]/usr/cntlALV_CONTAINER_1/shellcont/shell").currentCellRow = 1
        self.session.findById("wnd[1]/usr/cntlALV_CONTAINER_1/shellcont/shell").selectedRows = "1"
        self.session.findById("wnd[1]/usr/cntlALV_CONTAINER_1/shellcont/shell").doubleClickCurrentCell()

        self.session.findById("wnd[0]/usr/ctxtBR_BUDAT-LOW").text = self.conf.start
        self.session.findById("wnd[0]/usr/ctxtBR_BUDAT-HIGH").text = self.conf.end
        last_day = datetime.date(datetime.date.today().year, 12, 31).strftime(self.conf.fmstr)

        print(last_day)

        self.session.findById("wnd[0]/usr/ctxtS_BLDAT-HIGH").text = last_day
        self.session.findById("wnd[0]/usr/txtBR_GJAHR-HIGH").setFocus()
        self.session.findById("wnd[0]/usr/txtBR_GJAHR-HIGH").caretPosition = 4
        self.session.findById("wnd[0]/tbar[1]/btn[8]").press()
        self.session.findById("wnd[0]/mbar/menu[3]/menu[5]/menu[2]/menu[1]").select()
        self.session.findById(
            "wnd[1]/usr/subSUBSCREEN_STEPLOOP:SAPLSPO5:0150/sub:SAPLSPO5:0150/radSPOPLI-SELFLAG[1,0]").select()
        self.session.findById(
            "wnd[1]/usr/subSUBSCREEN_STEPLOOP:SAPLSPO5:0150/sub:SAPLSPO5:0150/radSPOPLI-SELFLAG[1,0]").setFocus()
        self.session.findById("wnd[1]/tbar[0]/btn[0]").press()
        self.session.findById("wnd[1]/usr/ctxtDY_PATH").text = self.conf.work_folder
        self.session.findById("wnd[1]/usr/ctxtDY_FILENAME").text = self.conf.rfkrtim + self.conf.yest + ".xls"
        self.session.findById("wnd[1]/usr/ctxtDY_FILENAME").caretPosition = 14
        self.session.findById("wnd[1]/tbar[0]/btn[0]").press()

    def Download(self, session=None, path='', datelist=None):
        if session is None:
            session = self.session

        session.findById("wnd[0]/tbar[0]/okcd").text = "/nRFKRTIM"
        session.findById("wnd[0]").sendVKey(0)
        time.sleep(3)
        if session.findById("/app/con[0]/ses[0]/wnd[0]/titl").text == "Time-Stamp Tax Invoices South Korea)":
            session.findById("wnd[0]/tbar[1]/btn[17]").press()
            session.findById("wnd[1]/usr/cntlALV_CONTAINER_1/shellcont/shell").currentCellRow = 1
        else:
            time.sleep(5)
            session.findById("wnd[0]/tbar[1]/btn[17]").press()
            session.findById("wnd[1]/usr/cntlALV_CONTAINER_1/shellcont/shell").currentCellRow = 1
        session.findById("wnd[1]/usr/cntlALV_CONTAINER_1/shellcont/shell").selectedRows = "1"
        session.findById("wnd[1]/usr/cntlALV_CONTAINER_1/shellcont/shell").doubleClickCurrentCell()
        session.findById("wnd[0]/usr/btn%_BR_BUDAT_%_APP_%-VALU_PUSH").press()
        session.findById(
            "wnd[1]/usr/tabsTAB_STRIP/tabpSIVA/ssubSCREEN_HEADER:SAPLALDB:3010/tblSAPLALDBSINGLE/ctxtRSCSEL_255-SLOW_I[1,0]").text = ''

        for item in datelist:
            session.findById("wnd[1]/tbar[0]/btn[13]").press()
            session.findById(
                "wnd[1]/usr/tabsTAB_STRIP/tabpSIVA/ssubSCREEN_HEADER:SAPLALDB:3010/tblSAPLALDBSINGLE/ctxtRSCSEL_255-SLOW_I[1,0]").text = item
            session.findById(
                "wnd[1]/usr/tabsTAB_STRIP/tabpSIVA/ssubSCREEN_HEADER:SAPLALDB:3010/tblSAPLALDBSINGLE/ctxtRSCSEL_255-SLOW_I[1,0]").caretPosition = 10
        session.findById("wnd[1]/tbar[0]/btn[8]").press()
        session.findById("wnd[0]/usr/txtBR_GJAHR-HIGH").setFocus()
        session.findById("wnd[0]/usr/txtBR_GJAHR-HIGH").caretPosition = 4
        session.findById("wnd[0]/tbar[1]/btn[8]").press()
        session.findById("wnd[0]/mbar/menu[3]/menu[5]/menu[2]/menu[1]").select()
        session.findById(
            "wnd[1]/usr/subSUBSCREEN_STEPLOOP:SAPLSPO5:0150/sub:SAPLSPO5:0150/radSPOPLI-SELFLAG[1,0]").select()
        session.findById(
            "wnd[1]/usr/subSUBSCREEN_STEPLOOP:SAPLSPO5:0150/sub:SAPLSPO5:0150/radSPOPLI-SELFLAG[1,0]").setFocus()
        session.findById("wnd[1]/tbar[0]/btn[0]").press()

        '''"C:\\Users\\cheny140\\OneDrive - Medtronic PLC\\Desktop\\Project\\Korea eTax"'''
        session.findById(
            "wnd[1]/usr/ctxtDY_PATH").text = path

        session.findById("wnd[1]/usr/ctxtDY_FILENAME").text = "RFKRTIM" + self.conf.yest + 'pending' + ".xls"
        session.findById("wnd[1]/usr/ctxtDY_FILENAME").caretPosition = 14
        session.findById("wnd[1]/tbar[0]/btn[0]").press()
        print('Download success!')

 

posted on 2021-09-02 14:45  姬如千泷  阅读(270)  评论(0编辑  收藏  举报