-
Notifications
You must be signed in to change notification settings - Fork 0
/
excel.py
1987 lines (1863 loc) · 93 KB
/
excel.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
#/bin/python #-*-coding:utf-8-*-
'''
Author: Michael Jin
Date: 2022-04
'''
import xlrd
import xlwt
#import xlutils
from xlutils.copy import copy
import time
import os
import re
from cert import ul_search
from cert import basic_info
from cert import certificate
from cert import filters
import pdfplumber
import random
#import warnings
if os.name=='nt':
import xlwings as xw
def Menu():
choice=input("1.Extract data\n2.Revise the report\nip7.在7.0中自动插入说明书(for GT only)\n4.更新CDR\n5.更新8.0测试总结\n6.提取5.0数据并打印(调试用功能)\nip3.在3.0中插入照片\n8针对SEC4&5自动分页功能tmp\n9对sec4.0进行排序\nsi同步修改item号\n11.Sec3 sort item\n12自动填充5.0\ncc自动核对证书\naml.增加多重列名\n15.增加基本列名\ntc(to client):生成客户用CDR\ncp3(clear pictures sec.3):清除3.0中的图片\ncp7(clear picture sec.7)清除7.0中图片\nmi(ML info):尝试提取ML信息\ncc5:检查CEC的证书")
if choice=='1':
path_rpt=input("Please input the report path:")
path_data=input("Please input the data source path:")
path_rpt=path_rpt.replace('"','')
path_data=path_data.replace('"','')
data_start=int(input("Please input the start line of data:"))
data_end=int(input("Please input the end line of data:"))
col1=input("Please choose four columns of data (1/4):")
col2=input("Please choose four columns of data (2/4):")
col3=input("Please choose four columns of data(3/4):")
col4=input("Please choose four columns of data (4/4):")
col5=input("是否有单独提供证书,如有,请指出证书号所在列")
app=xw.App(visible=True,add_book=False)
app.display_alerts=False #取消警告
app.screen_updating=False#取消屏幕刷新
wb_rpt=app.books.open(path_rpt)
wb_data=app.books.open(path_data)
for sheet in wb_data.sheets:
print(sheet)
if sheet.name=='4.0 Components':
print('find',sheet.name)
sht_data=sheet
break
# print(sht_data.name)
else:
sht_data=wb_data.sheets[0]
data=get_data(sht_data,data_start,data_end,col1,col2,col3,col4,col5)
generate4(wb_rpt.sheets['4.0 Components'],data)
# wb_rpt.save(path_rpt[:-4]+'_output.xls')
wb_rpt.save(path_rpt[:-5]+'_output.xlsm')
wb_rpt.close()
wb_data.close()
app.kill()
elif choice=='2':
# app=xw.App(visible=True,add_book=False)
rpt=input("Please input the report path:") #输入要修改的报告的路径
rpt=rpt.replace('"','')
# rpt=os.path.abspath(rpt)
# rpt_dir=os.path.dirname(rpt)
# filename=os.path.basename(rpt)
# print(rpt_dir)
# print(os.path.basename(rpt))
data=input("Please input the data source path:") #输入数据源的路径
auto_fmt=input('是否需要格式化:')
data=data.replace('"','')
app=xw.App(visible=False,add_book=False)
app.display_alerts=False #取消警告
app.screen_updating=False#取消屏幕刷新
wb=app.books.open(rpt)
sh=wb.sheets['4.0 Components']
sh12=wb.sheets['12.0 Revisions']
wb1=app.books.open(data)
sh1=wb1.sheets['4.0 Components']
start=time.time()
update4(sh,sh1,sh12,auto_fmt)
end=time.time()
print(f'operating time {round(end-start)}s:',)
# wb.save(rpt[:-4]+'_output.xls')
wb.save(rpt[:-5]+'_output.xlsm')
wb.close()
wb1.close()
# app.quit()
app.kill()
elif choice=='ip7':
app=xw.App(visible=False,add_book=False)
app.display_alerts=False #取消警告
app.screen_updating=False#取消屏幕刷新
rpt=input("Please input the report path:") #输入要修改的报告的路径
# rpt=os.path.abspath(rpt)
rpt=rpt.replace('"','')
wb=app.books.open(rpt)
sht7=wb.sheets['7.0 Illustrations']
manual_path=input('输入说明书的路径')
update7(sht7,manual_path)
# wb.save(rpt[:-4]+'_output.xls')
wb.save(rpt[:-5]+'_output.xlsm')
wb.close()
app.kill()
elif choice=='4':
app=xw.App(visible=False,add_book=False)
# app=xw.App(visible=True,add_book=False)
app.display_alerts=False #取消警告
app.screen_updating=False#取消屏幕刷新
rpt=input("输入需要更新的报告路径:") #输入要更新的报告的路径
rpt=rpt.replace('"','')
template=input("输入CDR新模板的路径:") #输入模板的路径
template=template.replace('"','')
wb=app.books.open(rpt)
if template=='':
CDR=input('请选择对应的CDR类型:\n1.普通CDR\n2.CDRMM')
if CDR=='1':
# wb_template=app.books.open(r'D:\Downloads\Tools4Cert-master\template\Certification CDR V5 Form.xls')
wb_template=app.books.open(r'D:\Downloads\Tools4Cert-master\template\Certification CDR V5 Form.xlsm')
elif CDR=='2':
wb_template=app.books.open(r'D:\Downloads\Tools4Cert-master\template\Certification CDRMM V5 Form.xls')
else:
wb_template=app.books.open(template)
update_CDR(wb_template,wb)
# input('pause')#调试用
# wb.save(rpt[:-4]+'_update.xls')#老报告保存是错误的
# wb_template.save(rpt[:-4]+'_update.xls')#新模板的报告才是需要保存的
wb_template.save(rpt[:-5]+'_update.xlsm')
app.kill()
elif choice=='5':
# app=xw.App(visible=False,add_book=False)
app=xw.App(visible=True,add_book=False)
app.display_alerts=False #取消警告
app.screen_updating=False#取消屏幕刷新
rpt=input("输入需要更新的报告路径:") #输入要更新的报告的路径
rpt=rpt.replace('"','')
wb=app.books.open(rpt)
sht8=wb.sheets['8.0 Test Summary']
update8(sht8)
elif choice=='6':
app=xw.App(visible=False,add_book=False)
# app=xw.App(visible=True,add_book=False)
app.display_alerts=False #取消警告
app.screen_updating=False#取消屏幕刷新
rpt=input("输入需要提取的报告路径:") #输入要更新的报告的路径
rpt=rpt.replace('"','')
wb=app.books.open(rpt)
uc_all=get_UC(wb)
for i in uc_all:
print(i)
wb.close()
app.kill()
elif choice=='ip3':
app=xw.App(visible=False,add_book=False)
app.display_alerts=False #取消警告
app.screen_updating=False#取消屏幕刷新
rpt=input("Please input the report path:") #输入要修改的报告的路径
rpt=rpt.replace('"','')
wb=app.books.open(rpt)
sht3=wb.sheets['3.0 Photos']
photo_path=input('输入照片所在路径')
photo_path=photo_path+'\\'
new=input('是否删除原有照片(Y/N)?')
model_description=input('增加型号描述,没有直接回车')
if new.upper()=='Y':
update3(sht3,photo_path,start_row='',model=model_description)
elif new.upper()=='N':
row=input('请输入插入图片所在的行数')
update3(sht3,photo_path,start_row=row,model=model_description)
wb.save(rpt[:-5]+'_output.xlsm')
wb.close()
app.kill()
elif choice=='8':
app=xw.App(visible=False,add_book=False)
app.display_alerts=False #取消警告
app.screen_updating=False#取消屏幕刷新
rpt=input("Please input the report path:") #输入要修改的报告的路径
rpt=rpt.replace('"','')
wb=app.books.open(rpt)
sht4=wb.sheets['4.0 Components']
sht5=wb.sheets['5.0 CEC Comps']
Page_break(sht4)
Page_break(sht5)
# wb.save(rpt[:-4]+'_output.xls')
wb.save(rpt[:-5]+'_output.xlsm')
wb.close()
app.kill()
elif choice=='9':
app=xw.App(visible=False,add_book=False)
app.display_alerts=False #取消警告
app.screen_updating=False#取消屏幕刷新
rpt=input("Please input the report path:") #输入要修改的报告的路径
rpt=rpt.replace('"','')
wb=app.books.open(rpt)
sht4=wb.sheets['4.0 Components']
sort_by_item(sht4)
# wb.save(rpt[:-4]+'_output.xls')
wb.save(rpt[:-5]+'_output.xlsm')
wb.close()
app.kill()
elif choice=='si':
app=xw.App(visible=False,add_book=False)
app.display_alerts=False #取消警告
app.screen_updating=False#取消屏幕刷新
rpt=input("Please input the report path:") #输入要修改的报告的路径
rpt=rpt.replace('"','')
wb=app.books.open(rpt)
sht3=wb.sheets['3.0 Photos']
sht4=wb.sheets['4.0 Components']
line=get_line(sht3)#获取3.0中线的类型
if line==None:
print('并未捕获线的类型')
else:
print('捕捉到线的类型:',line)
sync_item(sht3,sht4,line)
# wb.save(rpt[:-4]+'_output.xls')
wb.save(rpt[:-5]+'_output.xlsm')
wb.close()
app.kill()
elif choice=='11':
app=xw.App(visible=False,add_book=False)
app.display_alerts=False #取消警告
app.screen_updating=False#取消屏幕刷新
rpt=input("Please input the report path:") #输入要修改的报告的路径
rpt=rpt.replace('"','')
wb=app.books.open(rpt)
sht3=wb.sheets['3.0 Photos']
# get_shapes(sht3)
line=get_line(sht3)#获取3.0中线的类型
if line==None:
print('并未捕获线的类型')
else:
print('捕捉到线的类型:',line)
init_item(sht3,line)
# init_item(sht3,'AutoShape')
# wb.save(rpt[:-4]+'_output.xls')
wb.save(rpt[:-5]+'_output.xlsm')
wb.close()
app.kill()
elif choice=='12':
rpt=input("Please input the report path:") #输入要修改的报告的路径
rpt=rpt.replace('"','')
data=input("Please input the data source path:") #输入数据源的路径
data=data.replace('"','')
app=xw.App(visible=True,add_book=False)
app.display_alerts=False #取消警告
app.screen_updating=False#取消屏幕刷新
wb=app.books.open(rpt)
wb_data=app.books.open(data)
sht5_rpt=wb.sheets[4]
for sheet in wb_data.sheets:
print(sheet)
if sheet.name=='5.0 CEC Comps':
sht5_data=sheet
break
else:
sht5_data=wb_data.sheets[0]
fill_CEC(sht5_rpt,sht5_data)
# wb.save(rpt[:-4]+'_output.xls')
wb.save(rpt[:-5]+'_output.xlsm')
wb.close()
wb_data.close()
app.kill()
elif choice=='cc':
rpt=input("Please input the report path:") #输入要检查的报告的路径
rpt=rpt.replace('"','')
app=xw.App(visible=True,add_book=False)
app.display_alerts=False #取消警告
app.screen_updating=False#取消屏幕刷新
wb=app.books.open(rpt)
sht4=wb.sheets['4.0 Components']
check(sht4,'No')
# wb.save(rpt[:-4]+'_output.xls')
wb.save(rpt[:-5]+'_output.xlsm')
wb.close()
app.kill()
elif choice=='cc5':
rpt=input("Please input the report path:") #输入要检查的报告的路径
rpt=rpt.replace('"','')
app=xw.App(visible=True,add_book=False)
app.display_alerts=False #取消警告
app.screen_updating=False#取消屏幕刷新
wb=app.books.open(rpt)
sht5=wb.sheets['5.0 CEC Comps']
check_CEC(sht5,'No')
# wb.save(rpt[:-4]+'_output.xls')
wb.save(rpt[:-5]+'_output.xlsm')
wb.close()
app.kill()
elif choice=='aml':
rpt=input("Please input the report path:") #输入要修改的报告的路径
rpt=rpt.replace('"','')
path=input("Please input the ML application path:") #输入申请表的路径
path=path.replace('"','')
app=xw.App(visible=True,add_book=False)
app.display_alerts=False #取消警告
app.screen_updating=False#取消屏幕刷新
wb=app.books.open(rpt)
sht9=wb.sheets['9.0 MLS']
sht12=wb.sheets['12.0 Revisions']
item=get_ML_item(sht12)
data=get_ML_info(path,'Yes')
print(f'报告中已有多重列名ML{item}',)
modify_ML(sht9,item,data,'A')
# wb.save(rpt[:-4]+'_output.xls')
wb.save(rpt[:-5]+'_output.xlsm')
wb.close()
app.kill()
elif choice=='mi':
path=input("Please input the ML application path:") #输入申请表的路径
path=path.replace('"','')
data=get_ML_info(path,'Yes')
elif choice=='15':
rpt=input("Please input the report path:") #输入要修改的报告的路径
rpt=rpt.replace('"','')
data=input("Please input the data source path:") #输入数据源的路径
data=data.replace('"','')
app=xw.App(visible=False,add_book=False)
app.display_alerts=False #取消警告
app.screen_updating=False#取消屏幕刷新
wb=app.books.open(rpt)
sht2=wb.sheets['2.0 Description']
sht12=wb.sheets['12.0 Revisions']
wb_data=app.books.open(data)
sht_data=wb_data.sheets[0]
add_models(sht2,sht12,sht_data)
wb.save(rpt[:-5]+'_output.xlsm')
wb.close()
wb_data.close()
app.kill()
elif choice=='tc':
app=xw.App(visible=False,add_book=False)
app.display_alerts=False #取消警告
app.screen_updating=False#取消屏幕刷新
rpt=input("Please input the report path:") #输入要修改的报告的路径
rpt=rpt.replace('"','')
wb=app.books.open(rpt)
to_client(wb)
wb.save(rpt[:-5]+'_CDF.xlsm')
wb.close()
app.kill()
elif choice=='cp3':
clear_pics(sht3)
elif choice=='cp7':
clear_pics(sht7)
elif choice=='123':
app=xw.App(visible=True,add_book=False)
app.display_alerts=False #取消警告
app.screen_updating=False#取消屏幕刷新
rpt=input("Please input the report path:") #输入要修改的报告的路径
rpt=rpt.replace('"','')
output_file=output_path(rpt)
wb=app.books.open(rpt)
sht3=wb.sheets['3.0 Photos']
sht4=wb.sheets['4.0 Components']
sht5=wb.sheets['5.0 CEC Comps']
sht7=wb.sheets['7.0 Illustrations']
sht8=wb.sheets['8.0 Test Summary']
sht9=wb.sheets['9.0 MLS']
sht12=wb.sheets['12.0 Revisions']
wb.save(output_file)
while True:
choice=input("1.Extract data\n2.Revise the report\nip7.在7.0中自动插入说明书(for GT only)\n4.更新CDR\n5.更新8.0测试总结\n6.提取5.0数据并打印(调试用功能)\nip3.在3.0中插入照片\n8针对SEC4&5自动分页功能tmp\n9对sec4.0进行排序\nsi同步修改item号\n11.Sec3 sort item\n12自动填充5.0\ncc自动核对证书\naml.增加多重列名\ncp3(clear pictures sec.3):清除3.0中的图片\ncp7(clear picture sec.7)清除7.0中图片\n指令:")
if choice=='1':
path_data=input("Please input the data source path:")
path_data=path_data.replace('"','')
data_start=int(input("Please input the start line of data:"))
data_end=int(input("Please input the end line of data:"))
col1=input("Please choose four columns of data (1/4):")
col2=input("Please choose four columns of data (2/4):")
col3=input("Please choose four columns of data(3/4):")
col4=input("Please choose four columns of data (4/4):")
col5=input("是否有单独提供证书,如有,请指出证书号所在列")
wb_data=app.books.open(path_data)
for sheet in wb_data.sheets:
print(sheet)
if sheet.name=='4.0 Components':
print('find',sheet.name)
sht_data=sheet
break
# print(sht_data)
else:
sht_data=wb_data.sheets[0]
data=get_data(sht_data,data_start,data_end,col1,col2,col3,col4,col5)
generate4(wb.sheets['4.0 Components'],data)
elif choice=='2':
data=input("Please input the data source path:") #输入数据源的路径
data=data.replace('"','')
# app=xw.App(visible=False,add_book=False)#这个好像多余,打开一个进程即可
wb_data=app.books.open(data)
sht4_data=wb_data.sheets['4.0 Components']
start=time.time()
update4(sht4,sht4_data,sht12)
end=time.time()
print('operating time:',end-start)
wb_data.close()#关闭打开的文件
print('已关闭文件:',data)
elif choice=='ip7':
manual_path=input('输入说明书的路径')
update7(sht7,manual_path)
elif choice=='6':
uc_all=get_UC(wb)
for i in uc_all:
print(i)
elif choice=='ip3':
photo_path=input('输入照片所在路径')
photo_path=photo_path+'\\'
new=input('是否删除原有照片(Y/N)?')
model_description=input('增加型号描述,没有直接回车')
if new.upper()=='Y':
update3(sht3,photo_path,start_row='',model=model_description)
elif new.upper()=='N':
row=input('请输入插入图片所在的行数')
update3(sht3,photo_path,start_row=row,model=model_description)
elif choice=='8':
Page_break(sht4)
Page_break(sht5)
elif choice=='9':
sort_by_item(sht4)
elif choice=='si':
line=get_line(sht3)#获取3.0中线的类型
if line==None:
print('并未捕获线的类型')
else:
print('捕捉到线的类型:',line)
sync_item(sht3,sht4,line)
elif choice=='11':
# get_shapes(sht3)
line=get_line(sht3)#获取3.0中线的类型
if line==None:
print('并未捕获线的类型')
else:
print('捕捉到线的类型:',line)
init_item(sht3,line)
elif choice=='12':
data=input("Please input the data source path:") #输入数据源的路径
data=data.replace('"','')
wb_data=app.books.open(data)
for sheet in wb_data.sheets:
print(sheet.name)
if sheet.name=='5.0 CEC Comps':
print('找到sec5.0')
sht5_data=sheet
break
else:
sht5_data=wb_data.sheets[0]
fill_CEC(sht5,sht5_data)
elif choice=='cc':
check(sht4,'No')
elif choice=='cc5':
check_CEC(sht5,'No')
elif choice=='aml':
path=input("Please input the ML application path:") #输入申请表的路径
path=path.replace('"','')
item=get_ML_item(sht12)
data=get_ML_info(path,'Yes')
print(f'报告中已有多重列名ML{item}',)
modify_ML(sht9,item,data,'A')
elif choice=='cp3':
clear_pics(sht3)
elif choice=='cp7':
clear_pics(sht7)
elif choice=='w':#用于把修改好的内容同步保存到原报告
wb.save(rpt.replace('_output',''))
wb.save(output_file)
print('保存时间为:',time.strftime('%Y-%m-%d %H:%M:%S'))
elif choice=='exit' or choice=='q':
wb.close()
app.kill()
break
elif choice=='wq':
wb.save(output_file)
wb.save(rpt.replace('_output',''))
wb.close()
app.kill()
break
elif choice=='r':
wb.close()
app.kill()
print('原报告路径:',rpt)
app=xw.App(visible=True,add_book=False)
app.display_alerts=False #取消警告
app.screen_updating=False#取消屏幕刷新
wb=app.books.open(rpt)
sht3=wb.sheets['3.0 Photos']
sht4=wb.sheets['4.0 Components']
sht5=wb.sheets['5.0 CEC Comps']
sht7=wb.sheets['7.0 Illustrations']
sht8=wb.sheets['8.0 Test Summary']
sht9=wb.sheets['9.0 MLS']
sht12=wb.sheets['12.0 Revisions']
# wb.save(rpt[:-5]+'_output.xlsm')
wb.save(output_file)
input('any key to contine!')
os.system('cls')
def get_data_old(rpt_fn,rpt_start, data_fn,data_start,data_end,data_col1,data_col2,data_col3,data_col4):
rpt_end=rpt_start+(data_end-data_start)
xls_rpt=xlrd.open_workbook(rpt_fn,formatting_info=True)
print(xls_rpt)
xls_data=xlrd.open_workbook(data_fn)
xls_new=copy(xls_rpt)
# xls_new.save('output.xls')
style=xlwt.XFStyle()
font=xlwt.Font()
font.name='Arial'
font.bold=True
font.height=20*10 #10号字体,20为基数
style.font=font
borders=xlwt.Borders()
borders.left=xlwt.Borders.THIN
borders.right=xlwt.Borders.THIN
borders.top=xlwt.Borders.THIN
borders.bottom=xlwt.Borders.THIN
style.borders=borders
alignment=xlwt.Alignment()
alignment.wrap=1
alignment.horz=0x01 #0x01左对齐0x02居中0x03右对齐
alignment.vert=0x01 #0x00上对齐0x01居中x02下对齐
style.alignment=alignment
print(xls_new)
sheet_data=xls_data.sheet_by_name('4.0 Components')
sheet_new=xls_new.get_sheet('4.0 Components')
for i in range(rpt_start,rpt_end):
sheet_new.write(i,2,sheet_data.cell_value(i-(rpt_start-data_start),data_col1).replace(',',', '),style)
# sheet_new.write(i,3,sheet_data.cell_value(i-(rpt_start-data_start),data_col2).replace(',',', ')+'\n('+sheet_data.cell_value(i-(rpt_start-data_start),9)+')',style)
sheet_new.write(i,3,sheet_data.cell_value(i-(rpt_start-data_start),data_col2).replace(',',', '),style)
if isinstance(sheet_data.cell_value(i-(rpt_start-data_start),data_col3),float)!=True:
sheet_new.write(i,4,sheet_data.cell_value(i-(rpt_start-data_start),data_col3).replace(',',', '),style)
else:
sheet_new.write(i,4,sheet_data.cell_value(i-(rpt_start-data_start),data_col3),style)
sheet_new.write(i,5,sheet_data.cell_value(i-(rpt_start-data_start),data_col4).replace(',',', '),style)
xls_new.save('output.xls')
def get_name(filename): #获取名字列表
a=[]
xls=xlrd.open_workbook(filename,formatting_info=True)
sheet=xls.sheet_by_name('4.0 Components')
for i in sheet.col_values(2):
if i not in a:
if i=='Name':
pass
elif i=='':
pass
else:
a.append(i)
return a
def get_manufacturer(filename): #获取制造商列表
a=[]
xls=xlrd.open_workbook(filename,formatting_info=True)
sheet=xls.sheet_by_name('4.0 Components')
for i in sheet.col_values(3):
if i not in a:
if i=='Manufacturer/ trademark2':
pass
else:
a.append(i)
return a
def sort_by_name(filename): #按照名字排序
xls=xlrd.open_workbook(filename,formatting_info=True)
xls_new=copy(xls)
sheet=xls.sheet_by_name('4.0 Components')
sheet_new=xls_new.get_sheet('4.0 Components')
style=xlwt.XFStyle()
font=xlwt.Font()
font.name='Arial'
font.bold=True
font.height=20*10 #10号字体,20为基数
style.font=font
borders=xlwt.Borders()
borders.left=xlwt.Borders.THIN
borders.right=xlwt.Borders.THIN
borders.top=xlwt.Borders.THIN
borders.bottom=xlwt.Borders.THIN
style.borders=borders
alignment=xlwt.Alignment()
alignment.wrap=1
alignment.horz=0x01 #0x01左对齐0x02居中0x03右对齐
alignment.vert=0x01 #0x00上对齐0x01居中x02下对齐
style.alignment=alignment
k=1
for i in get_name(filename):
for j in range(1,360):
if sheet.row_values(j)[2]==i:
sheet_new.write(k,2,sheet.cell_value(j,2),style)
sheet_new.write(k,3,sheet.cell_value(j,3),style)
sheet_new.write(k,4,sheet.cell_value(j,4),style)
sheet_new.write(k,5,sheet.cell_value(j,5),style)
k=k+1
xls_new.save('output.xls')
def sort_by_manufacturer(filename): #按照制造商排序
xls=xlrd.open_workbook(filename,formatting_info=True)
xls_new=copy(xls)
sheet=xls.sheet_by_name('4.0 Components')
sheet_new=xls_new.get_sheet('4.0 Components')
style=xlwt.XFStyle()
font=xlwt.Font()
font.name='Arial'
font.bold=True
font.height=20*10 #10号字体,20为基数
style.font=font
borders=xlwt.Borders()
borders.left=xlwt.Borders.THIN
borders.right=xlwt.Borders.THIN
borders.top=xlwt.Borders.THIN
borders.bottom=xlwt.Borders.THIN
style.borders=borders
alignment=xlwt.Alignment()
alignment.wrap=1
alignment.horz=0x01 #0x01左对齐0x02居中0x03右对齐
alignment.vert=0x01 #0x00上对齐0x01居中x02下对齐
style.alignment=alignment
k=1
for i in get_manufacturer(filename):
for j in range(1,360):
if sheet.row_values(j)[2]==i:
sheet_new.write(k,2,sheet.cell_value(j,2),style)
sheet_new.write(k,3,sheet.cell_value(j,3),style)
sheet_new.write(k,4,sheet.cell_value(j,4),style)
sheet_new.write(k,5,sheet.cell_value(j,5),style)
k=k+1
xls_new.save('output.xls')
def get_data(sheet,row_start,row_end,column1,column2,column3,column4,column5):#xlwings:获取工作簿指定范围内的数据
data=[]
for row in range(row_start,row_end+1):
rows_value=[]
rows_value.append(sheet[f'{column1}{row}'].value)
rows_value.append(sheet[f'{column2}{row}'].value)
rows_value.append(sheet[f'{column3}{row}'].value)
rows_value.append(sheet[f'{column4}{row}'].value)
#检查制造商列是否有黄卡号,如有则进行格式处理
if rows_value[1]!=None:
ul_no=re.search('\w{1,2}\d{5,6}',rows_value[1])
print('制造商列找到黄卡号,正在进行格式处理!')
if ul_no!=None:
rows_value[1]=str_fmt(rows_value[1].replace('('+ul_no.group()+')',''))#删除原有的黄卡号信息
rows_value[1]=rows_value[1].strip().replace('\n','')+'\n('+ul_no.group()+')'#写入新的黄卡号
#以下第5列是可选的,针对单独给出认证号的情形,将认证号提取出来
if column5=='':#没有输入控制号所在列
pass
elif sheet[f'{column5}{row}'].value==None:#控制号所在列是否为空
pass
elif rows_value[1]==None:
pass
else:
result=re.search('\w\d{5,6}',sheet[f'{column5}{row}'].value)
print(result)
if result!=None:
rows_value[1]=rows_value[1]+'\n('+result.group()+')'
data.append(rows_value)
#遍历所有元素,把None的空元素替换掉
for items in data:
for i in range(0,len(items)):
if items[i]==None:
items[i]='Alternative'
return data
def generate4(sheet,data):#xlwings:自动写入数据,主要针对新报告时4.0数据的写入
'''
sheet:报告的SEC4.0
data:需要写入的数据,一般由get_data获取
'''
row=sheet_total_rows(sheet)+1#用sheet_total_rows获取连续数据的最后一行,+1为后一行开始写入数据
for data in data:
print(f'正在第{row}行写入数据')
sheet[f'c{row}:f{row}'].value=list_fmt(data)
sheet[f'c{row}:f{row}'].api.Font.Color=0xFF00FF
insert_blank_line(sheet,row)
row=row+1
# fmt(sheet)
last_row=sheet.used_range.last_cell.row
for col in ['c','d','e','f']:
# index=row_index=get_index(sheet,col)
if col=='c':#a,b,c三列的单元格合并是一致的,一起处理
print(f'正在合并A,B,C列的单元格')
index=get_index(sheet,col)
merge_by_index(sheet,col,index)
merge_by_index(sheet,'a',index)
merge_by_index(sheet,'b',index)
else:#对D,E,F列的单元格进行合并操作
print(f'正在合并{col}列的单元格')
index=get_index(sheet,col)
merge_by_index(sheet,col,index)
print(index)
def get_index(sheet,col):#xlwings:此函数服务于合并单元格,记录指定列非空单元格的行数
rows=[]
last_row=sheet.used_range.last_cell.row
# print(last_row)
for i in range(1,last_row):#在报告的此行数范围内去匹配
if sheet[f'{col}{i}'].value=='Name':#过滤Name这一行
pass
elif sheet[f'{col}{i}'].value=='Manufacturer/ trademark2':#过滤这一行
pass
elif sheet[f'{col}{i}'].value=='Type / model2':#过滤这一行
pass
elif sheet[f'{col}{i}'].value=='Technical data and securement means':#过滤这一行
pass
elif sheet[f'{col}{i}'].value!=None:#指定列是否为空
rows.append(i)#记录对应的行数
rows.append(max(row_max(sheet,'c'),row_max(sheet,'d'),row_max(sheet,'e'),row_max(sheet,'f'))+1)#找到C,D,E,F列中最大的行数,+1是为了匹配merge_by_index函数
return rows
def merge_by_index(sheet,col,index):#xlwings:基于get_index的索引来合并单元格
for i in range(0,len(index)):#遍历每一个索引
if i+1>len(index)-1:#超出索引,则退出
break
elif index[i+1]-index[i]>1:#比较两个索引之间是否大于1,大于1则合并
sheet[f'{col}{index[i]}:{col}{index[i+1]-1}'].merge()
def row_max(sheet,col):#xlwings:获取某一列的最大行数
row=sheet.used_range.last_cell.row#最大行数
while sheet[f'{col}{row}'].value==None:
row=row-1
return row
def copy_line(sheet,row): #xlwings:复制指定行
index=f'B{row}:F{row}' #构造B1:F1字符串索引
data=sheet[index].value #把B1:F1的内容复制给data
row_b=row
row_c=row
row_d=row
row_f=row
while sheet[f'B{row_b}'].value==None: #检查指定行B列(部件名)是否为空,如果为空,向上寻找直到找到非空数值
row_b=row_b-1
while sheet[f'C{row_c}'].value==None: #检查指定行C列(部件名)是否为空,如果为空,向上寻找直到找到非空数值
row_c=row_c-1
while sheet[f'D{row_d}'].value==None: #检查指定行D列(制造商)是否为空,如果为空,向上寻找直到找到非空数值
row_d=row_d-1
while sheet[f'F{row_f}'].value==None: #检查指定行F列(技术参数)是否为空,如果为空,向上寻找直到找到非空数值
row_f=row_f-1
data[0]=sheet[f'B{row_b}'].value #把B列的数值更新下,以防为空
data[1]=sheet[f'C{row_c}'].value #把C列的数值更新下,以防为空
data[2]=sheet[f'D{row_d}'].value #把D列的数值更新下,以防为空
data[4]=sheet[f'F{row_f}'].value #把F列的数值更新下,以防为空
return data
def paste_line(sheet,row,data): #xlwings:指定行粘贴
# row=str(row)
# index='C'+str(row)+':'+'F'+str(row)
index=f'B{row}:F{row}'
sheet[index].value=data
# sheet[index].api.Font.Color=0xFF00FF
# sheet[index].api.Font.Bold=True
# sheet[index].api.Font.Size
# sheet[index].api.Font.Name
def insert_line(sheet,row,data): #xlwings:在指定行后插入空行并写入数据
sheet.api.Rows(str(row+1)).Insert()
paste_line(sheet,str(row+1),data)
def insert_blank_line(sheet,row): #xlwings:在指定行后插入空行
sheet.api.Rows(str(row+1)).Insert()
def insert_blank_lines(sheet,row,numbers): #xlwings:基于insert_blank_line在指定行后插入多个空行
i=1
while i<=numbers:
sheet.api.Rows(str(row+1)).Insert()
i=i+1
def get_row_number(sheet,col,words): #xlwings:查找关键词并返回行数
row_max=sheet.used_range.last_cell.row
for i in range(1,row_max):
cell=sheet[f'{col}{i}'].value
if cell==words:
return i
break
def lookdown(sheet,col,row): #xlwings:继续往下寻找,是否有空值,直到找到下一个非空单元格
while(sheet[f'{col}{row+1}'].value==None and sheet[f'd{row+1}:g{row+1}'].value!=empty(4)): #判断下一行指定列是否为空,并且d到g列不为空,为了防止空行导致出错
# if row+1<=sheet_total_rows(sheet):
row=row+1
# else:
# break
return row
def fmt(sheet):#目前主要是合并name列的单元格
# name=get_col_list(sheet,'c',1,sheet.used_range.last_cell.row) #获取C列的部件名
name=get_col_list(sheet,'b',1,sheet.used_range.last_cell.row) #获取C列的部件名
# print(name)
total=len(name)
count=1
for value in name:
data=[]
data.append(value)
data.append(value)
print(f'合并单元格进度:{count}/{total}-->{value}')
rows=row_range(sheet,data)
# print(rows)
if rows[0]<rows[1]:
sheet[f'a{rows[0]+1}:c{rows[1]}'].value=''
sheet[f'c{rows[0]}:c{rows[1]}'].merge()
sheet[f'b{rows[0]}:b{rows[1]}'].merge()
sheet[f'a{rows[0]}:a{rows[1]}'].merge()
count+=1
def separate(str,symbol): #字符串和分隔符拆分并重组函数,解决分割不当问题
new_str=''
str_list=str.split(symbol) #获取分割的字符串列表
last_index=len(str_list)-1 #字符串列表长度-1,即为最后一个字符串的索引
for i in str_list: #遍历字符串列表
# i=i.replace(' ','') #去除空格
if i!=str_list[last_index]: #判断是否为最后一个字符串
i=i.strip() #去除空格
new_str=new_str+i+symbol+' '
else:
i=i.strip() #去除空格
new_str=new_str+i
return new_str
def str_fmt(string,ptf='No'):
#以下为中文的符号的处理
if ptf=='Yes':
print('输入得数据类型为:',type(string))
if string!=None and isinstance(string,str):
string=string.replace(',',',')#替换中文逗号
string=string.replace('(','(')#替换中文括号
string=string.replace(')',')')#替换中文括号
string=string.replace(':',':')#替换中文冒号
string=string.replace(';',';')#替换中文分号
string=string.replace('、',',')#替换中文顿号
#下面对非整数数字的分隔符做处理
pattern=re.search('\d+,\d+\s?[AWwmm]',string)#匹配诸如13,6W, 12,9 A这类用逗号分割的数字以及对应的单位,数字和单位间可能有空格
if pattern!=None:#如果有匹配到,则进行如下处理
original_value=pattern.group()#提取匹配到的原始内容
fmt_value=original_value.replace(',','.')#把逗号改为小数点
fmt_value=fmt_value.replace(' ','')#去除单位前的空格
string=string.replace(original_value,fmt_value)#将对应内容进行替换
if ',' in string:
string=separate(string,',')
print('正在分割逗号:',string)
if ':' in string:
string=separate(string,':')
print('正在分割冒号:',string)
if ';' in string:
string=separate(string,';')
print('正在分割分号:',string)
return string
else:
return string
def list_fmt(list):
for i in range(1,len(list)):
if isinstance(list[i],str)==True: #只针对字符串进行格式化操作
list[i]=str_fmt(list[i],'No')
return list
def row_range(sheet,data): #xlwings:查找相同name or item的部件的行数范围
rows=[]
# total_row=sheet_total_rows(sheet)+1
total_row=sheet.used_range.last_cell.row#返回最大的行数
for i in range(1,total_row):#在报告的此行数范围内去匹配
# if sheet[f'c{i}'].value==data[1]:#c列中寻找data[1],即Name
if sheet[f'b{i}'].value==data[0]:#b列中寻找data[0],即item
row_start=i #同name的部件的起始行
rows.append(row_start)#找到对应的关键词,记录开始行
row_end=lookdown(sheet,'c',i)
rows.append(row_end)#记录暂定的结束行,如果下方是同一部件,则会被后面的替代,如果不是,这就是最终的行数
# while(sheet[f'c{row_end+1}'].value==data[1]):#查找name的方法
while(sheet[f'b{row_end+1}'].value==data[0]):#查找item的方法
row_end=row_end+1#同name or item的部件的结束行
rows[1]=row_end #找到同样的name or item,更新结束行
if len(rows)==2:
break
return rows
#def row_range(sheet,col,words): #xlwings:查找相同name的部件的行数范围
# rows=[]
# for i in range(1,200):#在报告的此行数范围内去匹配
# if sheet[f'col{i}'].value==words:#c列中寻找关键词
# row_start=i #找到起始行
# rows.append(row_start)#找到对应的关键词,记录开始行
# row_end=lookdown(sheet,col,i)
# rows.append(row_end)#记录暂定的结束行,如果下方是同一部件,则会被后面的替代,如果不是,这就是最终的行数
# while(sheet[f'col{row_end+1}'].value==words):
# row_end=row_end+1#同name的部件的结束行
# rows[1]=row_end #找到同样的部件名,更新结束行
# if len(rows)==2:
# break
# return rows
def update3(sheet,photo_path,start_row='',model=''): #xlwings:在3.0自动插入照片
row_height=12.5 #默认行高12.5pt
last_row=sheet.used_range.last_cell.row #返回最后一行的行号
if start_row=='':
# sheet[f'a3:j{last_row}'].clear_contents()#清除A列相关行数的内容
# sheet[f'a3:j{last_row}'].delete()#删除对应区域的内容,格式保留
sheet[f'a3:j{last_row}'].api.EntireRow.Delete()#删除对应区域的行数
while sheet.pictures.count>0:#当sheet中有图片时,删除图片
sheet.pictures[0].delete()
number=sheet.pictures.count#当前的图片数量
row=5
else:
number=sheet.pictures.count#当前的图片数量
row=int(start_row)
top=row_height*row #12.5pt初始行高,5为行数
for root,dirs,files in os.walk(photo_path,topdown=False):#遍历路径下的文件和文件夹,返回root,dirs,files的三元元组
# files.sort(key=len) #在对文件的长度进行排序
files.sort(key=mysort)#对文件进行排序
for file in files:#遍历所有的文件
filename=file.split('_')[1]
if model=='':
description=filename.split('.')[0]
else:
description=filename.split('.')[0]+f' ({model})'
# print(files)
print(photo_path+file)
sheet.pictures.add(photo_path+file)#插入图片
if sheet.pictures[number].width>sheet.pictures[number].height:
sheet.pictures[number].width=354 #单位为pt,72pt=1inch,即288/72=4inch
else:
sheet.pictures[number].height=288 #单位为pt,72pt=1inch,即288/72=4inch
sheet.pictures[number].top=sheet[f'a1:a{row}'].height #用行数来定位
sheet.pictures[number].left=50.5 #单元格默认列宽50.5
sheet[f'a{row-2}'].value=f'Photo {number+1} - {description}' #插入文字描述
sheet[f'a{row-2}'].characters[:9].font.bold=True #部分字体加粗
row=row+28 #56行一页,28行一半中间位置
number=number+1
def update4(sheet1,sheet2,sheet3,auto_fmt='Yes'):#xlwings:更新4.0信息
'''
sheet1为报告的sec4.0
sheet2为数据报告的sec4.0
sheet3为报告的sec12.0
auto_fmt(str):是否要格式处理Yes/No
'''
row_rev=sheet_total_rows(sheet3)+1#SEC12的行数,这里不能用used_range来代替,因为used_range会把空行包含进去,包括格式的改变
# print(sheet2.used_range.last_cell.row)
for i in range(1,sheet2.used_range.last_cell.row+1): #在此行数范围内去匹配需要修改的信息,+1是因为range函数
print('-'*10+f'正在处理第{i}行'+'-'*10)
if sheet2[f'h{i}'].value=="A": #判断H列是否为A,A为新增
data=copy_line(sheet2,i)#复制对应行的数据
print('add:',data)
# for j in range(1,sheet_total_rows(sheet1)+1):#在报告的此行数范围内去匹配
for j in range(1,sheet1.used_range.last_cell.row):#在报告的此行数范围内去匹配
if sheet1[f'c{j}'].value==data[1]:#c列中寻找data[1],即Name
# if sheet1[f'c{j}'].value.strip()==data[1].strip():#c列中寻找data[1],即Name
row=lookdown(sheet1,'c',j)
while(sheet1[f'c{row+1}'].value==data[1]):#下一个如果Name相同(即同一个部件),则继续向下
row=row+1
print(row)
break
insert_line(sheet1,row,list_fmt(data)) #在该行后面插入数据
sheet1[f'a{row+1}:f{row+1}'].font.color=0xFF00FF#插入数据后修改字体颜色,这里用row不用j,row才是实际的行数
data_rpt=data
update12(sheet3,row_rev,data_rpt,data,'A')
# insert_line(sheet3,row_rev,update12(data_rpt,data,'A'))
# sheet3[f'e{row_rev}'].value=update12(data_rpt,data,'A')
row_rev=row_rev+1
elif sheet2[f'h{i}'].value=="RF": #判断H列是否为RF,RF为修改技术参数
data=copy_line(sheet2,i)#复制对应行的数据
print('revise:',data)
# rows=row_range(sheet1,'c',data[1]) #返回对应部件相应的行数范围
rows=row_range(sheet1,data) #返回对应部件相应的行数范围
print(rows)
for j in range(rows[0],rows[1]+1):#在同一个部件的行数范围内去匹配信息
data_rpt=copy_line(sheet1,j)
if data_rpt[2].upper()==data[2].upper() and str(data_rpt[3]).upper()==str(data[3]).upper(): #匹配制造商与型号,当一致时,进行后面的操作
data=list_fmt(data)
paste_line(sheet1,j,data) #修改技术参数(technical data), 用了整行复制的方法,但是其实只是修改技术参数那一列,因为部件名称,制造商,型号都是一致的
sheet1[f'f{j}'].font.color=0xFF00FF#插入数据后修改字体颜色
print('revisie technical data from',data_rpt[4],'to',data[4])
update12(sheet3,row_rev,data_rpt,data,'RF')
row_rev=row_rev+1
elif sheet2[f'h{i}'].value=="RE": #判断H列是否为RE,RE为修改型号
data=copy_line(sheet2,i)#复制对应行的数据
# print('revise:',data)
# rows=row_range(sheet1,'c',data[1]) #返回对应部件相应的行数范围
rows=row_range(sheet1,data) #返回对应部件相应的行数范围
print(rows)