// модуль предназначен для приема информации из Excel  с листа №_2      
//        на основе sta_701
//вызов:  "Ф-ция для приема из файла"_:  user\kbm_tab1,ReadExl,0
//                                    
//char nt1[4], nt2[4], nt3[4], nt4[4], nt5[4], nt6[4];

string cel[43];
char str_01[99], str_02[99], str_03[99];
char str_11[99], str_12[99];

//  ПРИМЕР использов. cel[xx] 
// bb1++;     sprintf(Title01,"%s",static_cast_to_string(cel[bb1]));
// sprintf(nnn,"%s%s",Title01,static_cast_to_string(bb5));
// if(bb2 != 0)  tWriteStringToCell(nnn,OemToAnsi(bb2));




int idxTN  =0,  // табельный номер
    idxORD =1,  // порядк номер
    idxDD  =2,  // 

    idxFIO  =3,  // 

    idxD1  =4,
    idxD2  =5,
    idxD3  =6,
    idxD4  =7,
    idxD5  =8,
    idxD6  =9,
    idxD7  =10,
    idxD8  =11,
    idxD9  =12,
    idxD10  =13,
    idxD11  =14,
    idxD12  =15,
    idxD13  =16,
    idxD14  =17,
    idxD15  =18,
    idxD16  =19,
    idxD17  =20,
    idxD18  =21,
    idxD19  =22,
    idxD20  =23,
    idxD21  =24,
    idxD22  =25,
    idxD23  =26,
    idxD24  =27,
    idxD25  =28,
    idxD26  =29,
    idxD27  =30,
    idxD28  =31,
    idxD29  =32,
    idxD30  =33,
    idxD31  =34,
    idxVsRV =35,

    CntIdx =36;

int fld[CntIdx];

int len=256;
char str[len];


var CTabl   = CreateObject("CurPrnTbl");

int CountTabl = 0;


