业闲有志,欲学Python。本无所用,忽遇xlwings:
据言极速,乃动心诚。月余有感,遂做“工程”。
代码拙劣,逻辑半通。终于调好,总算运行。
只是太慢,未知所能。六十个表,十几分钟。
如此效率,白废时功。谁有高招,请启愚蒙!
贴上代码,以鉴众生。
[Python] 纯文本查看 复制代码 import xlwings as xw
import pandas as pd
import os;import re
from dateutil import parser
app=xw.App(visible=False,add_book=False)
file_path=r'D:\MyData\MyDesk\Test0930'
file_lists=os.listdir(file_path)
valjts=[];valqbbs=[];jt=[];qbb=[];jtdt=[];qbbdt=[]
for f in file_lists:
if not (f.endswith('.xls') or f.endswith('.xlsx')): # 这个是对的!没有最外层“()”不行!!
continue
if f.startswith('~$'):
continue
wb=app.books.open(file_path+'/'+f)
ws=wb.sheets[0]
if ws['a2'].value == '序号':
jtdt=[''.join(re.findall('(\d*)',f))[4:]]
valjt0 = ws['a4:m436'].options(pd.DataFrame, index=False, header=1).value
valjt1 = list(valjt0[valjt0['维护部门'] == '唐山所'].iloc[:, 2]) # 列名有重名所以用iloc
valjts.append(jtdt+valjt1) # 不能用“+”。“+”形成的是一维列表
jt=ws['b5:b239'].value
else:
if ws['r15'].value == None:
ws['r15'].value='唐山'
qbbdt=[''.join(re.findall('(\d*)',f))[4:]]
valqbb0 = ws['a1'].options(pd.DataFrame, index=False, header=1, expand='table').value
valqbb1 = list(valqbb0[valqbb0['所属管理所'] == '唐山']['运行情况'])
valqbbs.append(qbbdt+valqbb1)
qbb=ws['c2:c32'].value
wb.save()
wb.close()
valjts.sort(key=lambda x:parser.parse(x[0]))
valqbbs.sort(key=lambda x:parser.parse(x[0]))
nwb=app.books.add()
nws1=nwb.sheets.add('镜头一览表')
nws1['a3'].options(transpose=True).value=jt
nws1['b2'].options(transpose=True).value=valjts
nws2=nwb.sheets.add('情报板一览表')
nws2['a3'].options(transpose=True).value=qbb
nws2['b2'].options(transpose=True).value=valqbbs
for nws in nwb.sheets:
rngs=nws['a2'].expand() # “扩展”时,参考单元格本身可以是空格,但其周围不能有空格,遇空格即停止。
for rng in rngs:
if rng.value == '正常':
rng.color=(37,100,139)
rng.api.Font.ColorIndex=2 # 1黑,2白,3红,4绿,5蓝,6黄
rng.api.Font.Bold=True
for b in range(7,12): # 用for循环处理这个真是又慢又low——7891011分别代表上下左右等
rng.api.Borders(b).LineStyle = 1
rng.api.Borders(b).Weight = 2
nwb.save(r'D:\MyData\MyDesk\Test0930.xlsx')
nwb.close()
app.quit()
|