Страница 1 из 1
загрузка данных из xls или dbf
Добавлено: 25 сен 2009, 10:10
onehalf
вводим модуль зп
стоит задача загрузить номера лицевых счетов из xls или dbf файла в галактику.
как это реализовать?
Добавлено: 25 сен 2009, 10:32
k_vit
Если из dbf, то можно попробовать "import" в Support, можно реализовать VIP-интерфейс используя методы для работы с dbf (DBFOpen, DBFClose... и т.д. - смотреть в справке раздел "DBF-файлы")
Если excel - тоже можно релизовать интерфейс, используя методы для работы с excel (xlCreateExcel, xlKillExcel и т.д. - смотреть файл Excel.doc)
Если конечно есть ещё лицензия на vip.
Добавлено: 25 сен 2009, 10:54
Алексей
если есть эксель, я бы сохранил в ДБФ
и реализовал методы для работы с ДБФ
Добавлено: 25 сен 2009, 12:31
m0p3e
Алексей
По трудозатратам на программинг что из Excel читать, что из DBF...
Зато с исходными данными в Excel работать проще. Хотя на вкус и цвет...
Re: загрузка данных из xls или dbf
Добавлено: 12 янв 2012, 08:35
Алексей
ну вот и настал тот день когда из экселя 2010 не могу сохранить в ДБФ
дока по экселю у меня устаревшая, где можно взять по свежей.
нужны функции открытия файла, чтения в цикле до его окончания, закрытие файла. чтобы не отображался на экране.
Re: загрузка данных из xls или dbf
Добавлено: 12 янв 2012, 10:55
edward_K
Excel_lib.pdf в доке галактики - там есть параметр в каком режиме открыть.
А сохранить в 2010 можно - тока как то муторно - через экспорт где то.
Я держу 2 офиса, благо Excel могет одновременно работать, а вот word после каждого запуска старой версии чего то себе подставляет.
Re: загрузка данных из xls или dbf
Добавлено: 12 янв 2012, 12:16
Masygreen
не не муторно ..
в 2010 Excel нет теперь такой функции, используйте Access
Re: загрузка данных из xls или dbf
Добавлено: 12 янв 2012, 12:23
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
Re: загрузка данных из xls или dbf
Добавлено: 12 янв 2012, 13:03
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 ;
}