기술나눔

pandas pywin32는 Excel 사무 자동화를 운영합니다.

2024-07-12

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina

pandas를 pd로 가져오기
수입하다 다시
win32com.client를 win32로 가져오기
win32com.client에서 상수 가져오기
수입 os
os.path를 osp로 가져오기
 
#테이블 읽기
경로=os.getcwd()
fp=osp.join(경로,'fuck_demo.xlsx')
df=pd.read_excel(fp,header=1,usecols=['일련번호','광케이블 구간 이름(A끝-B끝)'],nrows=72)#nrows를 잊지 마세요
df.set_index('일련번호',inplace=True)#인덱스 설정
 
#필터 데이터
df_1=df[~df['광케이블 구간 이름 (A단-B단)'].str.contains('JT01')]
df_2=df[df['광케이블 구간명 (A단-B단)'].str.contains('JT01')]
 
#작업 참조 df_2 데이터
reg=re.compile(r'(?<=()(.*?)(?=))')
복사()
pf['Extract AB end']=pf['광케이블 구간 이름 (A-end-B end)'].str.extract(reg,expand=False)
pf['광케이블 코어 수']=pf['광케이블 구간 이름(A 끝-B 끝)'].str.extract(r'(?:.*)(-d+)',expand=False)
pf=pf.iloc[::-1]#역순, 키
pf['광케이블 코어 수'] = pf['광케이블 코어 수'].replace('-', '', regex=True)#replace
 
 
#데이터 처리
ls=[]
pf.iterrows()의 idx,row에 대해:
strs_2=row['광케이블 구간명 (끝 A-끝 B)']
strs_3=row['AB 끝 추출']
strs_4=row['광케이블 코어수']
strs_3이 strs_2에 있는 경우:
ls.append([idx,strs_3,strs_4])
 
 
lg=[]#Storage 현재 항목이 이전 항목과 같고 다음 항목과 같지 않습니다.
lf=[]#Storage 이전과 이후의 두 항목이 동일하지 않습니다.
i가 len(ls) 범위에 있는 경우:
ls[i][1]==ls[i-1][1]이고 ls[i][1]!=ls[i+1][1]인 경우:
lt=ls[i-1:i+2]
l1=[]#저장소 번호
l2=[]#AB 터미널 저장
l3=[]#광케이블 심수 저장
j의 범위(len(lt))에 대해:
l1.추가(lt[j][0])
l2.추가(lt[j][1])
l3.추가(lt[j][-1])
 
new_l1=[min(l1),max(l1)]#최소값과 최대값을 구합니다
new_l1=map(str,new_l1)#목록 요소는 문자열에 매핑됩니다.
새로운 l2 = 리스트(집합(l2)) + 리스트(집합(l3))
res_1='-'.join(new_l1)#일련번호 접합
res_2='-'.join(new_l2)#AB 끝 광케이블 코어 번호 접합
res_3=list((res_1,res_2))#목록으로 변환
lg.추가(res_3)
또 다른:
l1=ls[i][0]#매장번호
l2=ls[i][1]#store AB 끝
l3=ls[i][-1]#storage 광케이블 코어 수
res_4=리스트((l1,l2,l3))
lf.추가(res_4)
 
 
 
xh=[]#일련번호
ab=[]#ab 끝
xs=[]#코어 수
k가 lf의 범위에 있을 때:
l1=lf[k][0]#매장번호
l2=lf[k][1]#store AB 끝
l3=lf[k][-1]#storage 광케이블 심수
xh.추가(l1)
ab.추가(l2)
추가(l3)
 
