print('Hello world!'import openpyxl
from openpyxl.styles import Alignment, Border, Font, PatternFill, Side
from openpyxl.utils import get_column_letter
wb = openpyxl.Workbook()
# Stili
font_title = Font(name='Calibri', size=14, bold=True, color='1F4E78')
font_header = Font(name='Calibri', size=11, bold=True, color='FFFFFF')
font_bold = Font(name='Calibri', size=11, bold=True)
fill_header = PatternFill(
start_color='2F5597', end_color='2F5597', fill_type='solid'
)
fill_highlight = PatternFill(
start_color='FFF2CC', end_color='FFF2CC', fill_type='solid'
)
border_thin = Border(
left=Side(style='thin', color='D9D9D9'),
right=Side(style='thin', color='D9D9D9'),
top=Side(style='thin', color='D9D9D9'),
bottom=Side(style='thin', color='D9D9D9'),
)
# FOGLIO 1: Dati iniziali
ws1 = wb.active
ws1.title = 'Dati iniziali'
ws1['A1'] = 'Esercitazione: Metodo Shang (Ford, 1975)'
ws1['A1'].font = font_title
headers1 = [
'Esperto',
'Stima minima (mi)',
'Stima massima (Mi)',
'Punto centrale (C0i)',
'Ampiezza',
]
for col, h in enumerate(headers1, 1):
cell = ws1.cell(row=4, column=col, value=h)
cell.font = font_header
cell.fill = fill_header
cell.alignment = Alignment(horizontal='center', vertical='center')
data = [
(800, 1400),
(900, 1600),
(1000, 1700),
(700, 1300),
(1100, 1800),
(850, 1500),
(950, 1550),
(750, 1250),
(1050, 1750),
(900, 1450),
(1000, 1650),
(800, 1500),
(950, 1800),
(850, 1350),
(1100, 1600),
]
for i, (mi, Mi) in enumerate(data, start=5):
ws1[f'A{i}'] = f'E{i-4}'
ws1[f'B{i}'] = mi
ws1[f'C{i}'] = Mi
ws1[f'D{i}'] = f'=(B{i}+C{i})/2'
ws1[f'E{i}'] = f'=C{i}-B{i}'
for c in ['A', 'B', 'C', 'D', 'E']:
ws1[f'{c}{i}'].border = border_thin
ws1[f'{c}{i}'].alignment = Alignment(horizontal='center')
ws1['A22'] = 'Media dei minimi (m0)'
ws1['B22'] = '=AVERAGE(B5:B19)'
ws1['A23'] = 'Media dei massimi (M0)'
ws1['B23'] = '=AVERAGE(C5:C19)'
ws1['A24'] = 'Punto centrale iniziale (C0)'
ws1['B24'] = '=(B22+B23)/2'
for r in [22, 23, 24]:
ws1[f'A{r}'].font = font_bold
ws1[f'B{r}'].font = font_bold
ws1[f'B{r}'].fill = fill_highlight
# FOGLIO 2: Votazioni Qualitative
ws2 = wb.create_sheet(title='Votazioni Qualitative')
ws2['A1'] = 'Valutazioni Qualitative (Round Successivi)'
ws2['A1'].font = font_title
headers2 = (
['Round']
+ [f'E{i}' for i in range(1, 16)]
+ ['Somma >', 'Esito Maggioranza']
)
for col, h in enumerate(headers2, 1):
cell = ws2.cell(row=4, column=col, value=h)
cell.font = font_header
cell.fill = fill_header
cell.alignment = Alignment(horizontal='center', vertical='center')
r1 = [1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 0, 1, 0, 1]
r2 = [0, 1, 1, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0]
r3 = [1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 0, 1, 0, 1]
for row_idx, (r_name, votes) in enumerate(
[('Round 1', r1), ('Round 2', r2), ('Round 3', r3)], start=5
):
ws2.cell(row=row_idx, column=1, value=r_name)
for col_idx, v in enumerate(votes, start=2):
ws2.cell(row=row_idx, column=col_idx, value=v)
ws2[f'Q{row_idx}'] = f'=SUM(B{row_idx}:P{row_idx})'
ws2[f'R{row_idx}'] = (
f'=IF(Q{row_idx}>7.5, "MAGGIORE (>)", "MINORE (<)")'
)
for c in range(1, 19):
ws2.cell(row=row_idx, column=c).border = border_thin
ws2.cell(row=row_idx, column=c).alignment = Alignment(horizontal='center')
# FOGLIO 3: Round Shang
ws3 = wb.create_sheet(title='Round Shang')
ws3['A1'] = 'Procedura Iterativa Shang'
ws3['A1'].font = font_title
headers3 = [
'Round (j)',
'Limite Inf (mj)',
'Limite Sup (Mj)',
'Punto Proposto (Cj)',
'Esito Votazione',
'Ampiezza (Rj)',
]
for col, h in enumerate(headers3, 1):
cell = ws3.cell(row=4, column=col, value=h)
cell.font = font_header
cell.fill = fill_header
cell.alignment = Alignment(horizontal='center', vertical='center')
ws3['A5'], ws3['B5'], ws3['C5'], ws3['D5'], ws3['E5'], ws3['F5'] = (
0,
"='Dati iniziali'!B22",
"='Dati iniziali'!B23",
'=(B5+C5)/2',
"='Votazioni Qualitative'!R5",
'=C5-B5',
)
ws3['A6'], ws3['B6'], ws3['C6'], ws3['D6'], ws3['E6'], ws3['F6'] = (
1,
"=IF('Votazioni Qualitative'!Q5>7.5, D5, B5)",
"=IF('Votazioni Qualitative'!Q5<=7.5, D5, C5)",
'=(B6+C6)/2',
"='Votazioni Qualitative'!R6",
'=C6-B6',
)
ws3['A7'], ws3['B7'], ws3['C7'], ws3['D7'], ws3['E7'], ws3['F7'] = (
2,
"=IF('Votazioni Qualitative'!Q6>7.5, D6, B6)",
"=IF('Votazioni Qualitative'!Q6<=7.5, D6, C6)",
'=(B7+C7)/2',
"='Votazioni Qualitative'!R7",
'=C7-B7',
)
ws3['A8'], ws3['B8'], ws3['C8'], ws3['D8'], ws3['E8'], ws3['F8'] = (
3,
"=IF('Votazioni Qualitative'!Q7>7.5, D7, B7)",
"=IF('Votazioni Qualitative'!Q7<=7.5, D7, C7)",
'=(B8+C8)/2',
'In corso...',
'=C8-B8',
)
for r in range(5, 9):
for c in ['A', 'B', 'C', 'D', 'E', 'F']:
ws3[f'{c}{r}'].border = border_thin
ws3[f'{c}{r}'].alignment = Alignment(horizontal='center')
ws3[f'D{r}'].fill = fill_highlight
# Autofit colonne
for sheet in wb.worksheets:
for col in sheet.columns:
max_len = max(len(str(cell.value or '')) for cell in col)
col_letter = get_column_letter(col[0].column)
sheet.column_dimensions[col_letter].width = max(max_len + 3, 12)
wb.save('Metodo_Shang_Corretto.xlsx')
print('File creato con successo!')
To embed this project on your website, copy the following code and paste it into your website's HTML: