디시인사이드 갤러리

갤러리 이슈박스, 최근방문 갤러리

갤러리 본문 영역

[💡답변] 아래 (58.238) 답변

ㅇㅇ(112.221) 2024.01.31 16:10:48
조회 141 추천 0 댓글 0
														
import os
import sys
import datetime
from itertools import zip_longest

import openpyxl
from PyQt6.QtWidgets import (
QApplication,
QMainWindow,
QGridLayout,
QWidget,
QFileDialog,
QPushButton,
QLabel,
QLineEdit,
)
from PyQt6.QtCore import (
Qt,
QThread,
pyqtSignal,
pyqtSlot,
)

if getattr(sys, "frozen", False):
BASE_DIR = sys._MEIPASS
else:
BASE_DIR = os.path.dirname(os.path.abspath(__file__))

class WorkerThread(QThread):
error_B5 = pyqtSignal(str)
error_G14 = pyqtSignal(str)
error_G15 = pyqtSignal(str)
ERROR_DICT = {
FileNotFoundError: "The selected file does not exist.",
UnicodeDecodeError: "The selected file is not a text file.",
PermissionError: "The selected file is being used by another program.",
}

def __init__(self, template_path, B5_path, G14_path, G15_path, parent=None):
super().__init__()
self._template_path = template_path
self._B5_path = B5_path
self._G14_path = G14_path
self._G15_path = G15_path

@property
def template_path(self) -> str:
return self._template_path

@property
def B5_path(self) -> str:
return self._B5_path

@property
def G14_path(self) -> str:
return self._G14_path

@property
def G15_path(self) -> str:
return self._G15_path

@staticmethod
def _loadTextFile(text_path: str, signal: pyqtSignal) -> list[str]:
if not text_path:
return []
try:
with open(text_path, 'r', encoding='utf-8') as txt_file:
lines = txt_file.readlines()
entries = [line.strip() for line in lines]
return entries
except Exception as e:
signal.emit(WorkerThread.ERROR_DICT.get(type(e), str(e)))
return []

def run(self):
self.B5_entries = self._loadTextFile(self.B5_path, self.error_B5)
self.G14_entries = self._loadTextFile(self.G14_path, self.error_G14)
self.G15_entries = self._loadTextFile(self.G15_path, self.error_G15)

for i, (B5, G14, G15) in enumerate(zip_longest(self.B5_entries, self.G14_entries, self.G15_entries, fillvalue=''), 1):
template_wb = openpyxl.load_workbook(self.template_path)
template_ws = template_wb.active
template_ws['B5'].value = B5
template_ws['G14'].value = G14
template_ws['G15'].value = G15

dir_name = os.path.dirname(self.template_path)
base_name = os.path.basename(self.template_path)
name, ext = os.path.splitext(base_name)
current_time = datetime.datetime.now().strftime("%y%m%d%H%M%S%f")[:-3]
new_file_name = f"{name}_{i}_{current_time}{ext}"
new_file_path = os.path.join(dir_name, new_file_name)

try:
template_wb.save(new_file_path)
finally:
template_wb.close()

class MainWindow(QMainWindow):
def __init__(self):
super().__init__()
self.setWindowTitle("Excel Filler")
self.setFixedSize(500, 200)
self.setWindowFlags(self.windowFlags() & ~Qt.WindowType.WindowMaximizeButtonHint)
self.initUI()
self.worker = None

def initUI(self):
if not self.centralWidget():
central_widget = QWidget(self)
self.setCentralWidget(central_widget)
self.central_layout = QGridLayout(self.centralWidget())

self.template_edit = self.createFileSelectionRow("Template File", 0)
self.template_edit.textChanged.connect(self.checkTemplateFile)
self.B5_edit = self.createFileSelectionRow("B5 File", 1)
self.G14_edit = self.createFileSelectionRow("G14 File", 2)
self.G15_edit = self.createFileSelectionRow("G15 File", 3)

self.start_button = QPushButton("Start")
self.start_button.setEnabled(False)
self.start_button.setAutoDefault(True)
self.start_button.clicked.connect(self.startClicked)
self.start_button.clicked.connect(lambda: self.start_button.setEnabled(False))
self.central_layout.addWidget(self.start_button, 4, 0, 1, 3)

def createFileSelectionRow(self, label_text, row_index) -> QLineEdit:
file_label = QLabel(label_text)
self.central_layout.addWidget(file_label, row_index, 0)

file_edit = QLineEdit()
file_edit.setReadOnly(True)
file_edit.setFocusPolicy(Qt.FocusPolicy.NoFocus)
file_edit.setStyleSheet('QLineEdit[ErrorFlag=true]{color: red;}')
self.central_layout.addWidget(file_edit, row_index, 1)

file_button = QPushButton("...")
file_button.setMaximumWidth(30)
file_button.clicked.connect(lambda: self.selectFile(file_edit))
self.central_layout.addWidget(file_button, row_index, 2)

return file_edit


    @pyqtSlot(QLineEdit)

def selectFile(self, line_edit):

