from pathlib import Path
import json
from PIL import Image as PILImage
from openpyxl import Workbook, load_workbook
from openpyxl.drawing.image import Image
from openpyxl.styles import Font,PatternFill,Alignment,Border,Side
from openpyxl.worksheet.pagebreak import Break
R=Path(__file__).parent;A=R/'deliverables/assets';rows=json.loads((R/'equipment-rows.json').read_text())
w=Workbook();s=w.active;s.title='图片配置清单';s.sheet_view.showGridLines=False
s.merge_cells('A1:H1');s['A1']='社区营养健康餐厅 · 设备配置清单 V0.6';s['A1'].font=Font(name='微软雅黑',size=20,bold=True,color='E65C1E');s.row_dimensions[1].height=37
s.merge_cells('A2:H2');s['A2']='410固定8台、K20P固定1台；其余数量为建议；机器人选配，方派为小碗菜备选。';s['A2'].font=Font(name='微软雅黑',size=11,color='606773');s.row_dimensions[2].height=26
heads=['序号','设备 / 系统','设备图片','型号 / 口径','数量','单位','配置属性','用途 / 说明']
for j,h in enumerate(heads,1):
 c=s.cell(4,j,h);c.font=Font(name='微软雅黑',size=12,bold=True,color='FFFFFF');c.fill=PatternFill('solid',fgColor='E65C1E');c.alignment=Alignment(horizontal='center',vertical='center')
s.row_dimensions[4].height=28
for n,q in enumerate(rows,5):
 quantity=8 if q[2]=='8台' else 1 if (q[2].startswith('建议1') or q[2]=='1台') else '按需' if q[2]=='按需' else '按人数'
 unit='套' if q[0]=='小程序' else '只' if '手环' in q[0] else '台'
 vals=[n-4,q[0],None,q[1],quantity,unit,q[3],q[4]]
 for j,v in enumerate(vals,1):
  c=s.cell(n,j,v);c.font=Font(name='微软雅黑',size=12,bold=j==2,color='222222');c.alignment=Alignment(vertical='center',horizontal='center' if j in [1,5,6,7] else 'left',wrap_text=True);c.fill=PatternFill('solid',fgColor='FFF7F1' if n%2 else 'FFFFFF');c.border=Border(left=Side(style='thin',color='E5DDD7'),right=Side(style='thin',color='E5DDD7'),top=Side(style='thin',color='E5DDD7'),bottom=Side(style='thin',color='E5DDD7'))
 if q[3]=='选配':s.cell(n,7).font=Font(name='微软雅黑',size=12,bold=True,color='548C4B')
 s.row_dimensions[n].height=84
 im=Image(A/q[5]);k=min(115/im.width,100/im.height);im.width*=k;im.height*=k;s.add_image(im,f'C{n}')
s.merge_cells('A16:H16');s['A16']='产品外观与界面供方案参考，最终配置、软件范围及服务内容以确认方案为准。';s['A16'].font=Font(name='微软雅黑',size=11,color='606773');s['A16'].alignment=Alignment(wrap_text=True);s.row_dimensions[16].height=29
widths={'A':7,'B':25,'C':20,'D':34,'E':12,'F':8,'G':17,'H':36}
for c,v in widths.items():s.column_dimensions[c].width=v
s.freeze_panes='D5';s.auto_filter.ref='A4:H14';s.print_options.horizontalCentered=True;s.page_setup.orientation='landscape';s.page_setup.paperSize=s.PAPERSIZE_A3;s.sheet_properties.pageSetUpPr.fitToPage=True;s.page_setup.fitToWidth=1;s.page_setup.fitToHeight=1;s.print_area='A1:H16';s.page_margins.left=.2;s.page_margins.right=.2;s.page_margins.top=.25;s.page_margins.bottom=.25
out=R/'deliverables/community-equipment-v06.xlsx';w.save(out)
c=load_workbook(out);assert len(c.active._images)==10;assert c.active['B7'].value=='膳识智能台' and c.active['E7'].value==8;assert c.active['G12'].value=='选配';print('xlsx readback: 10 image rows; CPT-N410=8; robot optional; no formulas')
