загрузка данных из xls или dbf

Программирование на Атлантисе (VIP, FCOM, ARD), FastReport

Модераторы: m0p3e, edward_K, Модераторы

Ответить
onehalf
Сообщения: 19
Зарегистрирован: 25 ноя 2008, 15:18

загрузка данных из xls или dbf

Сообщение onehalf »

вводим модуль зп

стоит задача загрузить номера лицевых счетов из xls или dbf файла в галактику.

как это реализовать?
k_vit
Постоянный обитатель
Сообщения: 143
Зарегистрирован: 09 авг 2006, 16:40
Откуда: Россия, Тюмень, ОАО "Сибирский Научно-Аналитический Центр"

Сообщение k_vit »

Если из dbf, то можно попробовать "import" в Support, можно реализовать VIP-интерфейс используя методы для работы с dbf (DBFOpen, DBFClose... и т.д. - смотреть в справке раздел "DBF-файлы")
Если excel - тоже можно релизовать интерфейс, используя методы для работы с excel (xlCreateExcel, xlKillExcel и т.д. - смотреть файл Excel.doc)

Если конечно есть ещё лицензия на vip.
Алексей
Местный житель
Сообщения: 2896
Зарегистрирован: 24 июн 2005, 12:12
Откуда: Иркутская область

Сообщение Алексей »

если есть эксель, я бы сохранил в ДБФ :) и реализовал методы для работы с ДБФ
m0p3e
Местный житель
Сообщения: 1386
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Москва

Сообщение m0p3e »

Алексей
По трудозатратам на программинг что из Excel читать, что из DBF...
Зато с исходными данными в Excel работать проще. Хотя на вкус и цвет... :)
Алексей
Местный житель
Сообщения: 2896
Зарегистрирован: 24 июн 2005, 12:12
Откуда: Иркутская область

Re: загрузка данных из xls или dbf

Сообщение Алексей »

ну вот и настал тот день когда из экселя 2010 не могу сохранить в ДБФ :)
дока по экселю у меня устаревшая, где можно взять по свежей.
нужны функции открытия файла, чтения в цикле до его окончания, закрытие файла. чтобы не отображался на экране.
edward_K
Заслуженный деятель интернет-сообщества
Сообщения: 5187
Зарегистрирован: 29 мар 2005, 17:49
Откуда: SPB galaxy spb

Re: загрузка данных из xls или dbf

Сообщение edward_K »

Excel_lib.pdf в доке галактики - там есть параметр в каком режиме открыть.
А сохранить в 2010 можно - тока как то муторно - через экспорт где то.
Я держу 2 офиса, благо Excel могет одновременно работать, а вот word после каждого запуска старой версии чего то себе подставляет.
Masygreen
Местный житель
Сообщения: 1089
Зарегистрирован: 04 сен 2008, 11:27
Откуда: Москва
Контактная информация:

Re: загрузка данных из xls или dbf

Сообщение Masygreen »

не не муторно .. в 2010 Excel нет теперь такой функции, используйте Access
Время ведет!
Masygreen
Местный житель
Сообщения: 1089
Зарегистрирован: 04 сен 2008, 11:27
Откуда: Москва
Контактная информация:

Re: загрузка данных из xls или dbf

Сообщение Masygreen »

Код: Выделить всё

		xlCreateExcelWithTemplate(путь к файлу excel, false);
		XlDisplayAlerts(false); 
		_XlRes := xlIsExcelValid();
		if not xlSetActiveSheetByName('Данные') // ищем лист с данными
    {
      message('Не верный EXCEL-файл! Нет листа "Данные"');
      xlKillExcel;
      CloseInterface(cmCancel);
      stop;
      exit;
    };
		
		_RowCount:=2;
		
		do
		{
			xlGetCellValue(_RowCount,1,_TmpStr);
			if (trim(_TmpStr) = '')
				{
					xlKillExcel;
					break;
				}

			else
			{
				//делаем наши грязные дела
				_RowCount:=_RowCount+1;
			};
		}while true;
		xlKillExcel
Время ведет!
edward_K
Заслуженный деятель интернет-сообщества
Сообщения: 5187
Зарегистрирован: 29 мар 2005, 17:49
Откуда: SPB galaxy spb

Re: загрузка данных из xls или dbf

Сообщение edward_K »

Ну или так.
Можете добавить еще параметр и передавать имя листа

Код: Выделить всё

//=============================
#DEFINE _EXCEL_MATRIX_ 
Function ReadDataFromExcel(row:longint ; nmfile :string  ) :boolean ;
//
var wrow :longint ;
    KolEmptRow,KolEmptCol: word ;
    wklempt:boolean ;
    jj:word ;
    wstr2:string ;
    wkluch:boolean ;
    chet : longint ;
    maxjj :longint ;
#IFDEF _EXCEL_MATRIX_    
    mas_excel : longint ;
    row_matrix: longint ;
    