file_path, _ = QFileDialog.getOpenFileName(
parent=self,
caption="Select File",
directory=f"{BASE_DIR}",
filter="Excel file (*.xlsx *.xls *.xlsm *.cell *.csv);;" if line_edit == self.template_edit else "Text file (*.txt)",
initialFilter=None,
options=QFileDialog.Option.DontUseNativeDialog
)
if file_path:
line_edit.setText(file_path)
line_edit.setProperty("ErrorFlag", False)
line_edit.style().unpolish(line_edit)
line_edit.style().polish(line_edit)

@pyqtSlot(str)
def checkTemplateFile(self, text):
if text:
self.start_button.setEnabled(True)
else:
self.start_button.setEnabled(False)

@pyqtSlot(bool)
def startClicked(self, stat):
if self.worker is None or not self.worker.isRunning():
self.worker = WorkerThread(
self.template_edit.text(),
self.B5_edit.text(),
self.G14_edit.text(),
self.G15_edit.text()
)
self.worker.error_B5.connect(self.updateB5)
self.worker.error_G14.connect(self.updateG14)
self.worker.error_G15.connect(self.updateG15)
self.worker.finished.connect(lambda: self.start_button.setEnabled(True))
self.worker.start()

@pyqtSlot(str)
def updateB5(self, text):
self.B5_edit.setText(text)
self.B5_edit.setProperty("ErrorFlag", True)
self.B5_edit.style().unpolish(self.B5_edit)
self.B5_edit.style().polish(self.B5_edit)

@pyqtSlot(str)
def updateG14(self, text):
self.G14_edit.setText(text)
self.G14_edit.setProperty("ErrorFlag", True)
self.G14_edit.style().unpolish(self.G14_edit)
self.G14_edit.style().polish(self.G14_edit)

@pyqtSlot(str)
def updateG15(self, text):
self.G15_edit.setText(text)
self.G15_edit.setProperty("ErrorFlag", True)
self.G15_edit.style().unpolish(self.G15_edit)
self.G15_edit.style().polish(self.G15_edit)



if __name__ == "__main__":
app = QApplication(sys.argv)
window = MainWindow()
window.show()
sys.exit(app.exec())


메일로 보냈는데 이게 더 최신임


코드 지적 시 님들이 맞음

추천 비추천

0

고정닉 0

0

댓글 영역

전체 댓글 0
본문 보기

하단 갤러리 리스트 영역

왼쪽 컨텐츠 영역

갤러리 리스트 영역

