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

时间:2016-05-27 04:46:50

标签: excel loops mathematical-optimization gams-math

我想导入存储在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);
);

1 个答案:

答案 0 :(得分:0)

假设每张纸看起来像:

enter image description here

(唯一不同的是我在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