Повторное чтение из Excel из одного файла Excel, но с разных листов - PullRequest
0 голосов
/ 24 октября 2018

Я хочу решить проблему для другой итерации, и мне нужно для каждой итерации прочитать данные из листа в одном и том же файле Excel, как я хочу решить мою модель, скажем, для 4 раз / итерация с каждым разомразные данные читаются из Excel на 4 разных листах / итерация.Есть ли какой-нибудь хитрый код, который я могу реализовать в своем основном блоге, чтобы сначала добавить эти данные и решить проблему?

Ответы [ 2 ]

0 голосов
/ 27 октября 2018

Кажется, что моя модель работает без каких-либо ошибок, но не дает мне результатов, потому что я думаю, что передача данных осуществляется не так, как вы, я не могу использовать кортежи, потому что моя модель использует массивы.

это то, что я добавляю в свою модель. Mod

    `string readP=...;
    string readM=...;
    string readI=...;
    string readH=...;

    string readXmih=...;
    string readQpih=...;
    string readJmax=...;

    string readDmax=...;
    string readDpm=...;
                   `  

я добавляю это в основную модель

for (var sheet in thisOplModel.sheets) 

            {                            
        var data0=new IloOplDataElements();
        var data1=new IloOplDataElements();
        var data2=new IloOplDataElements();
        var data3=new IloOplDataElements();
        var data4=new IloOplDataElements();
        var data5=new IloOplDataElements();
        var data6=new IloOplDataElements();
        var data7=new IloOplDataElements();
        var data8=new IloOplDataElements();

    data0.readP=sheet+"!B9";
    data1.readM=sheet+"!B10";
    data2.readI=sheet+"!B11";
    data3.readH=sheet+"!B12";
    data4.readXmih=sheet+"!N3:BE12";
    data5.readQpih=sheet+"!N19:BE30";
    data6.readDpm=sheet+"!B18:K29";
    data7.readJmax=sheet+"!E2:E13";
    data8.readDmax=sheet+"!E31";

         var Opl = new IloOplModel(def,cplex);

     Opl.addDataSource(data0);
     Opl.addDataSource(data1);                  
     Opl.addDataSource(data2);                 
     Opl.addDataSource(data3);                  
     Opl.addDataSource(data4);                 
     Opl.addDataSource(data5);                 
     Opl.addDataSource(data6);                  
     Opl.addDataSource(data7);                  
     Opl.addDataSource(data8);               
     Opl.addDataSource(data);

и .dat

SheetConnection my_sheet ("E2.xlsx");

p from SheetRead(my_sheet,readP);
m from SheetRead(my_sheet,readM);
h from SheetRead(my_sheet,readH);
i from SheetRead(my_sheet,readI);
X from SheetRead(my_sheet,readXmih);
Jpmax from SheetRead (my_sheet,readJmax);
Dpm from SheetRead (my_sheet,readDpm);
Dmax from SheetRead (my_sheet,readDmax);
Q from SheetRead (my_sheet,readQpih);

я должен сделать то же самое, что и здесь, но для моих массивов, а не для кортежей, как я могу это сделать

tuple param
{
int nbKids;
}

{param} params=...;

assert card(params)==1;

int nbKids=first(params).nbKids;

Я очень ценю вашу помощь!

С уважением

0 голосов
/ 24 октября 2018

Предположим, у вас есть таблица Excel с 3 вкладками для 3 вариантов для количества детей

enter image description here

Затем, чтобы сделать цикл для этих 3параметры:

Сначала вы пишете

zooexcelmultisheet.mod

string paramsread=...;

tuple param
{
int nbKids;
}

{param} params=...;

assert card(params)==1;

int nbKids=first(params).nbKids;

// a tuple is like a struct in C, a class in C++ or a record in Pascal
tuple bus
{
key int nbSeats;
float cost;
}

// This is a tuple set
{bus} buses=...;

// asserts help make sure data is fine
assert forall(b in buses) b.nbSeats>0;
assert forall(b in buses) b.cost>0;

// decision variable array
dvar int+ nbBus[buses];

// objective
minimize 
 sum(b in buses) b.cost*nbBus[b];

// constraints 
subject to
{
 sum(b in buses) b.nbSeats*nbBus[b]>=nbKids;
}

tuple result
{
   key int nbSeats;
   int nbBuses;
}

{result} results={<b.nbSeats,nbBus[b]> | b in buses};

execute
{
writeln(results);
writeln("cost = ",cplex.getObjValue());
}

, а затем zooexcelmultisheet.dat

SheetConnection s("zoomultisheet.xlsx");

//paramsread="params1!A2";
params from SheetRead(s,paramsread);
buses from SheetRead(s,"buses!A2:B3");*

, а затем выполняете то, что вы выполняетевыполните цикл для всех 3 вариантов:

{string} sheets={"params1","params2","params3"};


main { 
  var source = new IloOplModelSource("zooexcelmultisheet.mod");
  var cplex = new IloCplex();
  var def = new IloOplModelDefinition(source);
  var data = new IloOplDataSource("zooexcelmultisheet.dat");

  for(var sheet in thisOplModel.sheets)
  {
  var data0=new IloOplDataElements();
  data0.paramsread=sheet+"!A2"; 
  var opl = new IloOplModel(def,cplex);
  opl.addDataSource(data0);
  opl.addDataSource(data);
  opl.generate();
  if (cplex.solve()) {

     opl.postProcess();
  } else {
     writeln("No solution");
  }


  opl.end();
}  
  data.end(); 
  def.end(); 
  cplex.end(); 
  source.end(); 
}

, и вы получите

{<40 6> <30 2>}
cost = 3800
 {<40 7> <30 1>}
cost = 3900
 {<40 8> <30 0>}
cost = 4000

привет

...