#쌍으로 다시 모이기
xh = [xh[x:x+2] (x의 범위는 0, xh의 길이, 2)입니다.
ab=[ab[x:x+2] x의 범위(0, ab(길이), 2)에 대해]
xs=[xs[x:x+2] x가 0, xs 길이, 2의 범위에 있는 경우]
 
영화=[]
n이 범위(len(xh))에 있는 경우:
l1=리스트((최소(xh[n]), 최대(xh[n])))
new_l1=맵(str,l1)
l2=리스트(집합(xs[n]))
l3=a1[n]+l2
 
res_1='-'.join(새로운_l1)
res_2='-'.join(l3)
res_1,res_2를 추가합니다.
 
 
최종_목록=lg+lm
 
#removed중복
마지막으로_ls=[]
l에 대해 finall_list:
if l가 finall_ls에 없으면:
마지막으로_ls.append(l)
 
#결과 목록을 기반으로 DataFrame을 다시 만듭니다.
df_3=pd.DataFrame(data=final_ls,columns=['일련번호','광케이블 구간 이름(끝 A-끝 B)'])
df_3.set_index('serial number',drop=True,inplace=True)#일련번호 열을 인덱스로 설정
 
 
#광케이블의 JT가 없는 부분과 가공된 부분을 JT로 접합합니다.
cf=pd.concat([df_1,df_3],축=0)
 
 
'''
인덱스를 다시 교체해도 괜찮고, 교체하지 않아도 괜찮습니다. 아무튼 줄번호는 일련번호 + 2를 기준으로 합니다.
'''
 
#pywin32엑셀 테이블 읽기
#엑셀프로그램실행
노력하다:
excel_app = win32.gencache.EnsureDispatch('Excel.응용 프로그램')
제외하고:
노력하다:
win32.gencache.EnsureDispatch('et.Application')
제외하고:
win32.gencache.EnsureDispatch('ket.애플리케이션')
마지막으로:
excel_app.Visible = 참
excel_app.디스플레이알림 = 거짓
#테이블의 필수 열 읽기
통합 문서 = excel_app.Workbooks.Open(fp)
워크시트 = 통합 문서.워크시트('목록')
워크시트.열(3).Insert()
워크시트.열(4).Insert()
worksheet.Cells(2, 3).Value = '도면 번호'#열 이름 설정
worksheet.Cells(2, 4).Value = '단락 이름'#열 이름 설정.
 
#작업양식
cf.iterrows()의 idx,row에 대해:
dl=row['광케이블 구간명 (A끝-B끝)']
bh=idx
str(bh)에 '-'가 있는 경우:
sb=bh.split('-')
start_row=int(min(sb))+2#시작 행 번호
end_row=int(max(sb))+2#행 번호 끝
range1_to_merge=worksheet.Range(worksheet.Cells(start_row, 3), worksheet.Cells(end_row, 3))#병합할 셀의 "그림 번호"
range2_to_merge=worksheet.Range(worksheet.Cells(start_row, 4), worksheet.Cells(end_row, 4))#병합할 셀의 "단락 이름"
range3_to_color=worksheet.Range(worksheet.Cells(start_row, 5), worksheet.Cells(end_row, 5))#"광케이블 단면명(end A-end B)"에 색상을 설정합니다.
range4_to_color=worksheet.Range(worksheet.Cells(start_row, 17), worksheet.Cells(end_row, 17))#색상을 설정하는 "주문 번호 + 요청자"
range2_to_merge.WrapText = True#자동으로 줄 바꿈
range3_to_color.Interior.Color =7396243 # 연한 빨간색 채우기 색상 804040
범위4_to_color.내부.색상 =7396243
#range3_to_merge.Font.Color = 25500 # 진한 빨간색 텍스트
range1_to_merge.Value=bh#도면 번호
range2_to_merge.Value=dl#광케이블 단락
범위1_병합_대상.병합()
범위2_병합_합니다.병합()
병합할 범위2.행.행 높이=36
범위2_병합_열.열 너비 = 34
또 다른:
워크시트.셀(idx+2,3).값 = idx
워크시트.셀(idx+2,4).값 = dl
worksheet.Cells(idx+2,4).WrapText = True#자동으로 줄 바꿈
 
 
#작업을 종료하고 양식을 저장합니다.
통합 문서.저장()
workbook.Close(변경 내용 저장=False)
excel_app.종료()