-
-
Save gdemir/5fb050822ae919ad6674 to your computer and use it in GitHub Desktop.
| # README | |
| source : https://bobbyhadz.com/blog/choco-is-not-recognized-as-internal-or-external-command | |
| # run powershell | |
| [BAŞLAT + R] | |
| Powershell yönetici olarak çalıştır | |
| # choco installer install | |
| Set-ExecutionPolicy Bypass -Scope Process -Force; [System.Net.ServicePointManager]::SecurityProtocol = [System.Net.ServicePointManager]::SecurityProtocol -bor 3072; iex ((New-Object System.Net.WebClient).DownloadString('https://community.chocolatey.org/install.ps1')) | |
| # curl install | |
| choco install curl -y | |
| # pip install | |
| curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py | |
| cd C:\Users\gokhan.demir2\AppData\Local\Programs\Python\Python310\ | |
| python.exe get-pip.py | |
| # autopytoexe.exe install | |
| cd C:\Users\gokhan.demir2\AppData\Local\Programs\Python\Python310\Scripts | |
| pip.exe install auto-py-to-exe | |
| # autopytoexe.exe run | |
| cd C:\Users\gokhan.demir2\AppData\Local\Programs\Python\Python310\ | |
| python.exe C:\Users\gokhan.demir2\AppData\Local\Programs\Python\Python310\Scripts\autopytoexe.exe | |
| python.exe -m C:\Users\gokhan.demir2\AppData\Local\Programs\Python\Python310\Scripts\autopytoexe.exe | |
| cd C:\Users\gokhan.demir2\AppData\Local\Programs\Python\Python310\output\yazici_bul.exe | |
| # run auto-py-to-exe.exe | |
| C:\Users\gokhan.demir2\AppData\Local\Programs\Python\Python310>python.exe Scripts\auto-py-to-exe.exe | |
| C:\Users\gokhan.demir2\AppData\Local\Programs\Python\Python310>python.exe -m Scripts\auto-py-to-exe.exe |
| #!/usr/bin/env python | |
| # -*- coding: utf-8 -*- | |
| from openpyxl import load_workbook, Workbook | |
| from openpyxl.styles import Alignment, Border, Font, Side, Style, PatternFill, Color | |
| from openpyxl.cell import get_column_letter | |
| import datetime | |
| import os, pipes | |
| PDF_DIR = "pdf" | |
| EXCEL_DIR = "excel" | |
| if not os.path.isdir(os.path.join(os.getcwd(), EXCEL_DIR)): | |
| os.mkdir(os.path.join(os.getcwd(), EXCEL_DIR)) | |
| if not os.path.isdir(os.path.join(os.getcwd(), PDF_DIR)): | |
| os.mkdir(os.path.join(os.getcwd(), PDF_DIR)) | |
| # OKUMA ########################################################################################## | |
| def excel_to_hash(xlsx_filename): | |
| departments = [] | |
| # example departments | |
| # departments = [{ | |
| # "name" : "Bilgi İşlem", | |
| # "users" : [{ | |
| # "first_name" : "Gökhan", | |
| # "last_name" : "Demir", | |
| # "days" : [{ "date" : "2015-01-01", "i": "08:08:00", "o" : "08:08:08" }] | |
| # }] | |
| # }] | |
| wb = load_workbook(filename=xlsx_filename, read_only=True) | |
| ws = wb.active | |
| user_state = False | |
| department = "" | |
| for row in ws.rows: | |
| if user_state == False: | |
| if row[3].value is not None: # Bölüm ismini belirle yoksa ekle | |
| if "Bölüm" in row[3].value.encode(encoding = 'UTF-8', errors = 'strict').split(): | |
| department_name = row[3].value[8:].encode(encoding = 'UTF-8', errors = 'strict') | |
| department_search_state = False # Önceki kayıtlarda böyle bir bölüm kaydı var mı ? | |
| if departments != []: | |
| for department in departments: | |
| if department["name"] == department_name: | |
| department_search_state = True | |
| break | |
| if not department_search_state: | |
| departments.append({ "name" : department_name }) | |
| continue | |
| if row[1].value == "Ad": # Ad ise kişi bilgisi başladı | |
| user_state = True | |
| continue | |
| if user_state == True: | |
| if row[9].value is not None: # string ise ve Toplam Süre ise kişi bilgisi bitti | |
| if row[9].value.encode(encoding = 'UTF-8', errors = 'strict') == "Toplam Süre": | |
| user_state = False | |
| continue | |
| if row[1].value is not None and row[1].value != "Ad": | |
| for department in departments: | |
| if department["name"] == department_name: | |
| if "users" in department.keys(): # Bölüm'de hiç kullanıcı var mı ? | |
| user_search_state = False | |
| for user in department["users"]: | |
| if user["first_name"] == row[1].value and user["last_name"] == row[4].value: | |
| user_search_state = True | |
| user["days"].append({ "date" : row[5].value, "i" : row[7].value, "o" : row[8].value }) | |
| break | |
| if not user_search_state: | |
| department["users"].append({ | |
| "first_name" : row[1].value, | |
| "last_name" : row[4].value, | |
| "days" : [{ "date" : row[5].value, "i": row[7].value, "o" : row[8].value }] | |
| }) | |
| else: | |
| department["users"] = [{ | |
| "first_name" : row[1].value, | |
| "last_name" : row[4].value, | |
| "days" : [{ "date" : row[5].value, "i": row[7].value, "o" : row[8].value }] | |
| }] | |
| break | |
| return departments | |
| # YAZMA ########################################################################################## | |
| def hash_to_excel_departments_io(departments): | |
| print ">>> EXCEL Yazma işlemleri başlıyor" | |
| # general text styles | |
| text_border = Border(left = Side(style = 'thin'), right = Side(style = 'thin'), top = Side(style = 'thin'), bottom = Side(style = 'thin')) | |
| text_aligment = Alignment(horizontal = 'center', vertical = 'center') | |
| # comment colors and background colors | |
| comment_colors = { | |
| "danger" : { | |
| "bgcolor" : PatternFill(patternType = 'solid', fgColor = Color('dca7a7')), | |
| "textcolor" : Font(name = 'Calibri', size = 11, bold = True, color = 'a94442') | |
| }, | |
| "warning" : { | |
| "bgcolor" : PatternFill(patternType = 'solid', fgColor = Color('fcf8e3')), | |
| "textcolor" : Font(name = 'Calibri', size = 11, bold = True, color = '8a6d3b') | |
| }, | |
| "success" : { | |
| "bgcolor" : PatternFill(patternType = 'solid', fgColor = Color('ffffff')), | |
| "textcolor" : Font(name = 'Calibri', size = 11, bold = True, color = '000000') | |
| } | |
| } | |
| # header | |
| _header = ["Ad", "Soyad", "Tarih", "Giriş Saati", "Giriş Durumu", "Çıkış Saati", "Çıkış Durumu", "İzin Durum"] | |
| column_count = len(_header) | |
| # column and row width | |
| COLUMN_WIDTHS = [ 22, 20, 11, 9, 16, 9, 16, 10 ] | |
| ROW_WIDTH = 16.2 # 14 x 16.2 = 226.8 page height | |
| # excel filenames for pdf | |
| excel_filenames = [] | |
| for department in departments: | |
| wb = Workbook() | |
| ws = wb.active | |
| # title | |
| ws.merge_cells(start_row = 1, start_column = 1, end_row = 4, end_column = column_count) | |
| title = ws['A1'] | |
| title.value = department["name"] | |
| title.font = Font(name = 'Calibri', size = 14, bold = True, color = 'ffffff') | |
| title.alignment = text_aligment | |
| title.fill = PatternFill(patternType = 'solid', fgColor = Color('0099ff')) | |
| # header font and styles | |
| for col in range(1, column_count + 1): | |
| ws.cell(row = 5, column = col).value = _header[col - 1] | |
| ws.cell(row = 5, column = col).font = Font(name = 'Calibri', size = 8, bold = True, color = 'ffffff') | |
| ws.cell(row = 5, column = col).border = text_border | |
| ws.cell(row = 5, column = col).alignment = text_aligment | |
| ws.cell(row = 5, column = col).fill = PatternFill(patternType = 'solid', fgColor = Color('3072b3')) | |
| row = 6 | |
| department_users = department["users"] | |
| # department_users = sorted(department["users"], key = lambda k: k['first_name']) # sort hash list | |
| for user in department_users: | |
| first_row = row | |
| for day in user["days"]: | |
| if day["i"] is not None: | |
| i_time = day["i"].strftime("%H:%M") | |
| i_hour = int(day["i"].strftime("%H")) | |
| i_minute = int(day["i"].strftime("%M")) | |
| if (i_hour < 7) or (i_hour == 7 and i_minute <= 45): | |
| # i_color_key = "warning" | |
| # i_comment = "Erken Geldi" | |
| i_color_key = "success" | |
| i_comment = "" | |
| elif (i_hour > 8) or (i_hour == 8 and i_minute >= 15): | |
| i_color_key = "warning" | |
| i_comment = "Geç Geldi" | |
| else: | |
| i_color_key = "success" | |
| i_comment = "" # Sorun yok | |
| else: | |
| i_time = "" | |
| i_color_key = "danger" | |
| i_comment = "Kart Kullanmadı" | |
| if day["o"] is not None: | |
| o_time = day["o"].strftime("%H:%M") | |
| o_hour = int(day["o"].strftime("%H")) | |
| o_minute = int(day["o"].strftime("%M")) | |
| if (o_hour < 16) or (o_hour == 16 and o_minute <= 59): | |
| o_color_key = "warning" | |
| o_comment = "Erken Çıktı" | |
| elif (o_hour > 17) or (o_hour == 17 and o_minute >= 15): | |
| # o_color_key = "warning" | |
| # o_comment = "Geç Çıktı" | |
| o_color_key = "success" | |
| o_comment = "" | |
| else: | |
| o_color_key = "success" | |
| o_comment = "" # Sorun yok | |
| else: | |
| o_time = "" | |
| o_color_key = "danger" | |
| o_comment = "Kart Kullanmadı" | |
| ws.append([user["first_name"], user["last_name"], day["date"].strftime("%d-%m-%Y"), i_time, i_comment, o_time, o_comment, ""]) | |
| # color set for comments | |
| i_color = comment_colors[i_color_key] | |
| ws.cell(row = row, column = 5).fill = i_color["bgcolor"] | |
| ws.cell(row = row, column = 5).font = i_color["textcolor"] | |
| o_color = comment_colors[o_color_key] | |
| ws.cell(row = row, column = 7).fill = o_color["bgcolor"] | |
| ws.cell(row = row, column = 7).font = o_color["textcolor"] | |
| for col in range(1, column_count + 1): | |
| ws.cell(row = row, column = col).border = text_border | |
| ws.cell(row = row, column = col).alignment = text_aligment | |
| row = row + 1 | |
| # ad soyad | row : merge and center | |
| ws.merge_cells(start_row = first_row, end_row = row - 1, start_column = 1, end_column = 1) | |
| ws.merge_cells(start_row = first_row, end_row = row - 1, start_column = 2, end_column = 2) | |
| # EXCEL column with | |
| for col, width in enumerate(COLUMN_WIDTHS): | |
| ws.column_dimensions[get_column_letter(col + 1)].width = width | |
| # EXCEL row height | |
| for row in range(1, len(ws.rows)): | |
| ws.row_dimensions[row].height = ROW_WIDTH | |
| # PRINT auto only page | |
| # ws.page_setup.orientation = ws.ORIENTATION_PORTRAIT | |
| ws.page_setup.paperSize = ws.PAPERSIZE_A4 | |
| ws.page_setup.fitToPage = True | |
| ws.page_setup.fitToHeight = 0 | |
| ws.page_setup.fitToWidth = 1 | |
| ws.page_setup.horizontalCentered = True | |
| ws.page_setup.verticalCentered = True | |
| filename = os.path.join(os.getcwd(), EXCEL_DIR, department["name"] + ".xlsx") | |
| print "-" + filename | |
| wb.save(filename = filename) | |
| excel_filenames.append(filename) | |
| return excel_filenames | |
| def excel_to_pdf(excel_filenames): | |
| print ">>> PDF yazma işlemleri başlıyor" | |
| os.chdir(PDF_DIR) | |
| for excel_filename in excel_filenames: | |
| filename = pipes.quote(excel_filename) | |
| os.system("libreoffice -headless -convert-to pdf " + filename) | |
| # os.system("soffice --headless --convert-to pdf:\"impress_pdf_Export\"" + filename) | |
| departments = excel_to_hash('pdks.xlsx') | |
| excel_filenames = hash_to_excel_departments_io(departments) | |
| excel_to_pdf(excel_filenames) |
| #!/usr/bin/env python | |
| # -*- coding: utf-8 -*- | |
| import openpyxl | |
| from openpyxl import load_workbook | |
| from openpyxl.styles import Alignment, Border, Font, Side, Style, PatternFill, Color | |
| from openpyxl.cell import get_column_letter | |
| import inspect | |
| import jpype | |
| import asposecells | |
| jpype.startJVM() | |
| from asposecells.api import Workbook, FileFormatType, PdfSaveOptions | |
| import datetime | |
| import os, pipes | |
| PDF_DIR = "pdf" | |
| EXCEL_DIR = "excel" | |
| if not os.path.isdir(os.path.join(os.getcwd(), EXCEL_DIR)): | |
| os.mkdir(os.path.join(os.getcwd(), EXCEL_DIR)) | |
| if not os.path.isdir(os.path.join(os.getcwd(), PDF_DIR)): | |
| os.mkdir(os.path.join(os.getcwd(), PDF_DIR)) | |
| # OKUMA ########################################################################################## | |
| def excel_to_hash(xlsx_filename): | |
| departments = [] | |
| # example departments | |
| # departments = [{ | |
| # "name" : "Bilgi İşlem", | |
| # "users" : [{ | |
| # "first_name" : "Gökhan", | |
| # "last_name" : "Demir", | |
| # "days" : [{ "date" : "2015-01-01", "i": "08:08:00", "o" : "08:08:08" }] | |
| # }] | |
| # }] | |
| wb = load_workbook(filename=xlsx_filename, read_only=True) | |
| ws = wb.active | |
| user_state = False | |
| department = "" | |
| for row in ws.rows: | |
| if user_state == False: | |
| if row[3].value is not None: # Bölüm ismini belirle yoksa ekle | |
| if "Bölüm" in row[3].value.split(): | |
| department_name = row[3].value[8:] | |
| department_search_state = False # Önceki kayıtlarda böyle bir bölüm kaydı var mı ? | |
| if departments != []: | |
| for department in departments: | |
| if department["name"] == department_name: | |
| department_search_state = True | |
| break | |
| if not department_search_state: | |
| departments.append({ "name" : department_name }) | |
| continue | |
| if row[1].value == "Ad": # Ad ise kişi bilgisi başladı | |
| user_state = True | |
| continue | |
| if user_state == True: | |
| if row[9].value is not None: # string ise ve Toplam Süre ise kişi bilgisi bitti | |
| if row[9].value == "Toplam Süre": | |
| user_state = False | |
| continue | |
| if row[1].value is not None and row[1].value != "Ad": | |
| for department in departments: | |
| if department["name"] == department_name: | |
| if "users" in department.keys(): # Bölüm'de hiç kullanıcı var mı ? | |
| user_search_state = False | |
| for user in department["users"]: | |
| if user["first_name"] == row[1].value and user["last_name"] == row[4].value: | |
| user_search_state = True | |
| user["days"].append({ "date" : row[5].value, "i" : row[7].value, "o" : row[8].value }) | |
| break | |
| if not user_search_state: | |
| department["users"].append({ | |
| "first_name" : row[1].value, | |
| "last_name" : row[4].value, | |
| "days" : [{ "date" : row[5].value, "i": row[7].value, "o" : row[8].value }] | |
| }) | |
| else: | |
| department["users"] = [{ | |
| "first_name" : row[1].value, | |
| "last_name" : row[4].value, | |
| "days" : [{ "date" : row[5].value, "i": row[7].value, "o" : row[8].value }] | |
| }] | |
| break | |
| return departments | |
| # YAZMA ########################################################################################## | |
| def hash_to_excel_departments_io(departments): | |
| print(">>> EXCEL Yazma işlemleri başlıyor") | |
| # general text styles | |
| text_border = Border(left = Side(style = 'thin'), right = Side(style = 'thin'), top = Side(style = 'thin'), bottom = Side(style = 'thin')) | |
| text_aligment = Alignment(horizontal = 'center', vertical = 'center') | |
| # comment colors and background colors | |
| comment_colors = { | |
| "danger" : { | |
| "bgcolor" : PatternFill(patternType = 'solid', fgColor = Color('dca7a7')), | |
| "textcolor" : Font(name = 'Calibri', size = 11, bold = True, color = 'a94442') | |
| }, | |
| "warning" : { | |
| "bgcolor" : PatternFill(patternType = 'solid', fgColor = Color('fcf8e3')), | |
| "textcolor" : Font(name = 'Calibri', size = 11, bold = True, color = '8a6d3b') | |
| }, | |
| "success" : { | |
| "bgcolor" : PatternFill(patternType = 'solid', fgColor = Color('ffffff')), | |
| "textcolor" : Font(name = 'Calibri', size = 11, bold = True, color = '000000') | |
| } | |
| } | |
| # header | |
| _header = ["Ad", "Soyad", "Tarih", "Giriş Saati", "Giriş Durumu", "Çıkış Saati", "Çıkış Durumu", "İzin Durum"] | |
| column_count = len(_header) | |
| # column and row width | |
| COLUMN_WIDTHS = [ 22, 20, 11, 9, 16, 9, 16, 10 ] | |
| ROW_WIDTH = 16.2 # 14 x 16.2 = 226.8 page height | |
| # excel filenames for pdf | |
| excel_filenames = [] | |
| for department in departments: | |
| wb = openpyxl.Workbook() | |
| ws = wb.active | |
| # title | |
| ws.merge_cells(start_row = 1, start_column = 1, end_row = 4, end_column = column_count) | |
| title = ws['A1'] | |
| title.value = department["name"] | |
| title.font = Font(name = 'Calibri', size = 14, bold = True, color = 'ffffff') | |
| title.alignment = text_aligment | |
| title.fill = PatternFill(patternType = 'solid', fgColor = Color('0099ff')) | |
| # header font and styles | |
| for col in range(1, column_count + 1): | |
| ws.cell(row = 5, column = col).value = _header[col - 1] | |
| ws.cell(row = 5, column = col).font = Font(name = 'Calibri', size = 8, bold = True, color = 'ffffff') | |
| ws.cell(row = 5, column = col).border = text_border | |
| ws.cell(row = 5, column = col).alignment = text_aligment | |
| ws.cell(row = 5, column = col).fill = PatternFill(patternType = 'solid', fgColor = Color('3072b3')) | |
| row = 6 | |
| department_users = department["users"] | |
| # department_users = sorted(department["users"], key = lambda k: k['first_name']) # sort hash list | |
| for user in department_users: | |
| first_row = row | |
| for day in user["days"]: | |
| if day["i"] is not None: | |
| i_time = day["i"].strftime("%H:%M") | |
| i_hour = int(day["i"].strftime("%H")) | |
| i_minute = int(day["i"].strftime("%M")) | |
| if (i_hour < 7) or (i_hour == 7 and i_minute <= 45): | |
| # i_color_key = "warning" | |
| # i_comment = "Erken Geldi" | |
| i_color_key = "success" | |
| i_comment = "" | |
| elif (i_hour > 8) or (i_hour == 8 and i_minute >= 15): | |
| i_color_key = "warning" | |
| i_comment = "Geç Geldi" | |
| else: | |
| i_color_key = "success" | |
| i_comment = "" # Sorun yok | |
| else: | |
| i_time = "" | |
| i_color_key = "danger" | |
| i_comment = "Kart Kullanmadı" | |
| if day["o"] is not None: | |
| o_time = day["o"].strftime("%H:%M") | |
| o_hour = int(day["o"].strftime("%H")) | |
| o_minute = int(day["o"].strftime("%M")) | |
| if (o_hour < 16) or (o_hour == 16 and o_minute <= 59): | |
| o_color_key = "warning" | |
| o_comment = "Erken Çıktı" | |
| elif (o_hour > 17) or (o_hour == 17 and o_minute >= 15): | |
| # o_color_key = "warning" | |
| # o_comment = "Geç Çıktı" | |
| o_color_key = "success" | |
| o_comment = "" | |
| else: | |
| o_color_key = "success" | |
| o_comment = "" # Sorun yok | |
| else: | |
| o_time = "" | |
| o_color_key = "danger" | |
| o_comment = "Kart Kullanmadı" | |
| ws.append([user["first_name"], user["last_name"], day["date"].strftime("%d-%m-%Y"), i_time, i_comment, o_time, o_comment, ""]) | |
| # color set for comments | |
| i_color = comment_colors[i_color_key] | |
| ws.cell(row = row, column = 5).fill = i_color["bgcolor"] | |
| ws.cell(row = row, column = 5).font = i_color["textcolor"] | |
| o_color = comment_colors[o_color_key] | |
| ws.cell(row = row, column = 7).fill = o_color["bgcolor"] | |
| ws.cell(row = row, column = 7).font = o_color["textcolor"] | |
| for col in range(1, column_count + 1): | |
| ws.cell(row = row, column = col).border = text_border | |
| ws.cell(row = row, column = col).alignment = text_aligment | |
| row = row + 1 | |
| # ad soyad | row : merge and center | |
| ws.merge_cells(start_row = first_row, end_row = row - 1, start_column = 1, end_column = 1) | |
| ws.merge_cells(start_row = first_row, end_row = row - 1, start_column = 2, end_column = 2) | |
| # EXCEL column with | |
| for col, width in enumerate(COLUMN_WIDTHS): | |
| ws.column_dimensions[get_column_letter(col + 1)].width = width | |
| # EXCEL row height | |
| for row in range(1, len(ws.rows)): | |
| ws.row_dimensions[row].height = ROW_WIDTH | |
| # PRINT(auto only page) | |
| # ws.page_setup.orientation = ws.ORIENTATION_PORTRAIT | |
| ws.page_setup.paperSize = ws.PAPERSIZE_A4 | |
| ws.page_setup.fitToPage = True | |
| ws.page_setup.fitToHeight = 0 | |
| ws.page_setup.fitToWidth = 1 | |
| ws.page_setup.horizontalCentered = True | |
| ws.page_setup.verticalCentered = True | |
| filename = os.path.join(os.getcwd(), EXCEL_DIR, department["name"] + ".xlsx") | |
| print("-" + filename) | |
| wb.save(filename = filename) | |
| excel_filenames.append(filename) | |
| return excel_filenames | |
| def excel_to_pdf(excel_filenames): | |
| print(">>> PDF yazma işlemleri başlıyor") | |
| os.chdir(PDF_DIR) | |
| for excel_filename in excel_filenames: | |
| filename = pipes.quote(excel_filename) | |
| # os.system("cd C:\Program Files\Microsoft Office\Office16") | |
| # os.system("EXCEL.EXE -headless -convert-to pdf " + filename) | |
| workbook = Workbook(excel_filename) | |
| # Convert Excel to PDF | |
| # workbook.save(filename + ".pdf", SaveFormat.PDF) | |
| # workbook.save(filename + ".pdf", asposecells.SaveFormat.PDF); | |
| saveOptions = PdfSaveOptions() | |
| workbook.save(excel_filename + ".pdf", saveOptions) | |
| # unix için os.system("libreoffice -headless -convert-to pdf " + filename) | |
| # os.system("soffice --headless --convert-to pdf:\"impress_pdf_Export\"" + filename) | |
| departments = excel_to_hash('pdks.xlsx') | |
| print(departments) | |
| excel_filenames = hash_to_excel_departments_io(departments) | |
| excel_to_pdf(excel_filenames) | |
| jpype.shutdownJVM() |
| #!/usr/bin/env python | |
| # -*- coding: utf-8 -*- | |
| from openpyxl import load_workbook, Workbook | |
| from openpyxl.styles import Alignment, Border, Font, Side, Style, PatternFill, Color | |
| from openpyxl.cell import get_column_letter | |
| import datetime | |
| import os, pipes | |
| PDF_DIR = "pdf" | |
| EXCEL_DIR = "excel" | |
| if not os.path.isdir(os.path.join(os.getcwd(), EXCEL_DIR)): | |
| os.mkdir(os.path.join(os.getcwd(), EXCEL_DIR)) | |
| if not os.path.isdir(os.path.join(os.getcwd(), PDF_DIR)): | |
| os.mkdir(os.path.join(os.getcwd(), PDF_DIR)) | |
| # OKUMA ########################################################################################## | |
| def excel_to_hash(xlsx_filename): | |
| departments = [] | |
| # example departments | |
| # departments = [{ | |
| # "name" : "Bilgi İşlem", | |
| # "users" : [{ | |
| # "first_name" : "Gökhan", | |
| # "last_name" : "Demir", | |
| # "days" : [{ "date" : "2015-01-01", "i": "08:08:00", "o" : "08:08:08" }] | |
| # }] | |
| # }] | |
| wb = load_workbook(filename=xlsx_filename, read_only=True) | |
| ws = wb.active | |
| user_state = False | |
| department = "" | |
| for row in ws.rows: | |
| if user_state == False: | |
| if row[3].value is not None: # Bölüm ismini belirle yoksa ekle | |
| if "Bölüm" in row[3].value.encode(encoding = 'UTF-8', errors = 'strict').split(): | |
| department_name = row[3].value[8:].encode(encoding = 'UTF-8', errors = 'strict') | |
| department_search_state = False # Önceki kayıtlarda böyle bir bölüm kaydı var mı ? | |
| if departments != []: | |
| for department in departments: | |
| if department["name"] == department_name: | |
| department_search_state = True | |
| break | |
| if not department_search_state: | |
| departments.append({ "name" : department_name }) | |
| continue | |
| if row[1].value == "Ad": # Ad ise kişi bilgisi başladı | |
| user_state = True | |
| continue | |
| if user_state == True: | |
| if row[9].value is not None: # string ise ve Toplam Süre ise kişi bilgisi bitti | |
| if row[9].value.encode(encoding = 'UTF-8', errors = 'strict') == "Toplam Süre": | |
| user_state = False | |
| continue | |
| date = row[5].value | |
| weekend = None | |
| if date is not None and date != "Tarih": | |
| day = date.strftime("%A") | |
| if day == "Saturday" or day == "Sunday": | |
| weekend = True | |
| if row[1].value is not None and row[1].value != "Ad" and weekend == None: | |
| for department in departments: | |
| if department["name"] == department_name: | |
| if "users" in department.keys(): # Bölüm'de hiç kullanıcı var mı ? | |
| user_search_state = False | |
| for user in department["users"]: | |
| if user["first_name"] == row[1].value and user["last_name"] == row[4].value: | |
| user_search_state = True | |
| user["days"].append({ "date" : row[5].value, "i" : row[7].value, "o" : row[8].value }) | |
| break | |
| if not user_search_state: | |
| department["users"].append({ | |
| "first_name" : row[1].value, | |
| "last_name" : row[4].value, | |
| "days" : [{ "date" : row[5].value, "i": row[7].value, "o" : row[8].value }] | |
| }) | |
| else: | |
| department["users"] = [{ | |
| "first_name" : row[1].value, | |
| "last_name" : row[4].value, | |
| "days" : [{ "date" : row[5].value, "i": row[7].value, "o" : row[8].value }] | |
| }] | |
| break | |
| return departments | |
| # YAZMA ########################################################################################## | |
| def hash_to_excel_departments_io(departments): | |
| print ">>> EXCEL Yazma işlemleri başlıyor" | |
| # general text styles | |
| text_border = Border(left = Side(style = 'thin'), right = Side(style = 'thin'), top = Side(style = 'thin'), bottom = Side(style = 'thin')) | |
| text_aligment = Alignment(horizontal = 'center', vertical = 'center') | |
| # comment colors and background colors | |
| comment_colors = { | |
| "danger" : { | |
| "bgcolor" : PatternFill(patternType = 'solid', fgColor = Color('dca7a7')), | |
| "textcolor" : Font(name = 'Calibri', size = 11, bold = True, color = 'a94442') | |
| }, | |
| "warning" : { | |
| "bgcolor" : PatternFill(patternType = 'solid', fgColor = Color('fcf8e3')), | |
| "textcolor" : Font(name = 'Calibri', size = 11, bold = True, color = '8a6d3b') | |
| }, | |
| "success" : { | |
| "bgcolor" : PatternFill(patternType = 'solid', fgColor = Color('ffffff')), | |
| "textcolor" : Font(name = 'Calibri', size = 11, bold = True, color = '000000') | |
| } | |
| } | |
| # header | |
| _header = ["Ad", "Soyad", "Tarih", "Giriş Saati", "Giriş Durumu", "Çıkış Saati", "Çıkış Durumu", "İzin Durum"] | |
| column_count = len(_header) | |
| # column and row width | |
| COLUMN_WIDTHS = [ 22, 20, 11, 9, 16, 9, 16, 10 ] | |
| ROW_WIDTH = 16.2 # 14 x 16.2 = 226.8 page height | |
| # excel filenames for pdf | |
| excel_filenames = [] | |
| for department in departments: | |
| wb = Workbook() | |
| ws = wb.active | |
| # title | |
| ws.merge_cells(start_row = 1, start_column = 1, end_row = 4, end_column = column_count) | |
| title = ws['A1'] | |
| title.value = department["name"] | |
| title.font = Font(name = 'Calibri', size = 14, bold = True, color = 'ffffff') | |
| title.alignment = text_aligment | |
| title.fill = PatternFill(patternType = 'solid', fgColor = Color('0099ff')) | |
| # header font and styles | |
| for col in range(1, column_count + 1): | |
| ws.cell(row = 5, column = col).value = _header[col - 1] | |
| ws.cell(row = 5, column = col).font = Font(name = 'Calibri', size = 8, bold = True, color = 'ffffff') | |
| ws.cell(row = 5, column = col).border = text_border | |
| ws.cell(row = 5, column = col).alignment = text_aligment | |
| ws.cell(row = 5, column = col).fill = PatternFill(patternType = 'solid', fgColor = Color('3072b3')) | |
| row = 6 | |
| department_users = department["users"] | |
| # department_users = sorted(department["users"], key = lambda k: k['first_name']) # sort hash list | |
| for user in department_users: | |
| first_row = row | |
| for day in user["days"]: | |
| if day["i"] is not None: | |
| i_time = day["i"].strftime("%H:%M") | |
| i_hour = int(day["i"].strftime("%H")) | |
| i_minute = int(day["i"].strftime("%M")) | |
| if (i_hour < 7) or (i_hour == 7 and i_minute <= 45): | |
| # i_color_key = "warning" | |
| # i_comment = "Erken Geldi" | |
| i_color_key = "success" | |
| i_comment = "" | |
| elif (i_hour > 8) or (i_hour == 8 and i_minute >= 15): | |
| i_color_key = "warning" | |
| i_comment = "Geç Geldi" | |
| else: | |
| i_color_key = "success" | |
| i_comment = "" # Sorun yok | |
| else: | |
| i_time = "" | |
| i_color_key = "danger" | |
| i_comment = "Kart Kullanmadı" | |
| if day["o"] is not None: | |
| o_time = day["o"].strftime("%H:%M") | |
| o_hour = int(day["o"].strftime("%H")) | |
| o_minute = int(day["o"].strftime("%M")) | |
| if (o_hour < 16) or (o_hour == 16 and o_minute <= 59): | |
| o_color_key = "warning" | |
| o_comment = "Erken Çıktı" | |
| elif (o_hour > 17) or (o_hour == 17 and o_minute >= 15): | |
| # o_color_key = "warning" | |
| # o_comment = "Geç Çıktı" | |
| o_color_key = "success" | |
| o_comment = "" | |
| else: | |
| o_color_key = "success" | |
| o_comment = "" # Sorun yok | |
| else: | |
| o_time = "" | |
| o_color_key = "danger" | |
| o_comment = "Kart Kullanmadı" | |
| ws.append([user["first_name"], user["last_name"], day["date"].strftime("%d-%m-%Y"), i_time, i_comment, o_time, o_comment, ""]) | |
| # color set for comments | |
| i_color = comment_colors[i_color_key] | |
| ws.cell(row = row, column = 5).fill = i_color["bgcolor"] | |
| ws.cell(row = row, column = 5).font = i_color["textcolor"] | |
| o_color = comment_colors[o_color_key] | |
| ws.cell(row = row, column = 7).fill = o_color["bgcolor"] | |
| ws.cell(row = row, column = 7).font = o_color["textcolor"] | |
| for col in range(1, column_count + 1): | |
| ws.cell(row = row, column = col).border = text_border | |
| ws.cell(row = row, column = col).alignment = text_aligment | |
| row = row + 1 | |
| # ad soyad | row : merge and center | |
| ws.merge_cells(start_row = first_row, end_row = row - 1, start_column = 1, end_column = 1) | |
| ws.merge_cells(start_row = first_row, end_row = row - 1, start_column = 2, end_column = 2) | |
| # EXCEL column with | |
| for col, width in enumerate(COLUMN_WIDTHS): | |
| ws.column_dimensions[get_column_letter(col + 1)].width = width | |
| # EXCEL row height | |
| for row in range(1, len(ws.rows)): | |
| ws.row_dimensions[row].height = ROW_WIDTH | |
| # PRINT auto only page | |
| # ws.page_setup.orientation = ws.ORIENTATION_PORTRAIT | |
| ws.page_setup.paperSize = ws.PAPERSIZE_A4 | |
| ws.page_setup.fitToPage = True | |
| ws.page_setup.fitToHeight = 0 | |
| ws.page_setup.fitToWidth = 1 | |
| ws.page_setup.horizontalCentered = True | |
| ws.page_setup.verticalCentered = True | |
| filename = os.path.join(os.getcwd(), EXCEL_DIR, department["name"] + ".xlsx") | |
| print "-" + filename | |
| wb.save(filename = filename) | |
| excel_filenames.append(filename) | |
| return excel_filenames | |
| def excel_to_pdf(excel_filenames): | |
| print ">>> PDF yazma işlemleri başlıyor" | |
| os.chdir(PDF_DIR) | |
| for excel_filename in excel_filenames: | |
| filename = pipes.quote(excel_filename) | |
| os.system("libreoffice -headless -convert-to pdf " + filename) | |
| # os.system("soffice --headless --convert-to pdf:\"impress_pdf_Export\"" + filename) | |
| departments = excel_to_hash('pdks.xlsx') | |
| excel_filenames = hash_to_excel_departments_io(departments) | |
| excel_to_pdf(excel_filenames) |
| #!/usr/bin/env python | |
| # -*- coding: utf-8 -*- | |
| import openpyxl | |
| from openpyxl import load_workbook | |
| from openpyxl.styles import Alignment, Border, Font, Side, Style, PatternFill, Color | |
| from openpyxl.cell import get_column_letter | |
| #import inspect | |
| #import jpype | |
| #import asposecells | |
| #jpype.startJVM(classpath="jars/*") | |
| #print(jpype.java.lang.System.getProperty("java.class.path")) | |
| #jpype.startJVM() | |
| #from asposecells.api import Workbook, FileFormatType, PdfSaveOptions | |
| import datetime | |
| import os, pipes | |
| #PDF_DIR = "pdf" | |
| EXCEL_DIR = "excel" | |
| #if not os.path.isdir(os.path.join(os.getcwd(), PDF_DIR)): | |
| # os.mkdir(os.path.join(os.getcwd(), PDF_DIR)) | |
| # OKUMA ########################################################################################## | |
| def excel_to_hash(xlsx_filename): | |
| departments = [] | |
| # example departments | |
| # departments = [{ | |
| # "name" : "Bilgi İşlem", | |
| # "users" : [{ | |
| # "first_name" : "Gökhan", | |
| # "last_name" : "Demir", | |
| # "days" : [{ "date" : "2015-01-01", "i": "08:08:00", "o" : "08:08:08" }] | |
| # }] | |
| # }] | |
| wb = load_workbook(filename=xlsx_filename, read_only=True) | |
| ws = wb.active | |
| user_state = False | |
| department = "" | |
| for row in ws.rows: | |
| if user_state == False: | |
| if row[3].value is not None: # Bölüm ismini belirle yoksa ekle | |
| if "Bölüm" in row[3].value.split(): | |
| department_name = row[3].value[8:] | |
| department_search_state = False # Önceki kayıtlarda böyle bir bölüm kaydı var mı ? | |
| if departments != []: | |
| for department in departments: | |
| if department["name"] == department_name: | |
| department_search_state = True | |
| break | |
| if not department_search_state: | |
| departments.append({ "name" : department_name }) | |
| continue | |
| if row[1].value == "Ad": # Ad ise kişi bilgisi başladı | |
| user_state = True | |
| continue | |
| if user_state == True: | |
| if row[9].value is not None: # string ise ve Toplam Süre ise kişi bilgisi bitti | |
| if row[9].value == "Toplam Süre": | |
| user_state = False | |
| continue | |
| if row[1].value is not None and row[1].value != "Ad": | |
| for department in departments: | |
| if department["name"] == department_name: | |
| if "users" in department.keys(): # Bölüm'de hiç kullanıcı var mı ? | |
| user_search_state = False | |
| for user in department["users"]: | |
| if user["first_name"] == row[1].value and user["last_name"] == row[4].value: | |
| user_search_state = True | |
| user["days"].append({ "date" : row[5].value, "i" : row[7].value, "o" : row[8].value }) | |
| break | |
| if not user_search_state: | |
| department["users"].append({ | |
| "first_name" : row[1].value, | |
| "last_name" : row[4].value, | |
| "days" : [{ "date" : row[5].value, "i": row[7].value, "o" : row[8].value }] | |
| }) | |
| else: | |
| department["users"] = [{ | |
| "first_name" : row[1].value, | |
| "last_name" : row[4].value, | |
| "days" : [{ "date" : row[5].value, "i": row[7].value, "o" : row[8].value }] | |
| }] | |
| break | |
| return departments | |
| # YAZMA ########################################################################################## | |
| def hash_to_excel_departments_io(departments): | |
| print(">>> EXCEL Yazma işlemleri başlıyor") | |
| FONT_NAME = 'Monda' | |
| # general text styles | |
| text_border = Border(left = Side(style = 'thin'), right = Side(style = 'thin'), top = Side(style = 'thin'), bottom = Side(style = 'thin')) | |
| text_aligment = Alignment(horizontal = 'center', vertical = 'center') | |
| # comment colors and background colors | |
| comment_colors = { | |
| "danger" : { | |
| "bgcolor" : PatternFill(patternType = 'solid', fgColor = Color('dca7a7')), | |
| "textcolor" : Font(name = FONT_NAME, size = 8, bold = True, color = 'a94442') | |
| }, | |
| "warning" : { | |
| "bgcolor" : PatternFill(patternType = 'solid', fgColor = Color('fcf8e3')), | |
| "textcolor" : Font(name = FONT_NAME, size = 8, bold = True, color = '8a6d3b') | |
| }, | |
| "success" : { | |
| "bgcolor" : PatternFill(patternType = 'solid', fgColor = Color('ffffff')), | |
| "textcolor" : Font(name = FONT_NAME, size = 8, bold = True, color = '000000') | |
| } | |
| } | |
| # header | |
| _header = ["Ad", "Soyad", "Tarih", "Giriş Saati", "Giriş Durumu", "Çıkış Saati", "Çıkış Durumu", "İzin Durum"] | |
| column_count = len(_header) | |
| # column and row width | |
| COLUMN_WIDTHS = [ 22, 20, 11, 9, 16, 9, 16, 10 ] | |
| ROW_WIDTH = 16.2 # 14 x 16.2 = 226.8 page height | |
| # excel filenames for pdf | |
| excel_filenames = [] | |
| for department in departments: | |
| wb = openpyxl.Workbook() | |
| ws = wb.active | |
| # TITLE font and styles | |
| ws.merge_cells(start_row = 1, start_column = 1, end_row = 4, end_column = column_count) | |
| title = ws['A1'] | |
| title.value = department["name"] | |
| title.font = Font(name = FONT_NAME, size = 14, bold = True, color = 'ffffff') | |
| title.alignment = text_aligment | |
| title.fill = PatternFill(patternType = 'solid', fgColor = Color('0099ff')) | |
| # HEADER font and styles | |
| for col in range(1, column_count + 1): | |
| ws.cell(row = 5, column = col).value = _header[col - 1] | |
| ws.cell(row = 5, column = col).font = Font(name = FONT_NAME, size = 8, bold = True, color = 'ffffff') | |
| ws.cell(row = 5, column = col).border = text_border | |
| ws.cell(row = 5, column = col).alignment = text_aligment | |
| ws.cell(row = 5, column = col).fill = PatternFill(patternType = 'solid', fgColor = Color('3072b3')) | |
| row = 6 | |
| department_users = department["users"] | |
| # department_users = sorted(department["users"], key = lambda k: k['first_name']) # sort hash list | |
| for user in department_users: | |
| first_row = row | |
| for day in user["days"]: | |
| if day["i"] is not None: | |
| i_time = day["i"].strftime("%H:%M") | |
| i_hour = int(day["i"].strftime("%H")) | |
| i_minute = int(day["i"].strftime("%M")) | |
| if (i_hour < 7) or (i_hour == 7 and i_minute <= 45): | |
| # i_color_key = "warning" | |
| # i_comment = "Erken Geldi" | |
| i_color_key = "success" | |
| i_comment = "" | |
| elif (i_hour > 8) or (i_hour == 8 and i_minute >= 15): | |
| i_color_key = "warning" | |
| i_comment = "Geç Geldi" | |
| else: | |
| i_color_key = "success" | |
| i_comment = "" # Sorun yok | |
| else: | |
| i_time = "" | |
| i_color_key = "danger" | |
| i_comment = "Kart Kullanmadı" | |
| if day["o"] is not None: | |
| o_time = day["o"].strftime("%H:%M") | |
| o_hour = int(day["o"].strftime("%H")) | |
| o_minute = int(day["o"].strftime("%M")) | |
| if (o_hour < 16) or (o_hour == 16 and o_minute <= 59): | |
| o_color_key = "warning" | |
| o_comment = "Erken Çıktı" | |
| elif (o_hour > 17) or (o_hour == 17 and o_minute >= 15): | |
| # o_color_key = "warning" | |
| # o_comment = "Geç Çıktı" | |
| o_color_key = "success" | |
| o_comment = "" | |
| else: | |
| o_color_key = "success" | |
| o_comment = "" # Sorun yok | |
| else: | |
| o_time = "" | |
| o_color_key = "danger" | |
| o_comment = "Kart Kullanmadı" | |
| data = [ user["first_name"], user["last_name"], day["date"].strftime("%d-%m-%Y"), i_time, i_comment, o_time, o_comment, "" ] | |
| ws.append(data) | |
| # ws.append([user["first_name"], user["last_name"], day["date"].strftime("%d-%m-%Y"), i_time, i_comment, o_time, o_comment, ""]) | |
| # Font set for input-output | |
| for col in range(1, column_count + 1): | |
| ws.cell(row = row, column = col).font = Font(name = FONT_NAME, size = 8) | |
| # COLOR set for comments | |
| i_color = comment_colors[i_color_key] | |
| ws.cell(row = row, column = 5).fill = i_color["bgcolor"] | |
| ws.cell(row = row, column = 5).font = i_color["textcolor"] | |
| o_color = comment_colors[o_color_key] | |
| ws.cell(row = row, column = 7).fill = o_color["bgcolor"] | |
| ws.cell(row = row, column = 7).font = o_color["textcolor"] | |
| for col in range(1, column_count + 1): | |
| ws.cell(row = row, column = col).border = text_border | |
| ws.cell(row = row, column = col).alignment = text_aligment | |
| row = row + 1 | |
| # ad soyad | row : merge and center | |
| ws.merge_cells(start_row = first_row, end_row = row - 1, start_column = 1, end_column = 1) | |
| ws.merge_cells(start_row = first_row, end_row = row - 1, start_column = 2, end_column = 2) | |
| # EXCEL column with | |
| for col, width in enumerate(COLUMN_WIDTHS): | |
| ws.column_dimensions[get_column_letter(col + 1)].width = width | |
| # EXCEL row height | |
| for row in range(1, len(ws.rows)): | |
| ws.row_dimensions[row].height = ROW_WIDTH | |
| # PRINT(auto only page) | |
| # ws.page_setup.orientation = ws.ORIENTATION_PORTRAIT | |
| ws.page_setup.paperSize = ws.PAPERSIZE_A4 | |
| ws.page_setup.fitToPage = True | |
| ws.page_setup.fitToHeight = 0 | |
| ws.page_setup.fitToWidth = 1 | |
| ws.page_setup.horizontalCentered = True | |
| ws.page_setup.verticalCentered = True | |
| filename = os.path.join(os.getcwd(), EXCEL_DIR, department["name"] + ".xlsx") | |
| print("-" + filename) | |
| wb.save(filename = filename) | |
| excel_filenames.append(filename) | |
| return excel_filenames | |
| def excel_to_pdf(excel_filenames): | |
| print(">>> PDF yazma işlemleri başlıyor") | |
| os.chdir(PDF_DIR) | |
| for excel_filename in excel_filenames: | |
| filename = pipes.quote(excel_filename) | |
| # os.system("cd C:\Program Files\Microsoft Office\Office16") | |
| # os.system("EXCEL.EXE -headless -convert-to pdf " + filename) | |
| workbook = Workbook(excel_filename) | |
| # Convert Excel to PDF | |
| # workbook.save(filename + ".pdf", SaveFormat.PDF) | |
| # workbook.save(filename + ".pdf", asposecells.SaveFormat.PDF); | |
| saveOptions = PdfSaveOptions() | |
| workbook.save(excel_filename + ".pdf", saveOptions) | |
| # unix için os.system("libreoffice -headless -convert-to pdf " + filename) | |
| # os.system("soffice --headless --convert-to pdf:\"impress_pdf_Export\"" + filename) | |
| def program_detail(): | |
| print("# PDKS Excel Parser\n") | |
| print("→ Description : PDKS'den alınan .xls dosyasını PDKS.xlsx şeklinde kaydettikten sonra parçalar.") | |
| print("→ Author : Gökhan Demir") | |
| print("→ Version : v2") | |
| print("→ Realese Date : 21.06.2023\n") | |
| # Program Detayı | |
| program_detail() | |
| # PDKS.xslx dosya kontrolü | |
| INPUT_FILE = 'pdks.xlsx' | |
| INPUT_FILE_PATH = os.path.join(os.getcwd(), INPUT_FILE) | |
| if not os.path.exists(INPUT_FILE_PATH): | |
| print("Dosya yok : " + INPUT_FILE_PATH) | |
| input("Bir tuşa basıp programı kapatınız.") | |
| exit() | |
| # EXCEL_DIR dizin kontrolü | |
| if not os.path.isdir(os.path.join(os.getcwd(), EXCEL_DIR)): | |
| os.mkdir(os.path.join(os.getcwd(), EXCEL_DIR)) | |
| # Ana Excel -> Hash olarak doldurma | |
| departments = excel_to_hash(INPUT_FILE_PATH) | |
| print("> Bulunan Deparment sayısı : %s", len(departments)) | |
| # Hash -> Excel Department olarak yazma | |
| excel_filenames = hash_to_excel_departments_io(departments) | |
| # Excel Department -> PDF Department olarak yazma | |
| # excel_to_pdf(excel_filenames) | |
| # jpype.shutdownJVM() |
| #!/usr/bin/env python | |
| # -*- coding: utf-8 -*- | |
| import openpyxl | |
| from openpyxl import load_workbook | |
| from openpyxl.styles import Alignment, Border, Font, Side, Style, PatternFill, Color | |
| from openpyxl.cell import get_column_letter | |
| #import inspect | |
| #import jpype | |
| #import asposecells | |
| #jpype.startJVM(classpath="jars/*") | |
| #print(jpype.java.lang.System.getProperty("java.class.path")) | |
| #jpype.startJVM() | |
| #from asposecells.api import Workbook, FileFormatType, PdfSaveOptions | |
| import datetime | |
| import os, pipes | |
| #PDF_DIR = "pdf" | |
| EXCEL_DIR = "excel" | |
| #if not os.path.isdir(os.path.join(os.getcwd(), PDF_DIR)): | |
| # os.mkdir(os.path.join(os.getcwd(), PDF_DIR)) | |
| # OKUMA ########################################################################################## | |
| def excel_to_hash(xlsx_filename): | |
| departments = [] | |
| # example departments | |
| # departments = [{ | |
| # "name" : "Bilgi İşlem", | |
| # "users" : [{ | |
| # "first_name" : "Gökhan", | |
| # "last_name" : "Demir", | |
| # "days" : [{ "date" : "2015-01-01", "i": "08:08:00", "o" : "08:08:08" }] | |
| # }] | |
| # }] | |
| wb = load_workbook(filename=xlsx_filename, read_only=True) | |
| ws = wb.active | |
| user_state = False | |
| department = "" | |
| for row in ws.rows: | |
| if user_state == False: | |
| if row[3].value is not None: # Bölüm ismini belirle yoksa ekle | |
| if "Bölüm" in row[3].value.split(): | |
| department_name = row[3].value[8:] | |
| department_search_state = False # Önceki kayıtlarda böyle bir bölüm kaydı var mı ? | |
| if departments != []: | |
| for department in departments: | |
| if department["name"] == department_name: | |
| department_search_state = True | |
| break | |
| if not department_search_state: | |
| departments.append({ "name" : department_name }) | |
| continue | |
| if row[1].value == "Ad": # Ad ise kişi bilgisi başladı | |
| user_state = True | |
| continue | |
| if user_state == True: | |
| if row[9].value is not None: # string ise ve Toplam Süre ise kişi bilgisi bitti | |
| if row[9].value == "Toplam Süre": | |
| user_state = False | |
| continue | |
| if row[1].value is not None and row[1].value != "Ad": | |
| for department in departments: | |
| if department["name"] == department_name: | |
| if "users" in department.keys(): # Bölüm'de hiç kullanıcı var mı ? | |
| user_search_state = False | |
| for user in department["users"]: | |
| if user["first_name"] == row[1].value and user["last_name"] == row[4].value: | |
| user_search_state = True | |
| user["days"].append({ "date" : row[5].value, "i" : row[7].value, "o" : row[8].value }) | |
| break | |
| if not user_search_state: | |
| department["users"].append({ | |
| "first_name" : row[1].value, | |
| "last_name" : row[4].value, | |
| "days" : [{ "date" : row[5].value, "i": row[7].value, "o" : row[8].value }] | |
| }) | |
| else: | |
| department["users"] = [{ | |
| "first_name" : row[1].value, | |
| "last_name" : row[4].value, | |
| "days" : [{ "date" : row[5].value, "i": row[7].value, "o" : row[8].value }] | |
| }] | |
| break | |
| return departments | |
| # YAZMA ########################################################################################## | |
| def hash_to_excel_departments_io(departments): | |
| print(">>> EXCEL Yazma işlemleri başlıyor") | |
| FONT_NAME = 'Calibri' | |
| # general text styles | |
| text_border = Border(left = Side(style = 'thin'), right = Side(style = 'thin'), top = Side(style = 'thin'), bottom = Side(style = 'thin')) | |
| text_aligment = Alignment(horizontal = 'center', vertical = 'center') | |
| # comment colors and background colors | |
| comment_colors = { | |
| "danger" : { | |
| "bgcolor" : PatternFill(patternType = 'solid', fgColor = Color('dca7a7')), | |
| "textcolor" : Font(name = FONT_NAME, size = 8, bold = True, color = 'a94442') | |
| }, | |
| "warning" : { | |
| "bgcolor" : PatternFill(patternType = 'solid', fgColor = Color('fcf8e3')), | |
| "textcolor" : Font(name = FONT_NAME, size = 8, bold = True, color = '8a6d3b') | |
| }, | |
| "success" : { | |
| "bgcolor" : PatternFill(patternType = 'solid', fgColor = Color('ffffff')), | |
| "textcolor" : Font(name = FONT_NAME, size = 8, bold = True, color = '000000') | |
| } | |
| } | |
| # header | |
| _header = ["Ad", "Soyad", "Tarih", "Giriş Saati", "Giriş Durumu", "Çıkış Saati", "Çıkış Durumu", "İzin Durum"] | |
| column_count = len(_header) | |
| # column and row width | |
| COLUMN_WIDTHS = [ 22, 20, 11, 9, 16, 9, 16, 10 ] | |
| ROW_WIDTH = 16.2 # 14 x 16.2 = 226.8 page height | |
| # excel filenames for pdf | |
| excel_filenames = [] | |
| for department in departments: | |
| wb = openpyxl.Workbook() | |
| ws = wb.active | |
| # TITLE font and styles | |
| ws.merge_cells(start_row = 1, start_column = 1, end_row = 4, end_column = column_count) | |
| title = ws['A1'] | |
| title.value = department["name"] | |
| title.font = Font(name = FONT_NAME, size = 14, bold = True, color = 'ffffff') | |
| title.alignment = text_aligment | |
| title.fill = PatternFill(patternType = 'solid', fgColor = Color('0099ff')) | |
| # HEADER font and styles | |
| for col in range(1, column_count + 1): | |
| ws.cell(row = 5, column = col).value = _header[col - 1] | |
| ws.cell(row = 5, column = col).font = Font(name = FONT_NAME, size = 8, bold = True, color = 'ffffff') | |
| ws.cell(row = 5, column = col).border = text_border | |
| ws.cell(row = 5, column = col).alignment = text_aligment | |
| ws.cell(row = 5, column = col).fill = PatternFill(patternType = 'solid', fgColor = Color('3072b3')) | |
| row = 6 | |
| department_users = department["users"] | |
| # department_users = sorted(department["users"], key = lambda k: k['first_name']) # sort hash list | |
| for user in department_users: | |
| first_row = row | |
| for day in user["days"]: | |
| if day["i"] is not None: | |
| i_time = day["i"].strftime("%H:%M") | |
| i_hour = int(day["i"].strftime("%H")) | |
| i_minute = int(day["i"].strftime("%M")) | |
| if (i_hour < 7) or (i_hour == 7 and i_minute <= 45): | |
| # i_color_key = "warning" | |
| # i_comment = "Erken Geldi" | |
| i_color_key = "success" | |
| i_comment = "" | |
| elif (i_hour > 8) or (i_hour == 8 and i_minute >= 15): | |
| i_color_key = "warning" | |
| i_comment = "Geç Geldi" | |
| else: | |
| i_color_key = "success" | |
| i_comment = "" # Sorun yok | |
| else: | |
| i_time = "" | |
| i_color_key = "danger" | |
| i_comment = "Kart Kullanmadı" | |
| if day["o"] is not None: | |
| o_time = day["o"].strftime("%H:%M") | |
| o_hour = int(day["o"].strftime("%H")) | |
| o_minute = int(day["o"].strftime("%M")) | |
| if (o_hour < 16) or (o_hour == 16 and o_minute <= 59): | |
| o_color_key = "warning" | |
| o_comment = "Erken Çıktı" | |
| elif (o_hour > 17) or (o_hour == 17 and o_minute >= 15): | |
| # o_color_key = "warning" | |
| # o_comment = "Geç Çıktı" | |
| o_color_key = "success" | |
| o_comment = "" | |
| else: | |
| o_color_key = "success" | |
| o_comment = "" # Sorun yok | |
| else: | |
| o_time = "" | |
| o_color_key = "danger" | |
| o_comment = "Kart Kullanmadı" | |
| data = [ user["first_name"], user["last_name"], day["date"].strftime("%d-%m-%Y"), i_time, i_comment, o_time, o_comment, "" ] | |
| ws.append(data) | |
| # ws.append([user["first_name"], user["last_name"], day["date"].strftime("%d-%m-%Y"), i_time, i_comment, o_time, o_comment, ""]) | |
| # Font set for input-output | |
| for col in range(1, column_count + 1): | |
| ws.cell(row = row, column = col).font = Font(name = FONT_NAME, size = 8) | |
| # COLOR set for comments | |
| i_color = comment_colors[i_color_key] | |
| ws.cell(row = row, column = 5).fill = i_color["bgcolor"] | |
| ws.cell(row = row, column = 5).font = i_color["textcolor"] | |
| o_color = comment_colors[o_color_key] | |
| ws.cell(row = row, column = 7).fill = o_color["bgcolor"] | |
| ws.cell(row = row, column = 7).font = o_color["textcolor"] | |
| for col in range(1, column_count + 1): | |
| ws.cell(row = row, column = col).border = text_border | |
| ws.cell(row = row, column = col).alignment = text_aligment | |
| row = row + 1 | |
| # ad soyad | row : merge and center | |
| ws.merge_cells(start_row = first_row, end_row = row - 1, start_column = 1, end_column = 1) | |
| ws.merge_cells(start_row = first_row, end_row = row - 1, start_column = 2, end_column = 2) | |
| # EXCEL column with | |
| for col, width in enumerate(COLUMN_WIDTHS): | |
| ws.column_dimensions[get_column_letter(col + 1)].width = width | |
| # EXCEL row height | |
| for row in range(1, len(ws.rows)): | |
| ws.row_dimensions[row].height = ROW_WIDTH | |
| # PRINT(auto only page) | |
| # ws.page_setup.orientation = ws.ORIENTATION_PORTRAIT | |
| ws.page_setup.paperSize = ws.PAPERSIZE_A4 | |
| ws.page_setup.fitToPage = True | |
| ws.page_setup.fitToHeight = 0 | |
| ws.page_setup.fitToWidth = 1 | |
| ws.page_setup.horizontalCentered = True | |
| ws.page_setup.verticalCentered = True | |
| filename = os.path.join(os.getcwd(), EXCEL_DIR, department["name"] + ".xlsx") | |
| print("-" + filename) | |
| wb.save(filename = filename) | |
| excel_filenames.append(filename) | |
| return excel_filenames | |
| def excel_to_pdf(excel_filenames): | |
| print(">>> PDF yazma işlemleri başlıyor") | |
| os.chdir(PDF_DIR) | |
| for excel_filename in excel_filenames: | |
| filename = pipes.quote(excel_filename) | |
| # os.system("cd C:\Program Files\Microsoft Office\Office16") | |
| # os.system("EXCEL.EXE -headless -convert-to pdf " + filename) | |
| workbook = Workbook(excel_filename) | |
| # Convert Excel to PDF | |
| # workbook.save(filename + ".pdf", SaveFormat.PDF) | |
| # workbook.save(filename + ".pdf", asposecells.SaveFormat.PDF); | |
| saveOptions = PdfSaveOptions() | |
| workbook.save(excel_filename + ".pdf", saveOptions) | |
| # unix için os.system("libreoffice -headless -convert-to pdf " + filename) | |
| # os.system("soffice --headless --convert-to pdf:\"impress_pdf_Export\"" + filename) | |
| def program_detail(): | |
| print("# PDKS Excel Parser\n") | |
| print("→ Description : PDKS'den alınan .xls dosyasını PDKS.xlsx şeklinde kaydettikten sonra parçalar.") | |
| print("→ Author : Gökhan Demir") | |
| print("→ Version : v3") | |
| print("→ Realese Date : 15.08.2023\n") | |
| # Program Detayı | |
| program_detail() | |
| # PDKS.xslx dosya kontrolü | |
| INPUT_FILE = 'pdks.xlsx' | |
| INPUT_FILE_PATH = os.path.join(os.getcwd(), INPUT_FILE) | |
| if not os.path.exists(INPUT_FILE_PATH): | |
| print("Dosya yok : " + INPUT_FILE_PATH) | |
| input("Bir tuşa basıp programı kapatınız.") | |
| exit() | |
| # EXCEL_DIR dizin kontrolü | |
| if not os.path.isdir(os.path.join(os.getcwd(), EXCEL_DIR)): | |
| os.mkdir(os.path.join(os.getcwd(), EXCEL_DIR)) | |
| # Ana Excel -> Hash olarak doldurma | |
| departments = excel_to_hash(INPUT_FILE_PATH) | |
| print("> Bulunan Deparment sayısı :", len(departments)) | |
| # Hash -> Excel Department olarak yazma | |
| excel_filenames = hash_to_excel_departments_io(departments) | |
| # Excel Department -> PDF Department olarak yazma | |
| # excel_to_pdf(excel_filenames) | |
| # jpype.shutdownJVM() |
README
source : https://bobbyhadz.com/blog/choco-is-not-recognized-as-internal-or-external-command
run powershell
[BAŞLAT + R]
Powershell yönetici olarak çalıştır
choco installer install
Set-ExecutionPolicy Bypass -Scope Process -Force; [System.Net.ServicePointManager]::SecurityProtocol = [System.Net.ServicePointManager]::SecurityProtocol -bor 3072; iex ((New-Object System.Net.WebClient).DownloadString('https://community.chocolatey.org/install.ps1'))
curl install
choco install curl -y
pip install
curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py
cd C:\Users\gokhan.demir2\AppData\Local\Programs\Python\Python310
python.exe get-pip.py
autopytoexe.exe install
cd C:\Users\gokhan.demir2\AppData\Local\Programs\Python\Python310\Scripts
pip.exe install auto-py-to-exe
autopytoexe.exe run
cd C:\Users\gokhan.demir2\AppData\Local\Programs\Python\Python310
python.exe C:\Users\gokhan.demir2\AppData\Local\Programs\Python\Python310\Scripts\autopytoexe.exe
python.exe -m C:\Users\gokhan.demir2\AppData\Local\Programs\Python\Python310\Scripts\autopytoexe.exe
cd C:\Users\gokhan.demir2\AppData\Local\Programs\Python\Python310\output\yazici_bul.exe
run auto-py-to-exe.exe
C:\Users\gokhan.demir2\AppData\Local\Programs\Python\Python310>python.exe Scripts\auto-py-to-exe.exe
C:\Users\gokhan.demir2\AppData\Local\Programs\Python\Python310>python.exe -m Scripts\auto-py-to-exe.exe
pip install -Iv openpyxl==2.3.3