갤러리 리스트
번호 말머리 제목 글쓴이 작성일 조회 추천
- 설문 영포티룩도 멋지게 소화할 것 같은 40대 스타는? 운영자 25/10/27 - -
- AD 저녁 뭐먹지? 오늘의 메뉴 추천! 운영자 25/10/31 - -
2503 🔎질문 GCE으로 디시 접속하는게 막혀있는건가요? [3] ㅇㅇ(222.119) 24.04.02 113 0
2502 🔎질문 혼자공부파이썬 vs 점프투파이썬 [1] ㅇㅇ(218.237) 24.04.02 1675 0
2501 🔎질문 같은 파일 안에있는 모듈을 import하면 오류나는데 어캐함 [1] ㅇㅇ(211.111) 24.04.02 106 0
2500 🔎질문 input 함수에서 숫자랑 문자 동시에 쓰려면 어떻게 해야 돼? [5] ㅇㅇ(119.192) 24.03.31 114 0
2499 🔎질문 파이썬 질문이요.. ㅠㅠ ㅇㅇ(39.123) 24.03.29 110 0
2498 🔎질문 str 내가 제대로 이해한게 맞아 형들? [4] ㅇㅇ(182.210) 24.03.27 147 0
2496 🔎질문 pyaudio로 usb 헤드셋 출력 장치 녹음 가능한가요? ㅇㅇ(180.233) 24.03.26 182 0
2495 🔎질문 잘못된거 고쳐줘용 failed 하나 떠요 [3] ㅇㅇ(121.180) 24.03.26 106 0
2494 🔎질문 잘못된 부분 고쳐줘용 [1] ㅇㅇ(121.180) 24.03.26 77 0
2493 🔎질문 간만에 웹크롤링 관련 질문 드릴 게 있어서 왔습니다. (유튜브 댓글) ㅁㅁ(14.39) 24.03.26 460 0
2492 🔎질문 파이썬 list 질문 [5] ㅇㅇ(112.163) 24.03.26 128 0
2491 🔎질문 형님들 질문 있습니다. [1] ㅇㅇ(211.185) 24.03.25 134 0
2490 🔎질문 파이썬 gc.collect() 결과값이 0이면 메모리 정리되었다는거임? [1] ㅇㅇ(112.163) 24.03.24 82 0
2488 🔎질문 파이썬 컴퓨터에서 나오는 오디오 출력 장치 녹음 방법 [3] ㅇㅇ(121.171) 24.03.22 1032 0
2487 🔎질문 파이썬으로 만든 프로그램 계속 돌리면 램 쌓여? [3] ㅇㅇ(112.163) 24.03.20 203 0
2485 🔎질문 파이썬 실행 시간 측정 질문 ㅇㅇ(220.86) 24.03.17 133 0
2483 🔎질문 助けて, 助けて, 助けて, 助けて ㅇㅇ(210.95) 24.03.14 99 0
2482 🔎질문 html 파일 주피터 노트북에서 ipynb로 여는 방법이 있을까요? ㅇㅇ(121.171) 24.03.12 208 0
2481 🔎질문 파이썬 파일 읽기 질문 드립니다. [5] ㅇㅇ(121.140) 24.03.12 294 0
2477 🔎질문 제외할 조합 추가하면 에러 뜨는데 어떻게 해야할까요 [6] 시스템파괴갤로그로 이동합니다. 24.03.04 101 1
2475 🔎질문 파이썬 독학 및 데이터분석 하고싶어서 아나콘다 깔았는데 [2] ㅇㅇ갤로그로 이동합니다. 24.02.28 403 0
2474 일반 chrome driver [1] ㅇㅇ(121.125) 24.02.26 102 0
2473 🔎질문 win32gui 설치가 안되는 도움좀... [1] ㅇㅇ(59.19) 24.02.26 363 0
2471 🔎질문 고1 입문하려는데 질문있습니다 [3] ㅇㅇ(220.76) 24.02.25 254 0
2469 🔎질문 파이썬 연습중인 개초보입니다. [2] ㅇㅇ(125.138) 24.02.22 200 0
2467 🔎질문 크롤링 공부중인데 주제 추천점 아무거나 만들어봄 [6] ㅇㅇ(221.158) 24.02.13 196 0
2465 🔎질문 json date 날짜 변환 질문입니다. [2] ㅇㅇ(175.194) 24.02.08 109 0
2464 🔎질문 멀티프로세싱 질문 [1] ㅇㅇ(112.163) 24.02.07 142 0
2463 🔎질문 파이썬 - 하나의 텍스트 파일에 있는 내용을 다른 텍스트 파일에 이어넣기 [2] ㅇㅇ(14.32) 24.02.07 99 0
2462 🔎질문 exe파일을 실행할 때 콘솔창 크기랑 위치 조절하는 방법 읍음? [4] ㅇㅇ(112.163) 24.02.06 80 0
2461 🔎질문 도매사이트에서 크롤링 할 필요가 있는데요. 만능 크롤러 개발은 어려울까요 [3] ㅇㅇ(211.222) 24.02.06 141 0
2460 🔎질문 셀레니움 실행 시 창이 자꾸 앞으로 와요 [4] ㅇㅇ(58.140) 24.02.06 120 0
2458 🔎질문 다중할당 질문 [5] ㅇㅇ(220.86) 24.02.04 137 0
2457 🔎질문 본체1개에 마우스2개 쓸 수 있는 방법읍음? [1] ㅇㅇ(112.163) 24.02.04 191 0
2456 🔎질문 업데이트이후, 셀레니움 메모리,CPU누수 질문. [8] ㅇㅇ(211.105) 24.02.03 505 0
💡답변 아래 (58.238) 답변 ㅇㅇ(112.221) 24.01.31 141 0
2453 일반 세상은 아직 살만하네요... [1] ㅇㅇ(58.238) 24.01.30 170 4
2452 일반 asdfasdf [4] ㅇㅇ(58.238) 24.01.29 115 0
2451 일반 직붕이 엑셀 오류 코드 파일 [5] ㅇㅇ(58.238) 24.01.29 187 0
2450 일반 밑에 글 쓴 직붕인데 졸려서 제목도 못 적었다 [4] ㅇㅇ(58.238) 24.01.28 128 0
2449 일반 ㄴㅇㅁㄻㄴㅇㄹ ㅇㅇ(58.238) 24.01.28 86 0
2448 🔎질문 파이썬으로 모바일 어플리케이션 제작하려고 하는데 [1] ㅇㅇ(211.234) 24.01.27 319 0
2447 🔎질문 안녕하세요 판다스, openpyxl 질문 있습니다. [1] ㅇㅇ(106.102) 24.01.27 127 0
2446 🔎질문 30중반 직장인인데 언어 처음 배워보려면 [3] ㅎㅋㅎㅋ(210.3) 24.01.26 182 0
2445 일반 우리나라만 유독 자바를 쓰는 이유가 멀까 [2] ㅇㅇ(58.124) 24.01.25 173 0
2443 🔎질문 엔터 입력 시 커서 위치 질문(재업 [2] ㅇㅇ(1.229) 24.01.15 115 0
2441 🔎질문 형님들 셀레니움에서 인증 해야하는 socks5 프록시를 지원하는 방법 [2] ㅇㅇ(175.196) 24.01.15 128 0
2440 🔎질문 혹시 디코봇 만들어주실분 계신가요 [13] ㅇㅇ(211.220) 24.01.14 188 0
2437 🔎질문 설치 관련 질문 [1] ㅇㅇ(182.212) 24.01.09 142 0
2436 🔎질문 Vpython 오류 이거 왜생겨요???? [2] ㅇㅇ(59.9) 24.01.08 107 0
갤러리 내부 검색
제목+내용게시물 정렬 옵션

오른쪽 컨텐츠 영역

실시간 베스트

1/8

디시미디어

디시이슈

1/2