如何使用循环从 GAMS 中的多个 excel 工作表导入数据?

How to import data from multiple excel sheets in GAMS using loops?

我想导入存储在 k excel 张中的三维参数 p(i,j,k) 的数据,但 GAMS 不允许我在循环中使用美元控制语句。有什么办法可以使用循环或其他流程控制语句(如 'for' 或 'while'?

我需要做这样的事情,但这似乎是不可能的:

loop(k,
$call gdxxrw Data.xlsx par=temp rng=k!A1:Z20 rdim=1 cdim=1
$gdxin Data.gdx
$load temp
$gdxin
p(i,j,k)=temp(i,j);
);

假设每个 sheet 看起来像:

(唯一的区别是我在 sheet2 中使用 2 而在 sheet3 中使用 3)。

要阅读这篇文章,请执行以下操作:

$set xls  d:\tmp\test2.xlsx
$set gdx  s.gdx

set
  i /i1*i3/
  j /j1*j5/
  k 'sheet names' /Sheet1*Sheet3/
;

parameter
  s(i,j)  'single sheet'
  a(i,j,k)  'all data'
;

file f /task.txt/;
loop(k,
  putclose f,'par=s rng=',k.tl:0,'!a1 rdim=1 cdim=1'/
  execute 'gdxxrw i=%xls% o=%gdx%  @task.txt trace=2';
  execute_loaddc '%gdx%',s;
  a(i,j,k) = s(i,j);
);

display a;

我的结果是:

----     23 PARAMETER a  all data

           sheet1      sheet2      sheet3

i1.j1       1.000       2.000       3.000
i1.j2       1.000       2.000       3.000
i1.j3       1.000       2.000       3.000
i1.j4       1.000       2.000       3.000
i1.j5       1.000       2.000       3.000
i2.j1       1.000       2.000       3.000
i2.j2       1.000       2.000       3.000
i2.j3       1.000       2.000       3.000
i2.j4       1.000       2.000       3.000
i2.j5       1.000       2.000       3.000
i3.j1       1.000       2.000       3.000
i3.j2       1.000       2.000       3.000
i3.j3       1.000       2.000       3.000
i3.j4       1.000       2.000       3.000
i3.j5       1.000       2.000       3.000