python_apps/work/build_template.py
2023-11-03 14:49:12 +09:00

160 lines
4.7 KiB
Python

import pymysql
from sqlalchemy import create_engine
import pandas as pd
import openpyxl
import subprocess
import random
from datetime import datetime
import os, logging, sys, time
class autoDBreq:
def __init__(self, dbuser, dbpass, dbname, sql, order_doc_no):
self.startTime = datetime.now()
self.dbhost = '127.0.0.1'
self.dbport = 3306
self.dbuser = dbuser
self.dbpass = dbpass
self.dbname = dbname
self.charset = 'utf-8'
self.sql = sql
self.df = self.dbfetch()
self.filepath = './'
self.filename = self.makefilename()
self.protectedFilename = self.protectedFilename()
self.affectedRow = self.affectedRow()
self.order_doc_no = order_doc_no
self.password = self.makepass()
self.vbaBinLoc = './'
self.checkProtection = self.checkProtection()
def __del__(self):
print(self.makelogdata('anything_sample','anything_sample.name,anything_sample.birth'))
if self.checkProtection == "True":
cmd = 'rm -rf ' + self.filepath + self.filename
delsrc = subprocess.Popen(cmd,stdout=subprocess.PIPE,shell=True)
delsrc.wait()
def timelog(self):
consumtime = datetime.now() - self.startTime
return consumtime
def checkProtection(self):
if self.order_doc_no != '':
res = 'True'
else:
res = 'False'
return res
def dbfetch(self):
try:
con_str_fmt = 'mysql+mysqldb://{0}:{1}@{2}:{3}/{4}?charset={5}'
con_str = con_str_fmt.format(self.dbuser, self.dbpass, self.dbhost, self.dbport, self.dbname, 'utf8')
pymysql.install_as_MySQLdb()
import MySQLdb
engine = create_engine(con_str, encoding=self.charset)
conn = engine.connect()
df = pd.read_sql(self.sql, con=conn)
conn.close()
except:
df = pd.DataFrame()
return df
def cookXls(self):
if self.affectedRow != 0:
writer = pd.ExcelWriter(self.filepath + self.filename, engine='xlsxwriter')
self.df.to_excel(writer, '쿼리결과', index=False)
if self.checkProtection == "True":
self.insertVba(writer)
self.encryptXls()
else:
writer.save()
else:
pass
def affectedRow(self):
row_count = 0
for col in self.df.index:
row_count += 1
return row_count
def makelogdata(self,tablename,columnname):
if self.checkProtection == 'True':
password = self.password
else:
password = ''
if self.affectedRow != 0:
if self.checkProtection == 'True':
excelfile = self.protectedFilename
else:
excelfile = self.filename
status = 'SUCCESS'
else:
excelfile = ''
status = 'SQL ERROR: No Result'
res = {
'dbname':self.dbname,
'tablename': tablename,
'fieldname': columnname,
'row_count': self.affectedRow,
'execute_time': self.timelog(),
'order_doc_no': self.order_doc_no,
'excelfile': excelfile,
'password': password,
'status': status
}
return res
def encryptXls(self):
try:
encrypted = self.protectedFilename + '.encrypted.xlsx'
cmd = 'secure-spreadsheet --password ' + str(self.password) + ' --input-format xlsx < ' + self.filepath + self.protectedFilename + ' > ' + self.filepath + encrypted
encrypt_execute = subprocess.Popen(cmd,stdout=subprocess.PIPE,shell=True)
encrypt_execute.wait()
cmdmv = 'mv -f ' + self.filepath + encrypted + ' ' + self.filepath + self.protectedFilename
clean_xls = subprocess.Popen(cmdmv,stdout=subprocess.PIPE,shell=True)
clean_xls.wait()
res = 'Encryption Success'
except:
res = str(encrypt_execute)
def makepass(self):
num = random.randrange(1000,9999)
return num
def makefilename(self):
fn = str(random.randrange(10000,99999)) + '_' + str(self.startTime.strftime("%Y%m%d%H%M%S")) + '.xlsx'
return fn
def protectedFilename(self):
fn = self.filename.split('.')[-2] + '.xlsm'
return fn
def insertVba(self,writer):
vbaLoc = self.vbaBinLoc + 'vbaProject.bin'
workbook = writer.book
workbook.filename = self.filepath + self.protectedFilename
workbook.add_vba_project(vbaLoc)
writer.save()
###########################################################################################################
join_dt = sys.argv[1]
join_todt = sys.argv[2]
sql = 'SELECT name AS 이름, birth AS 생년월일, join_dt AS 가입일시 FROM anything_sample WHERE join_dt >= "' + join_dt + '" AND join_dt <= "' + join_todt + '"'
print(sql)
datafetch = autoDBreq('maddiekorea','mad(#lin','test', sql, 'JG_20220322_0003')
#datafetch = autoDBreq('maddiekorea','mad(#lin','test', sql, '')
datafetch.cookXls()
################################################################################################################
# https://github.com/ankane/secure-spreadsheet
# node.js 애플리케이션 설치 후 사용 (엑셀 패스워드 관련)
# pip3 install xlsxWriter # vba관련 .... vba_extract.py 추출 https://pbpython.com/advanced-excel-workbooks.html