Как импортировать данные из нескольких листов excel в ГАМАХ с помощью циклов?

Я хочу импортировать данные для трехмерного параметра p (i,j,k), который хранится в k листах excel, но ГАМС не позволяет мне использовать операторы управления долларом в циклах. Есть ли способ сделать это с помощью циклов или других операторов управления потоком, таких как » 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 ответ

  1. Предположим, что каждый лист выглядит следующим образом:

    Введите описание изображения здесь

    (единственная разница заключается в том, что я использую 2 в sheet2 и 3 в sheet3).

    Чтобы прочитать это сделать:

    $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