ReadExl( AdrCTabl,     // адрес передаваемой таблицы
       AdrCListTabl, // адрес списка таблиц
       RcrInList      // номер записи в списке таблиц
     )
{
  CTabl.Initial(AdrCTabl);    // текущая таблица
  CTabl.Clear();              // очистка таблицы

  //int cnt=CTabl.Count_Rcr(); // полное число записей   

  cel[1]="D";
  cel[2]="E";
  cel[3]="F";
  cel[4]="G";
  cel[5]="H";
  cel[6]="I";
  cel[7]="J";
  cel[8]="K";
  cel[9]="L";
  cel[10]="M";
  cel[11]="N";
  cel[12]="O";
  cel[13]="P";
  cel[14]="Q";
  cel[15]="R";
//cel[16]="S";
  cel[16]="T";
  cel[17]="U";
  cel[18]="V";
  cel[19]="W";
  cel[20]="X";
  cel[21]="Y";
  cel[22]="Z";
  cel[23]="AA";
  cel[24]="AB";
  cel[25]="AC";
  cel[26]="AD";
  cel[27]="AE";
  cel[28]="AF";
  cel[29]="AG";
  cel[30]="AH";
  cel[31]="AI";
//cel[30]="AJ";
//cel[31]="AK";

  cel[32]="AL";
  cel[33]="AM";
  cel[34]="AN";
  cel[35]="AO";
  cel[36]="AP";
  cel[37]="AQ";
  cel[38]="AR";
  cel[39]="AS";
  cel[40]="AT";
  cel[41]="AU";


  var xls=CreateObject("Excel.Application");  // создаем объект Excel.Application, т.е. запускаем Excel, если он установлен конечно
  char Dir[len];                              // строка для текущей директории
  GetCurrentDirectory(len,Dir);               // получаем текущую директорию (это корень каталога ZPL из которого запустили АМБу)
  string nm="tab.xls";
  var WorkDir ="C:\\A\\";

  xls.Workbooks.Add(WorkDir+nm);              // открываем в Excel'е наш файл prim15.xls

  string name=xls.Workbooks.Item(1).Name;              // читаем имя workbook'а, чтобы обращатья потом к нему по имени
  var wsh=xls.Workbooks.Item(name).Worksheets.Item(2); // создаем ссылку на на наш worksheet чтобы избежать впоследствии длинных записей

  FillFld();

  int nPor=0, NumStr=0, IndEnd=0;
  int list=0;

  for ( long rcr=15; IndEnd < 999; ++rcr)    //цикл по строкам по таб ном
   {
    char cell_A[9]; 
                     sprintf(cell_A,"A%d",rcr);
    char cell_B[9];
                     sprintf(cell_B,"B%d",rcr);
    char cell_C[9];
                     sprintf(cell_C,"C%d",rcr);  // 

    string ord =Vdos( xls.Workbooks.Item(1).Worksheets.Item(2).Range(static_cast_to_string(cell_A)).Value);
    FreeSpaceString(ord,3,"");
    string tab =Vdos( xls.Workbooks.Item(1).Worksheets.Item(2).Range(static_cast_to_string(cell_C)).Value);
    FreeSpaceString(tab,3,"");

    if((atoi(ord) > 0) && ( atoi(ord) != 999 ))    //если №пор то обрабатываем
     {
       string fio =Vdos( xls.Workbooks.Item(1).Worksheets.Item(2).Range(static_cast_to_string(cell_B)).Value);
       FreeSpaceString(fio,3,"");

       int CurRcr = CTabl.Count_Rcr()-1;
       CTabl.Add_Rcr(CurRcr,1);         
       CTabl.SText(fld[idxORD],CurRcr,static_cast_to_string(ord));
       CTabl.SText(fld[idxTN],CurRcr,static_cast_to_string(tab));
       CTabl.SText(fld[idxFIO],CurRcr,static_cast_to_string(fio));       

       double VsegoRV = 0;
       char den_tb[250];

       for ( int den=1; den <= 15; den++)   //цикл по дням
        {
          sprintf(den_tb,"t%d",den);
          FreeSpaceString(den_tb,3,"");

          // координаты ячейки с данными
          sprintf(str_11,"%s",static_cast_to_string(cel[den]));  //столбец 
          FreeSpaceString(str_11,3,"");                        
          sprintf(str_12,"%s%s",str_11,static_cast_to_string(rcr+1));   //строка 
          FreeSpaceString(str_12,3,"");

          // читаем данные
          string dan = xls.Workbooks.Item(1).Worksheets.Item(2).Range(static_cast_to_string(str_12)).Value;
          FreeSpaceString(dan,3,"");

          // пишем данные в таблицу
          double rv = atof(dan);
          VsegoRV += rv;
          //CTabl.STextS(den,CurRcr,static_cast_to_string(rv));
          if (den == 1) CTabl.STextS("t1",CurRcr,static_cast_to_string(rv));
          if (den == 2) CTabl.STextS("t2",CurRcr,static_cast_to_string(rv));
          if (den == 3) CTabl.STextS("t3",CurRcr,static_cast_to_string(rv));
          if (den == 4) CTabl.STextS("t4",CurRcr,static_cast_to_string(rv));
          if (den == 5) CTabl.STextS("t5",CurRcr,static_cast_to_string(rv));
          if (den == 6) CTabl.STextS("t6",CurRcr,static_cast_to_string(rv));
          if (den == 7) CTabl.STextS("t7",CurRcr,static_cast_to_string(rv));
          if (den == 8) CTabl.STextS("t8",CurRcr,static_cast_to_string(rv));
          if (den == 9) CTabl.STextS("t9",CurRcr,static_cast_to_string(rv));
          if (den == 10) CTabl.STextS("t10",CurRcr,static_cast_to_string(rv));
          if (den == 11) CTabl.STextS("t11",CurRcr,static_cast_to_string(rv));
          if (den == 12) CTabl.STextS("t12",CurRcr,static_cast_to_string(rv));
          if (den == 13) CTabl.STextS("t13",CurRcr,static_cast_to_string(rv));
          if (den == 14) CTabl.STextS("t14",CurRcr,static_cast_to_string(rv));
          if (den == 15) CTabl.STextS("t15",CurRcr,static_cast_to_string(rv));
        }

       for ( int den=16; den <= 31; den++)   //цикл по дням
        {
          // координаты ячейки с данными
          sprintf(str_11,"%s",static_cast_to_string(cel[den]));  //столбец 
          FreeSpaceString(str_11,3,"");                        
          sprintf(str_12,"%s%s",str_11,static_cast_to_string(rcr+1));   //строка 
          FreeSpaceString(str_12,3,"");

          // читаем данные
          string dan = xls.Workbooks.Item(1).Worksheets.Item(2).Range(static_cast_to_string(str_12)).Value;
          FreeSpaceString(dan,3,"");

          // пишем данные в таблицу
          double rv = atof(dan);
          VsegoRV += rv;
          //CTabl.STextS(den,CurRcr,static_cast_to_string(rv));
          if (den == 16) CTabl.STextS("t16",CurRcr,static_cast_to_string(rv));
          if (den == 17) CTabl.STextS("t17",CurRcr,static_cast_to_string(rv));
          if (den == 18) CTabl.STextS("t18",CurRcr,static_cast_to_string(rv));
          if (den == 19) CTabl.STextS("t19",CurRcr,static_cast_to_string(rv));
          if (den == 20) CTabl.STextS("t20",CurRcr,static_cast_to_string(rv));
          if (den == 21) CTabl.STextS("t21",CurRcr,static_cast_to_string(rv));
          if (den == 22) CTabl.STextS("t22",CurRcr,static_cast_to_string(rv));
          if (den == 23) CTabl.STextS("t23",CurRcr,static_cast_to_string(rv));
          if (den == 24) CTabl.STextS("t24",CurRcr,static_cast_to_string(rv));
          if (den == 25) CTabl.STextS("t25",CurRcr,static_cast_to_string(rv));
          if (den == 26) CTabl.STextS("t26",CurRcr,static_cast_to_string(rv));
          if (den == 27) CTabl.STextS("t27",CurRcr,static_cast_to_string(rv));
          if (den == 28) CTabl.STextS("t28",CurRcr,static_cast_to_string(rv));
          if (den == 29) CTabl.STextS("t29",CurRcr,static_cast_to_string(rv));
          if (den == 30) CTabl.STextS("t30",CurRcr,static_cast_to_string(rv));
          if (den == 31) CTabl.STextS("t31",CurRcr,static_cast_to_string(rv));
        }
       CTabl.STextS("VsegoRV",CurRcr,static_cast_to_string(VsegoRV));

     }

    if( atoi(tab) <  1)  IndEnd = 999;
    if( atoi(ord) == 999)  IndEnd = 999;

   }
  CTabl.Rewrite();
}






