import
os, glob, shutil, openpyxl
from
pathlib
import
Path
from
collections
import
defaultdict
from
openpyxl
import
Workbook
from
openpyxl.compat
import
range
from
openpyxl.utils
import
get_column_letter
from
openpyxl.styles
import
Font, Alignment, Border, PatternFill, Side
import
win32api
import
win32com.client as win32
from
datetime
import
datetime
startTime
=
datetime.now()
mainfile
=
'Example.xlsx'
wb
=
openpyxl.load_workbook(mainfile)
ws
=
wb.active
header,
*
data
=
ws.values
groups
=
defaultdict(
lambda
: defaultdict(
list
))
for
row
in
data:
subgroup, group
=
row[
-
1
][:
-
1
] , row[
-
1
][
-
1
]
groups[group][subgroup].append(row)
print
(
f
'Done importing libraries and data in '
+
str
((datetime.now()
-
startTime).total_seconds())
+
' seconds.'
)
for
group, subgroups
in
sorted
(groups.items()):
thick_left
=
Border(left
=
Side(border_style
=
'thick'
, color
=
'000000'
),
top
=
Side(border_style
=
'thick'
, color
=
'000000'
),
bottom
=
Side(border_style
=
'thick'
, color
=
'000000'
))
thick_right
=
Border(right
=
Side(border_style
=
'thick'
, color
=
'000000'
),
top
=
Side(border_style
=
'thick'
, color
=
'000000'
),
bottom
=
Side(border_style
=
'thick'
, color
=
'000000'
))
medium_border
=
Border(left
=
Side(border_style
=
'medium'
, color
=
'000000'
),
right
=
Side(border_style
=
'medium'
, color
=
'000000'
),
top
=
Side(border_style
=
'medium'
, color
=
'000000'
),
bottom
=
Side(border_style
=
'medium'
, color
=
'000000'
))
thin_border
=
Border(left
=
Side(border_style
=
'thin'
, color
=
'000000'
),
right
=
Side(border_style
=
'thin'
, color
=
'000000'
),
top
=
Side(border_style
=
'thin'
, color
=
'000000'
),
bottom
=
Side(border_style
=
'thin'
, color
=
'000000'
))
group_font
=
Font(name
=
'Ariel'
, size
=
14
, color
=
'676DC6'
, bold
=
'yes'
)
data_font
=
Font(name
=
'Ariel'
, size
=
11
)
data_align
=
Alignment(horizontal
=
'center'
, vertical
=
'center'
)
wb
=
Workbook()
wb.remove(wb.active)
wb.create_sheet(
'Effort Counts'
)
ws
=
wb.active
dest_filename
=
(
f
'{mainfile[:-5]} Group {group}.xlsx'
)
ws.column_dimensions[
"B"
].width
=
17
ws.column_dimensions[
"C"
].width
=
17
ws.row_dimensions[
3
].height
=
30
ws[
'B3'
].font
=
Font(name
=
'Ariel'
, size
=
16
, color
=
'F4427D'
, bold
=
'yes'
)
ws[
'B3'
].alignment
=
data_align
ws[
'B3'
].fill
=
PatternFill(start_color
=
'EAFF82'
, end_color
=
'EAFF82'
, fill_type
=
'solid'
)
ws[
'B3'
]
=
(
f
'GROUP {group} COUNTS'
)
ws.merge_cells(
'B3:C3'
)
ws[
'B3'
].border
=
thick_left
ws[
'C3'
].border
=
thick_right
ws.row_dimensions[
5
].height
=
25
ws[
'B5'
].alignment
=
data_align
ws[
'B5'
].font
=
group_font
ws[
'B5'
].border
=
medium_border
ws[
'B5'
]
=
'Group'
ws[
'C5'
].alignment
=
data_align
ws[
'C5'
].font
=
group_font
ws[
'C5'
].border
=
medium_border
ws[
'C5'
]
=
'Records'
count_cell
=
6
for
subgroup, rows
in
sorted
(subgroups.items()):
loopTime
=
datetime.now()
ws
=
wb.create_sheet(title
=
subgroup)
ws.append(header)
for
row
in
rows:
ws.append(row)
count
=
ws.max_row
-
1
wscount
=
wb[
'Effort Counts'
]
wscount.row_dimensions[count_cell].height
=
20
wscount[
'B'
+
str
(count_cell)].alignment
=
data_align
wscount[
'B'
+
str
(count_cell)].border
=
thin_border
wscount[
'B'
+
str
(count_cell)].font
=
data_font
wscount[
'B'
+
str
(count_cell)]
=
subgroup
wscount[
'C'
+
str
(count_cell)].alignment
=
data_align
wscount[
'C'
+
str
(count_cell)].border
=
thin_border
wscount[
'C'
+
str
(count_cell)].font
=
data_font
wscount[
'C'
+
str
(count_cell)]
=
count
count_cell
=
count_cell
+
1
dims
=
{}
for
row
in
ws.rows:
for
cell
in
row:
cell.font
=
Font(name
=
'Ariel Narrow'
, sz
=
10
)
if
cell.value:
dims[cell.column]
=
max
((dims.get(cell.column,
0
),
len
(
str
(cell.value))))
for
col, value
in
dims.items():
if
int
(value) <
10
:
ws.column_dimensions[col].width
=
int
(value
*
1.8
)
elif
int
(value) <
25
:
ws.column_dimensions[col].width
=
int
(value
*
1.4
)
else
:
ws.column_dimensions[col].width
=
int
(value)
wb.save(filename
=
(
f
'{mainfile[:-5]} Group {group}.xlsx'
))
print
(
f
'Done with Group {group} in '
+
str
((datetime.now()
-
loopTime).total_seconds())
+
' seconds.'
)
print
(
f
'Total time to completion '
+
str
((datetime.now()
-
startTime).total_seconds())
+
' seconds.'
)