如何在IBM ILOG CPLEX OPL中用SheetRead读取Excel嵌套数组?
用SheetRead实现分位置球员集合读取的正确方法
1. 修正Mod文件中的声明
首先确保Mod文件里的集合和集合数组声明正确,无需提前初始化,留空待数据文件赋值:
{string} Q = {"GK", "DEF", "MID", "FWD"}; {string} Pq[Q]; # 声明以Q为索引的字符串集合数组
2. 数据文件中的正确SheetRead写法
你之前的写法存在语法错误,AMPL中给集合数组元素赋值必须使用let关键字和:=赋值运算符,正确写法如下:
单个位置赋值(明确单元格范围)
如果每个位置的球员在Excel的固定列范围中,直接指定对应单元格读取:
# 读取GK位置球员(PricePoints工作表A2:A6) let Pq["GK"] := SheetRead(FplGwData, "PricePoints!A2:A6"); # 读取DEF位置球员(PricePoints工作表B2:B8) let Pq["DEF"] := SheetRead(FplGwData, "PricePoints!B2:B8"); # 读取MID位置球员(PricePoints工作表C2:C9) let Pq["MID"] := SheetRead(FplGwData, "PricePoints!C2:C9"); # 读取FWD位置球员(PricePoints工作表D2:D7) let Pq["FWD"] := SheetRead(FplGwData, "PricePoints!D2:D7");
批量循环读取(适配动态列/范围)
如果Excel中每个位置对应一列(列名与Q中的元素一致,或有固定映射),可以用循环批量读取,还能自动识别连续非空单元格:
# 定义位置到Excel列标的映射 param col_map{Q} symbolic; let col_map["GK"] := "A"; let col_map["DEF"] := "B"; let col_map["MID"] := "C"; let col_map["FWD"] := "D"; # 循环读取每个位置的球员集合 for {q in Q} { # 从对应列的第2行开始,自动读取所有连续非空单元格 let Pq[q] := SheetRead(FplGwData, "PricePoints!" & col_map[q] & "2:" & col_map[q]); }
常见错误说明
- 缺少
let关键字:AMPL中给已声明的集合/变量赋值必须通过let语句 - 赋值运算符错误:需使用
:=而非from - 单元格范围错误:确保工作表名、列标、行号与Excel实际内容匹配,注意大小写敏感性(取决于操作系统)
内容的提问来源于stack exchange,提问作者abhinav98
相关产品推荐
相关产品推荐