FillFld()
// находим поля в таблице и определяем их номера
{
  fld[idxDD]   = CTabl.Find_Name_Fld("dd");
  fld[idxTN]   = CTabl.Find_Name_Fld("C_FIO");
  fld[idxORD]  = CTabl.Find_Name_Fld("OpisRab");
  fld[idxFIO]   = CTabl.Find_Name_Fld("FIO");

  fld[idxD1]  = CTabl.Find_Name_Fld("1");
  fld[idxD2]  = CTabl.Find_Name_Fld("2");
  fld[idxD3]  = CTabl.Find_Name_Fld("3");
  fld[idxD4]  = CTabl.Find_Name_Fld("4");
  fld[idxD5]  = CTabl.Find_Name_Fld("5");
  fld[idxD6]  = CTabl.Find_Name_Fld("6");
  fld[idxD7]  = CTabl.Find_Name_Fld("7");
  fld[idxD8]  = CTabl.Find_Name_Fld("8");
  fld[idxD9]  = CTabl.Find_Name_Fld("9");
  fld[idxD10]  = CTabl.Find_Name_Fld("10");

  fld[idxD11]  = CTabl.Find_Name_Fld("11");
  fld[idxD12]  = CTabl.Find_Name_Fld("12");
  fld[idxD13]  = CTabl.Find_Name_Fld("13");
  fld[idxD14]  = CTabl.Find_Name_Fld("14");
  fld[idxD15]  = CTabl.Find_Name_Fld("15");
  fld[idxD16]  = CTabl.Find_Name_Fld("16");
  fld[idxD17]  = CTabl.Find_Name_Fld("17");
  fld[idxD18]  = CTabl.Find_Name_Fld("18");
  fld[idxD19]  = CTabl.Find_Name_Fld("19");
  fld[idxD20]  = CTabl.Find_Name_Fld("20");

  fld[idxD21]  = CTabl.Find_Name_Fld("21");
  fld[idxD22]  = CTabl.Find_Name_Fld("22");
  fld[idxD23]  = CTabl.Find_Name_Fld("23");
  fld[idxD24]  = CTabl.Find_Name_Fld("24");
  fld[idxD25]  = CTabl.Find_Name_Fld("25");
  fld[idxD26]  = CTabl.Find_Name_Fld("26");
  fld[idxD27]  = CTabl.Find_Name_Fld("27");
  fld[idxD28]  = CTabl.Find_Name_Fld("28");
  fld[idxD29]  = CTabl.Find_Name_Fld("29");
  fld[idxD30]  = CTabl.Find_Name_Fld("30");

  fld[idxD31]  = CTabl.Find_Name_Fld("31");

  fld[idxVsRV]   = CTabl.Find_Name_Fld("VsegoRV");
}

Vdos(Str)
{
   string Ans=Str;
   CharToOem(Str,Ans);
   return Ans;
}

Ansi( Str )
// функция перекодирует значение Str в windows-кодировку и возвращает перекодированное значение
// Str - строка, которую нужно перекодировать
{
   string Ans=Str;
   OemToChar(Str,Ans);
   return Ans;
}
