在CPLEX Studio中从Excel单元格读取列表遇范围大小错误的技术问询
解决方案:CPLEX SheetRead 数组大小不匹配错误
错误原因
你遇到的错误全称是 Exception from IBM ILOG Concert: excel size of the range is not the same as the array size,核心问题是:
.mod里定义的values是长度为n的数组(int values[items],items=1..n)- 但
.dat里用SheetRead读取的是单个单元格Sheet1!A7,仅返回1个值,和数组需要的n个元素数量不匹配,导致大小冲突。
针对不同数据存储方式的解决方法
情况1:A7单元格是逗号分隔的数值列表(如10,20,30)
如果数值用逗号(或其他分隔符)放在单个单元格里,需要先读取为字符串,再拆分转换为数组:
- 修改
.mod文件,新增字符串变量读取单元格内容,通过脚本拆分赋值:int n=...; range items = 1..n; string values_raw=...; // 读取A7的字符串内容 int values[items]; // 最终的数值数组 execute { // 按逗号拆分字符串,转换为整数数组 var numList = values_raw.split(","); for(var i in items) { // JS数组从0开始,items从1开始,索引需减1,trim去掉多余空格 values[i] = parseInt(numList[i-1].trim()); } } - 修改
.dat文件,将单元格内容读取到字符串变量:n from SheetRead(excelsheet, "Sheet1!A3"); values_raw from SheetRead(excelsheet, "Sheet1!A7");
情况2:数值存储在A7开始的连续单元格区域(如A7、A8、A9...)
如果数值逐个放在A7及下方单元格,需要动态指定读取范围,确保元素数量等于n:
- 修改
.dat文件,拼接动态范围(范围从A7到A7+n-1):
或者在Excel中定义动态命名范围:n from SheetRead(excelsheet, "Sheet1!A3"); values from SheetRead(excelsheet, "Sheet1!A7:A" + (7 + n - 1));- 定义名为
ValuesRange的范围,引用公式=OFFSET(Sheet1!$A$7,0,0,Sheet1!$A$3,1)(基于A3的n值自动扩展范围) - 然后
.dat里直接写:n from SheetRead(excelsheet, "Sheet1!A3"); values from SheetRead(excelsheet, "ValuesRange");
- 定义名为
额外检查点
- 确认A3单元格的
n值与Excel中实际的数值数量完全一致 - 确保Excel文件路径正确,且未被其他程序锁定
内容的提问来源于stack exchange,提问作者Abderrahman Riag
相关产品推荐
相关产品推荐

