技術共有

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=df_2.コピー()
pf['AB端の抽出']=pf['光ケーブル断面名(A端-B端)'].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 の前後 2 つのアイテムは等しくありません
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.append(lt[j][0])
l2.append(lt[j][1])
l3.append(lt[j][-1])
 
new_l1=[min(l1),max(l1)]#最小値と最大値を取得します
new_l1=map(str,new_l1)#リスト要素は文字列にマップされます
new_l2=リスト(セット(l2))+リスト(セット(l3))
res_1='-'.join(new_l1)#シリアル番号のスプライシング
res_2='-'.join(new_l2)#AB端光ケーブル心数接続
res_3=list((res_1,res_2))#リストに変換
lg.append(res_3)
それ以外:
l1=ls[i][0]#ストア番号
l2=ls[i][1]#store AB 終了
l3=ls[i][-1]#storage 光ケーブル心数
res_4=リスト((l1,l2,l3))
lf.append(res_4)
 
 
 
xh=[]#シリアル番号
ab=[]#ab 終了
xs=[]#コア数
kが範囲(len(lf))内にある場合:
l1=lf[k][0]#ストア番号
l2=lf[k][1]#store AB 終了
l3=lf[k][-1]#storage 光ケーブル心数
xh.append(l1)
ab.append(l2)
xs.append(l3)
 
#ペアで再グループ化
xh=[xh[x:x+2]、xは範囲(0,len(xh),2)]
ab=[ab[x:x+2]、xは範囲(0,len(ab),2)]
xs=[xs[x:x+2] x が範囲(0,len(xs),2)]
 
lm=[]
nが範囲(len(xh))内にある場合:
l1=リスト((最小(xh[n]),最大(xh[n])))
new_l1 = マップ(str,l1)
l2 = リスト(セット(xs[n]))
l3=ab[n]+l2
 
res_1='-'.join(new_l1)
res_2='-'.join(l3)
lm.append([res_1,res_2])
 
 
最終リスト=lg+lm
 
#重複の削除
最終l_ls=[]
finall_list内のlの場合:
l が finall_ls にない場合:
finall_ls.append(l)
 
#結果リストに基づいてDataFrameを再作成します
df_3=pd.DataFrame(data=final_ls,columns=['シリアル番号','光ケーブルセクション名(A端-B端)'])
df_3.set_index('シリアル番号',drop=True,inplace=True)#シリアル番号列をインデックスとして設定します
 
 
#JTなしの光ケーブル部分とJTありの加工部分を接続します
cf=pd.concat([df_1,df_3],軸=0)
 
 
'''
インデックスを再度交換しても、交換しなくても問題ありません。いずれにせよ、行番号はシリアル番号 + 2 に基づいています。
'''
 
#pywin32Excel テーブルの読み取り
#Excelプログラムを実行する
試す:
excel_app = win32.gencache.EnsureDispatch('Excel.アプリケーション')
を除外する:
試す:
win32.gencache.EnsureDispatch('et.Application')
を除外する:
win32.gencache.EnsureDispatch('ket.Application')
ついに:
excel_app.Visible = True
excel_app.DisplayAlerts = False
#テーブルの必要な列を読み取ります
ワークブック = excel_app.Workbooks.Open(fp)
ワークシート = workbook.Worksheets('リスト')
ワークシート.列(3).挿入()
ワークシート.列(4).挿入()
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))#色を設定する「光ケーブルセクション名(A端-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
range4_to_color.インテリアカラー =7396243
#range3_to_merge.Font.Color = 25500 # 濃い赤色のテキスト
range1_to_merge.Value=bh#図面番号
range2_to_merge.Value=dl#光ケーブル段落
range1_to_merge.マージ()
range2_to_merge.マージ()
範囲2_to_merge.行.行の高さ=36
range2_to_merge.Columns.ColumnWidth = 34
それ以外:
worksheet.Cells(idx+2,3).値 = idx
ワークシート.セル(idx+2,4).値 = dl
worksheet.Cells(idx+2,4).WrapText = True#行を自動的に折り返す
 
 
#操作を終了してフォームを保存します
ワークブック.Save()
workbook.Close(SaveChanges=False)
excel_app.終了()