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