13832811375 发表于 2020-10-7 21:14

怎么精简和优化呢?这个小破程序运行一次五分钟不够

史上最土最笨最丑的程序出来了!全是for循环和if判断,全是读写磁盘操作,哈哈哈哈,不过,总算解决了工作中的一个实际问题。希望大神们能提供优化和精简思路,资料在毒盘里

import xlwings as xw
file=r'D:\MyData\MyDesk\Test1005.xlsx'
app=xw.App(visible=False,add_book=False)
wb=app.books.open(file)
nwb=app.books.add()
nws1 = nwb.sheets.add('情报板完好率')
nws2 = nwb.sheets.add('镜头完好率')
for ws in wb.sheets:
    for i in range(2,ws['a2'].expand('down').shape+1):
      qrows = nws1['a1'].expand().shape-1
      jrows = nws2['a1'].expand().shape-1
      cn = []
      if ws.name == '情报板':
            rng = ws['b' + str(i)].expand('right')
            cns = .value != rng.value]
            if ((len(cns) == 0) and (rng.value == '正常')):
                continue
            if ((len(cns) == 0) and (rng[-1].value != '正常')):
                nws1.range(i, 1).value = ws.range(i, 1).value
                nws1.range(i, 2).value = ws.range(1, 1).value
                nws1.range(i, 3).value = ws.range(1, 2).value
                nws1.range(i, 4).value = ws.range(1, 32).value
            cns =
            if rng.value == "正常":
                for j in range(0, len(cns), 2):
                  if len(cns) % 2 == 0:
                        cn.append(, cns])
                  else:
                        cns = cns +
                        cn.append(, cns])
                for k in range(len(cn)):
                  nws1.range(2+k+qrows,1).value = ws.range(i,1).value
                  nws1.range(2+k+qrows,2).value = ws.range(1,cn).value
                  nws1.range(2+k+qrows,3).value = ws.range(1,cn).value
                  nws1.range(2+k+qrows,4).value = ws.range(1,cn).value
            else:
                for j in range(0, len(cns), 2):
                  if len(cns) % 2 == 0:
                        cn.append(, cns])
                  else:
                        cns = +cns
                        cn.append(, cns])
                for k in range(len(cn)):
                  nws1.range(2+k+qrows,1).value=ws.range(i,1).value
                  nws1.range(2+k+qrows,2).value=ws.range(1,cn).value
                  nws1.range(2+k+qrows,3).value=ws.range(1,cn).value
                  nws1.range(2+k+qrows,4).value=ws.range(1,cn).value
      if ws.name == '镜头':
            rng = ws['b' + str(i)].expand('right')
            cns = .value != rng.value]
            if ((len(cns) == 0) and (rng.value == '正常')):
                continue
            if ((len(cns) == 0) and (rng[-1].value != '正常')):
                nws2.range(i, 1).value = ws.range(i, 1).value
                nws2.range(i, 2).value = ws.range(1, 1).value
                nws2.range(i, 3).value = ws.range(1, 2).value
                nws2.range(i, 4).value = ws.range(1, 32).value
            cns =
            if rng.value == "正常":
                for j in range(0, len(cns), 2):
                  if len(cns) % 2 == 0:
                        cn.append(, cns])
                  else:
                        cns = cns +
                        cn.append(, cns])
                for k in range(len(cn)):
                  nws2.range(2 + k + jrows, 1).value = ws.range(i, 1).value
                  nws2.range(2 + k + jrows, 2).value = ws.range(1, cn).value
                  nws2.range(2 + k + jrows, 3).value = ws.range(1, cn).value
                  nws2.range(2 + k + jrows, 4).value = ws.range(1, cn).value
            else:
                for j in range(0, len(cns), 2):
                  if len(cns) % 2 == 0:
                        cn.append(, cns])
                  else:
                        cns = + cns
                        cn.append(, cns])
                for k in range(len(cn)):
                  nws2.range(2 + k + jrows, 1).value = ws.range(i, 1).value
                  nws2.range(2 + k + jrows, 2).value = ws.range(1, cn).value
                  nws2.range(2 + k + jrows, 3).value = ws.range(1, cn).value
                  nws2.range(2 + k + jrows, 4).value = ws.range(1, cn).value
nwb.save(r'D:\MyData\MyDesk\Test1006.xlsx')
wb.close()
nwb.close()
app.quit()

https://pan.baidu.com/s/1rP5uxp6UDWjRksPo1tEvTQ
提取码:jijo

全月60+个Excel表格,每个表600个设备,先是整理汇总到一个表里,然后提取“故障”日期和修复日期,并计算差值。

oldy 发表于 2020-10-7 22:15

本帖最后由 oldy 于 2020-10-8 11:29 编辑

同问: “最多就是改成函数式编程,减少代码复用,不过可读性就变差了。”脑细胞不够用啊,支持一下{:1_921:}

0衰衰0 发表于 2020-10-7 22:31

和我最开始写代码一样,for循环套娃,一层套一层哈哈哈

沉默之剑 发表于 2020-10-7 23:14

就这?还需要怎样简化?我觉得就这样挺好的。最多就是改成函数式编程,减少代码复用,不过可读性就变差了。

Menguy 发表于 2020-10-7 23:55

13832811375 发表于 2020-10-8 05:38

沉默之剑 发表于 2020-10-7 23:14
就这?还需要怎样简化?我觉得就这样挺好的。最多就是改成函数式编程,减少代码复用,不过可读性就变差了。

啥叫“函数式编程”?

13832811375 发表于 2020-10-8 05:40

Menguy 发表于 2020-10-7 23:55
可以尝试使用多进程或者多线程,做成自定义函数,一个线程处理一个文件或者一个线程处理一组数据

说说怎么弄多线程或者多进程啊?没学过。自定义函数倒是知道,可不会用。

天黑我隐身 发表于 2020-10-8 13:50

我寻思也没找着Test1005.xlsx啊,我看你是拿vba为难macos

ymhld 发表于 2020-10-8 19:52

用openpyxl

13832811375 发表于 2020-10-8 21:52

天黑我隐身 发表于 2020-10-8 13:50
我寻思也没找着Test1005.xlsx啊,我看你是拿vba为难macos

我忘了把数据文件放里面了,光把原始文件放里面了{:1_909:}
页: [1] 2
查看完整版本: 怎么精简和优化呢?这个小破程序运行一次五分钟不够