#ENDIF    
{ v_Imp.delete all tmp_excel ;
  ReadDataFromExcel:=false ;
  logfilekl:=true ;
  mylog('ReadDataFromExcel == Идет загрузка из '+nmfile );
  if not fileexist(nmfile) { message('Нет файла '+nmfile) ; exit ;}
//грузим с указанной строки +1(здесь должна быть шапка), при обработке шапка пропускается
//то есть если указана 6 строка, то данные должны юыть с 8
  maxjj:=50 ;// там где много записей надо задать точно, а еще лучше переделать на матрицу.
 RestartVisual('идет загрузка',0);
  wrow:=row ;
  if not inextvisual('Идет загрузка из '+nmfile) then exit ;
  xlCreateExcelWithTemplate(nmfile,true)
  wkluch:=true
  KolEmptRow:=0 ; KolEmptCol:=0 ;
/*
   Function CreateMatrixEx(Rows, Cols : longint) : LongInt; 
    Function FreeMatrixEx(ID : Longint ) : boolean; 
    Function ClearMatrixEx(ID : Longint ): boolean; 
    Function WriteToMatrixEx(ID, Row, Col : longint; Value : variant) : boolean; 
    Function WriteDateToMatrixEx(ID, Row, Col : longint; Year, Month, Day : word) : boolean; 
    Function ReadFromMatrixEx(ID, Row, Col : longint; var Value : variant) : boolean; 
    Function WriteMatrixToExcelEx(ID : Longint; RowU : longint = 0; ColL : longint = 0) : boolean; 
    Function ReadMatrixFromExcelEx(ID : LongInt; RowU : longint = 0; ColL : longint = 0; RowD : longint = 0; ColR : longint = 0) : boolean;
*/  
#IFDEF _EXCEL_MATRIX_    
  mas_excel:=XLCreateMatrixEx(1000,maxjj+1)
  row_matrix:=0 ;
  XLReadMatrixFromExcelEx(mas_excel,row+1,1,row+1000, maxjj) ;
#ENDIF  
  do 
  { 
    wrow:=wrow+1 ;
    chet:=chet+1 ;
    if chet mod 100=0 
      if not nextvisual then { wkluch:=false ; break ;}
#IFDEF _EXCEL_MATRIX_    
    row_matrix:=row_matrix+1 ;
    if row_matrix>1000
    { row_matrix:=1 ;
      XLClearMatrixEx(mas_excel) ;
      XLReadMatrixFromExcelEx(mas_excel,wrow,1,wrow+1000-1, maxjj) ;
    }
#ENDIF
    KolEmptCol:=0 ;
    v_Imp.clearbuffer(v_Imp.tntmp_excel) ;
    v_Imp.tmp_excel.numrow:=wrow ;
    wklempt:=true ;
    for(jj:=1;jj<=maxjj;jj:=jj+1 )
    { wstr2:='' ;
    
#IFDEF _EXCEL_MATRIX_    
      XLReadFromMatrixEx(mas_excel,row_matrix,jj,wstr2)
#ELSE
      xlGetCellValue(wrow,jj,wstr2) ;
#ENDIF      
      wstr2:=trim(replace(wstr2,'  ',' ')) ;
      if wstr2='' then KolEmptCol:=KolEmptCol+1 ;
      if KolEmptCol>20 then break ;
      v_Imp.tmp_excel.dmcell[jj]:=wstr2 ;
      if v_Imp.getfirst tmp_listsootv where (( 
             'ALL'==tmp_listsootv.nmtable
         and 'ALL'==tmp_listsootv.nmfld 
         and tmp_excel.dmcell[jj]== tmp_listsootv.oldval
           ))=0
      { v_Imp.tmp_excel.dmcell[jj]:= v_Imp.tmp_listsootv.newval ;  
      }
      if wstr2<>'' then { wklempt:=false ; KolEmptRow:=0 ; }
    } //for(jj:=1;jj<=100;jj:=jj+1 )
//    if not wklempt or KolEmptRow<10
    v_Imp.insert current tmp_excel ;
  mylog(v_Imp.tmp_excel.dmcell[1]+'/'+v_Imp.tmp_excel.dmcell[2]+'/'+v_Imp.tmp_excel.dmcell[3] );
    if not wklempt then KolEmptRow:=0 ;
    if wklempt
    { KolEmptRow:=KolEmptRow+1 ;
      if KolEmptRow>10 then break ;
    }
  } while wrow<65000
  //v_Imp.delete tmp_excel where (( row-KolEmptRow <<=tmp_excel.numrow)) ;
  mylog('Забрали для записи '+string(recordsintable(v_Imp.tntmp_excel)) );
  mylog('===================================' );
#IFDEF _EXCEL_MATRIX_    
  XLFreeMatrixEx(mas_excel) ;
#ENDIF
  XLGETACTIVEWORKBOOKNAME(wstr2) ;
  xlCloseWorkBookByName(wstr2) ;
  xlKillExcel ;
  ReadDataFromExcel:=wkluch ;
}
Ответить