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!')

Python Excel 操作的更多相关文章

  1. python excel操作总结

    1.openpyxl包的导入 Dos命令行输入 pip install openpyxl==2.3.3 这里注意一下openpyxl包的版本问题 版本装的太高有很多api不支持了,所以笔者这里用的是2 ...

  2. Python+Excel 操作对比

    前言 从网页爬下来的大量数据需要excel清洗成堆的科学实验数据需要导入excel进行分析作为一名面向逼格的Python程序员该如何合理而又优雅的选择生产力工具呢? 得益于辛勤劳作的python大神们 ...

  3. python excel操作

    python操作excel表格(xlrd/xlwt)转载:http://www.cnblogs.com/zhoujie/p/python18.html   最近遇到一个情景,就是定期生成并发送服务器使 ...

  4. python excel操作 练习-#操作单列 #操作A到C列 #操作1到3行 #指定一个范围遍历所有行和列 #获取所有行 #获取所有列

    ##操作单列#操作A到C列#操作1到3行#指定一个范围遍历所有行和列#获取所有行#获取所有列 #coding=utf-8 from openpyxl import Workbook wb=Workbo ...

  5. Python Excel操作库

    xlrd:支持.xls..xlsx读 xlwt:只支持.xls写 xlutils:只支持.xls读写 依赖于xlrd和xlwt xlwings:支持.xls读,.xlsx读写 可以实现Excel和Py ...

  6. python excel操作 练习:#生成一个excel文件,生成3个sheet,每个sheet的a1写一下sheet的名称。每个sheet有个底色

    练习:#生成一个excel文件,生成3个sheet,每个sheet的a1写一下sheet的名称.每个sheet有个底色 #coding=utf-8 from openpyxl import Workb ...

  7. Python Excel操作——xlrd、xlwd

    读取 1.导入模块 import xlrd 2.打开Excel文件读取数据 data = xlrd.open_workbook('excel.xls') 3.获取一个工作表 1 table = dat ...

  8. 【Python】 更棒的Excel操作模块xlwings

    [xlwings] 说到Python操作Excel,有好多模块都可以支持这个工作.比如最底层的win32模块不仅可以操作Excel,还可以操作其他一众windows的软件. 其他的比较熟悉的有xlrd ...

  9. python 对excel操作用法详解

    在python中,对excel表格读,写,追加数据,用以下三个模块: 1.wlrd 读取excel表中的数据 2.xlwt 创建一个全新的excel文件,然后对这个文件进行写入内容以及保存. 3.xl ...

随机推荐

  1. 百兆以太网(100BASE-TX)的波形和眼图

    沾了公司的光用了那台采样率吓死人的示波器看了下百兆以太网的三电平波形和眼图. 之前我也强调过百兆的三电平是不能从1状态越过0状态跳到-1状态的,从眼图上能明显看出来. 可以看出这个信号还是不错的.甚至 ...

  2. Machine Learning 学习笔记 03 最小二乘法、极大似然法、交叉熵

    损失函数. 最小二乘法. 极大似然估计. 复习一下对数. 交叉熵. 信息量. 系统熵的定义. KL散度

  3. Markdown练习

    这是一级标题 这是二级标题 这是三级标题 这是无序列表1 这是无序列表2 有序1 有序2 重点 计网 1. 第一章 第一部分 1.概念.组成.功能和分类 1. 概念 计算机网络是互连的.自治的计算机的 ...

  4. 基于Kubernetes构建企业Jenkins master/slave CI/CD平台

    搭建平台目的: k8s中搭建jenkins master/slave架构,解决单jenkins执行效率低,资源不足等问题(jenkins master 调度任务到 slave上,并发执行任务,提升任务 ...

  5. 2021.07.19 P2624 明明的烦恼(prufer序列,为什么杨辉三角我没搞出来?)

    2021.07.19 P2624 明明的烦恼(prufer序列,为什么杨辉三角我没搞出来?) [P2624 HNOI2008]明明的烦恼 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn ...

  6. 使用 bitnami/postgresql-repmgr 镜像快速设置 PostgreSQL HA

    什么是 PostgreSQL HA? 此 PostgreSQL 集群解决方案包括 PostgreSQL 复制管理器(replication manager),这是一种用于管理 PostgreSQL 集 ...

  7. XCTF练习题---MISC---Recover-Deleted-File

    XCTF练习题---MISC---Recover-Deleted-File flag:de6838252f95d3b9e803b28df33b4baa 解题步骤: 1.观察题目,下载附件 2. 根据题 ...

  8. 【Java分享客栈】SpringBoot线程池参数搜一堆资料还是不会配,我花一天测试换你此生明白。

    一.前言   首先说一句,如果比较忙顺路点进来的,可以先收藏,有时间或用到了再看也行:   我相信很多人会有一个困惑,这个困惑和我之前一样,就是线程池这个玩意儿,感觉很高大上,用起来很fashion, ...

  9. 数据交换格式 JSON

    1. 什么是 JSON 概念 : JSON 的英文全称是 JavaScript ObjEct Notation, 即 "JavaScript 对象表示法" . 简单来讲 : JSO ...

  10. 神器 Nginx 的学习手册 ( 建议收藏 )

    关注「开源Linux」,选择"设为星标" 回复「学习」,有我为您特别筛选的学习资料~ Nginx 是一个高性能的 HTTP 和反向代理服务器,特点是占用内存少,并发能力强,事实上 ...