Форум » [x]Harbour » Нужен конвертер DBF в XLS » Ответить

Нужен конвертер DBF в XLS

Oskar_Aa: Добрый день, нужен конвертер формата DBF (консольный xHarbour) в формат XLS, с перекодировкой из 866 в 1251 Спасибо...

Ответов - 105, стр: 1 2 3 4 5 6 All

SADSTAR4: Элементарные операции. Копия из текста одной утилиты. Начало работы [pre2] // oExcel := TOleAuto():New( "Excel.Application" ) oBook:=oExcel:WorkBooks:Add() //новая пустая книга //подогнать количество листов под количестко точек измерения k:=oBook:Sheets:Count //количество листов в новой книге do while (oBook:Sheets:Count)<len(aTmp) //листов меньше чем точек измерения - добавить oBook:Sheets:Add() enddo [/pre2] Если нужно - добавляй еще новые книги - oBook1, oBook2, ... ---------- заполнение и форматирование ячеек [pre2] Row1:=3 //начало таблицы for mpi:=1 to len(aTmp) //пойти по точкам измерения oSheet:=oBook:Worksheets(mpi) //выбрать лист номер mpi oSheet:name:=aTmp[mpi] //имя листа изменить //рисуем "шкалу часов" oSheet:Cells( Row1, 1 ):Value:="час суток" oSheet:Cells( Row1, 1 ):set('WrapText',.t.) oSheet:Cells( Row1, 1 ):BorderAround( xlContinuous, xlThin) oSheet:Cells( Row1, 1 ):Borders(xlEdgeBottom):Weight := xlMedium oSheet:Cells( Row1, 1 ):Borders(xlEdgeRight):LineStyle := xlDouble for i:=1 to 24 //часы суток oSheet:Cells( Row1+i, 1 ):Value:=i //oSheet:Cells( Row1+i, 1 ):Borders(xlEdgeBottom):Weight := xlMedium oSheet:Cells( Row1+i, 1 ):Borders(xlEdgeRight):LineStyle := xlDouble next //рисуем данные for i:=1 to len(aRes) //перебрать даты oSheet:Cells( Row1, 1+i ):Value:=aRes[i,1] //дата oSheet:Cells( Row1, 1+i ):Set( "VerticalAlignment", xlCenter) oSheet:Cells( Row1, 1+i ):BorderAround( xlContinuous, xlThin) oSheet:Cells( Row1, 1+i ):Borders(xlEdgeBottom):Weight := xlMedium //найти ветку нужной точки измерения if (j:=aScan(aRes[ i ],{|x| x[1]=aTmp[mpi]}))=0 loop endif //значения за дату k:=1 do while k<=len(aRes[i,j,2]) if aRes[i,j,2,k,3]=2 //за час просуммированы два измерения oSheet:Cells( Row1+aRes[i,j,2,k,1], 1+i ):Value:=aRes[i,j,2,k,2] endif //oSheet:Cells( Row1+aRes[i,j,2,k,1], 1+i ):BorderAround( xlContinuous, xlThin) k++ enddo next //=СЧЁТ(RC[-10]:RC[-1]) //=СУММ(RC[-11]:RC[-2])/RC[-1] //написать формулы k:=len(aRes) oSheet:Cells( Row1, 1+k+1):Value:="колич. измерений" oSheet:Cells( Row1, 1+k+1):set('WrapText',.t.) oSheet:Cells( Row1, 1+k+1):BorderAround( xlContinuous, xlThin) oSheet:Cells( Row1, 1+k+1):Borders(xlEdgeBottom):Weight := xlMedium oSheet:Cells( Row1, 1+k+2):Value:="среднее потребление" oSheet:Cells( Row1, 1+k+2):set('WrapText',.t.) oSheet:Cells( Row1, 1+k+2):BorderAround( xlContinuous, xlThin) oSheet:Cells( Row1, 1+k+2):Borders(xlEdgeBottom):Weight := xlMedium for i:=1 to 24 //часы суток oSheet:Cells( Row1+i, 1+k+1):Formula:="=СЧЁТ(RC[-"+alltrim(str(k))+"]:RC[-1]" oSheet:Cells( Row1+i, 1+k+2):Formula:="=ОКРУГЛ(СУММ(RC[-"+alltrim(str(k+1))+"]:RC[-2])/RC[-1];0)" next //сумма по часам for i:=1 to 24 //часы суток //msgbox(valtype(aSum[ i ])) aSum[ i ]:=aSum[ i ]+oSheet:Cells( Row1+i, 1+k+2):Value next next //лист суммы oBook:Sheets:Add() oSheet:=oBook:Activesheet oSheet:name:="Итого" oSheet:Cells( Row1, 1 ):Value:="час суток" oSheet:Cells( Row1, 1 ):set('WrapText',.t.) oSheet:Cells( Row1, 1 ):BorderAround( xlContinuous, xlThin) oSheet:Cells( Row1, 1 ):Borders(xlEdgeBottom):Weight := xlMedium oSheet:Cells( Row1, 1 ):Borders(xlEdgeRight):LineStyle := xlDouble oSheet:Cells( Row1, 2):Value:="среднее без вычета" oSheet:Cells( Row1, 2):set('WrapText',.t.) oSheet:Cells( Row1, 2):BorderAround( xlContinuous, xlThin) oSheet:Cells( Row1, 2):Borders(xlEdgeBottom):Weight := xlMedium oSheet:Cells( Row1, 3):Value:="среднее с вычетом" oSheet:Cells( Row1, 3):set('WrapText',.t.) oSheet:Cells( Row1, 3):BorderAround( xlContinuous, xlThin) oSheet:Cells( Row1, 3):Borders(xlEdgeBottom):Weight := xlMedium n:=wMain.txt_Minus.Value //ежечасный вычет for i:=1 to 24 //часы суток oSheet:Cells( Row1+i, 1 ):Value:=i //oSheet:Cells( Row1+i, 1 ):Borders(xlEdgeBottom):Weight := xlMedium oSheet:Cells( Row1+i, 1 ):Borders(xlEdgeRight):LineStyle := xlDouble oSheet:Cells( Row1+i, 2 ):Value:=aSum[ i ] oSheet:Cells( Row1+i, 3 ):Value:=aSum[ i ]-n next //msgbox("конец") oExcel:Visible := .T. [/pre2]

Oskar_AAA: Спасибо, за помощь.... С форматированием таблицы разобрался, на сегодня пойдет. Фрагмент кода oExcel :Visible := .F. oExcel :Workbooks:Open(Main_File) // сводный отчет XLS из 9 листов oKlSheet :=oExcel:Sheets:Count // oSheet :=oBook:Worksheets(1) oAs :=oExcel:ActiveSheet() oExcel :Workbooks:Open(Dbf_file) // частный отчет (лист1), по которому проходит форматирование oRange := oExcel:ActiveCell:SpecialCells(xlLastCell) nLenRecnoXls := oRange:Row nLenColumnXls := oRange:Column cRecno := Val(AllTrim(Str(nLenRecnoXls))) cColumn := Val(AllTrim(Str(nLenColumnXls))) oExcel:Set( "DisplayAlerts",.F.) oAs:= oExcel:ActiveSheet() oAs:Columns(2):Font:Bold := .T. For J_Rec = 4 To cColumn-4 oAs:Columns(J_Rec):NumberFormat:= "# ##0,00;-0,00;" Next oAs:Columns(7):NumberFormat:= "0,0000;;" oAs:Range(oAs:Cells(2,2),oAs:Cells(cRecno,cColumn-4)):Borders(xlEdgeTop):LineStyle:= xlContinuous oAs:Range(oAs:Cells(2,2),oAs:Cells(cRecno,cColumn-4)):Borders(xlEdgeBottom):LineStyle:= xlContinuous oAs:Range(oAs:Cells(2,1),oAs:Cells(cRecno,cColumn-4)):Borders(xlEdgeRight):LineStyle:= xlContinuous oAs:Range(oAs:Cells(2,1),oAs:Cells(cRecno,cColumn-4)):Borders(xlInsideVertical):LineStyle:= xlContinuous oAs:Range(oAs:Cells(2,1),oAs:Cells(cRecno,cColumn-4)):Borders(xlInsideHorizontal):LineStyle:= xlContinuous For I_Rec = 2 To cRecno I_Rec1:=I_Rec-1 If I_Rec1/Rc_OilKol-Int(I_Rec1/Rc_OilKol)==0 I_Rec2:=(Int(I_Rec1/Rc_OilKol)-1)*(Rc_OilKol+1)+2 I_Rec3:=Int(I_Rec1/Rc_OilKol)*(Rc_OilKol+1)+1 I_Rec4:=I_Rec3-1 * If I_Rec3<cRecno oAs:Rows(I_Rec3):Font:Bold:= .T. oAs:Rows(I_Rec3):Interior:ColorIndex = 6 oAs:Rows(I_Rec3):WrapText = .T. oAs:Range(oAs:Cells(I_Rec2,2),oAs:Cells(I_Rec4,2)):Merge() oAs:Range(oAs:Cells(I_Rec2,2),oAs:Cells(I_Rec4,2)):HorizontalAlignment := xlCenter oAs:Range(oAs:Cells(I_Rec2,2),oAs:Cells(I_Rec4,2)):VerticalAlignment:= xlCenter * Endif Endif Next oAs:Cells(2,2):Select() oAs:SaveAs(Xls_File,Excel97_10) oExcel:Set( "DisplayAlerts",.T.) oExcel :Visible := .T. Теперь надо: 1. перейти в Общий файл (Main_File) на Конкретный Лист 2. Скопировать диапазон из Open_Dbf 3. Вставить на Конкретный Лист Main_File SADSTAR4: по коду oSheet:=oBook:Worksheets(1) вылетает ошибка Error BASE/1004 Class: 'NIL' has no exported method: WORKSHEETS Arguments: ( [ | |1] = Type: U [ 2] = Type: N Val: 1) Что в коде не так? PS. Думаю переделать алгоритм формирования отчета.... 1. Открыть сводный отчет (Main_File) 2. Перейти на Нужный Лист 3. Добавить в него данные из DBF 4. Сформатировать лист Переход на другой лист 3. Добавить в него данные из DBF 4. Сформатировать лист итд. Запись отчета Main_File Закрыть Excel.

SADSTAR4: Oskar_AAA пишет: SADSTAR4: по коду oSheet:=oBook:Worksheets(1) вылетает ошибка Если это в четвертой строке - я не вижу создания ранее объекта oBook


Oskar_AAA: SADSTAR4, да это 4 строка кода. Но там открывается Сводный (конечный) отчет, в котром куча листов, шапки итд. Мне нужно перейти на Лист N, допустим 1 или 3. Далее по тексту кода в Excel Открывается полученный в результате обработки файл формата DBF, проходит его форматирование итд. теперь скопировать текущий лист и далее вставить его в соответсвующий Лист Сводного отчета. Т.е. не надо создавать (добавлять) листы в существующие файлы Excel....

SADSTAR4: Если объект oBook не существует, то обращение к нему вызывает ошибку попробуй сделать так oBook:=oExcel :Workbooks:Open(Main_File) // сводный отчет XLS из 9 листов oKlSheet :=oExcel:Sheets:Count // <-это не объект а число oSheet :=oBook:Worksheets(1) P.S. Что-то не пойму смысла этого кода cRecno := Val(AllTrim(Str(nLenRecnoXls))) cColumn := Val(AllTrim(Str(nLenColumnXls))) Числовое значение преобразовать в строку а затем опять в число?

Oskar_AAA: попробовал "oSheet :=oBook:Worksheets(1) " oBook:=oExcel :Workbooks:Open(Main_File) // сводный отчет XLS из 9 листов oKlSheet :=oExcel:Sheets:Count // количество листов книги - нормально oSheet :=oBook:Worksheets(1) Вылетает Ошибка Error BASE/1004 Class: 'NIL' has no exported method: WORKSHEETS Arguments: ( [ | 1] = Type: U [ 2] = Type: N Val: 1) PS. cRecno := Val(AllTrim(Str(nLenRecnoXls))) cColumn := Val(AllTrim(Str(nLenColumnXls))) - у меня "глаз замылился...." Остался только этот блок 1. "Выбрать данные из литса текущей книги" 2. "Перейти на другую книгу (сводный отчет)" 3. "Выбрать Нужный лист" 4. "Вставить данные из п.1" фрагмент кода oAs:SaveAs(Xls_Copy,Excel97_10) // запись файла DBF в формате XLS oAs:Cells(2,2):Select() // переход на ячеку oAs:Cells:Copy() // копирование oExcel :Workbooks:Open(Main_File) // открытие сводного отчета oKlSheet :=oExcel:Sheets:Count // подсчет количества листов oSheet :=oBook:Worksheets(1) // выбор листа oAs :=oExcel:ActiveSheet() // надо установить на нужную ячйеку (A5) oSheet:Paste() // вставить данные oAs:SaveAs(Main_File,Excel97_10) // запись сводного отчета oExcel:Set( "DisplayAlerts",.T.) oExcel :Visible := .T.

Pasha: Oskar_AAA пишет: попробовал "oSheet :=oBook:Worksheets(1) " Откуда взялся worksheets ? В лучших домах Европы и Филадельфии используют Sheets

Oskar_AAA: т.е. надо oSheet:=oBook:Sheets(1) - все равно ошибка |Error BASE/1004 Class: 'NIL' has no exported method: SHETTS Arguments: ( [ 1] =| | Type: U [ 2] = Type: N Val: 1)░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░| Paha, подскажи как сделать.....

Pasha: Oskar_AAA пишет: Error BASE/1004 Class: 'NIL' has no exported method: SHETTS Arguments: ( [ 1] =| Просто очепятка. Надо Sheets

Oskar_AAA: Pasha, точно опечатка, исправил: oAs:Cells(2,2):Select() oExcel:Workbooks:Open(Main_File) oSheet:=oBook:Sheets(1) ОШИБКА base/1004 - все равно есть???? oAs :=oExcel:ActiveSheet() oAs:Cells(5,1):Select() oAs:oSheet:Paste()

Pasha: Oskar_AAA пишет: Pasha, точно опечатка, исправил: oAs:Cells(2,2):Select() oExcel:Workbooks:Open(Main_File) oSheet:=oBook:Sheets(1) ОШИБКА base/1004 - все равно есть???? oAs :=oExcel:ActiveSheet() oAs:Cells(5,1):Select() oAs:oSheet:Paste() Семен Семеныч ! А переменную oBook создать надо ? oBook := oExcel:ActiveWorkBook

Oskar_AAA: Pasha, в этом я вообще не понимаю, спасибо за помощь.... oAs:SaveAs(Xls_Copy,Excel97_10) oAs:Cells(2,2):Select() oExcel:Workbooks:Open(Main_File) oBook := oExcel:ActiveWorkBook oSheet:=oBook:Sheets(1) oAs :=oExcel:ActiveSheet() oAs:Cells(5,1):Select() oAs:oSheet:Paste() oAs:SaveAs(Xls_File,Excel97_10) oExcel:Set( "DisplayAlerts",.T.) oExcel :Visible := .T. Вот такой код... сейчас ошибка на Paste() понятно, что нет COPY()....

Pasha: Oskar_AAA пишет: понятно, что нет COPY().... Дык надо сделать copy. То, что надо вставить - предварительно скопировать. Метод Copy применяется к объекту range

Oskar_AAA: Pasha, oAs:Cells(2,2):Select() переход на ячей oAs:Range(oAs:Cells(2,2),oAs:Cells(cRecno,cColumn-4)):Copy() или как Правильно написать??? т.е надо с ячейки 2.2 до Crecno - количество строк, cColumn - количество столбцов выбрать в буфер

Pasha: Oskar_AAA пишет: oAs:Cells(2,2):Select() переход на ячей oAs:Range(oAs:Cells(2,2),oAs:Cells(cRecno,cColumn-4)):Copy() или как Правильно написать??? т.е надо с ячейки 2.2 до Crecno - количество строк, cColumn - количество столбцов выбрать в буфер Так правильно написано.

Oskar_AAA: ошибок нет oAs:Range(oAs:Cells(2,2),oAs:Cells(cRecno,cColumn-4)):Select() oAs:Range(oAs:Cells(2,2),oAs:Cells(cRecno,cColumn-4)):Copy() далее переход на сводный отчет oExcel:Workbooks:Open(Main_File) oBook := oExcel:ActiveWorkBook oSheet:=oBook:Sheets(1) oAs :=oExcel:ActiveSheet() oAs:Cells(5,1):Select() oAs:oSheet:Paste() // ошибка |Error Excel.Application:ACTIVESHEET/3 DISP_E_MEMBERNOTFOUND: OSHEET Arguments: | |()░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░| |░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░| |Error at ...: TOLEAUTO:OSHEET(0) in Module: source\rtl\win32ole.prg░░░░░░░░░░░░░| |Called from : EXPORT_DAY1(414) in Module: COMM_003.prg░░░░░░░░░░░░░░░░░░░░░░░░░░| |Called from : EXPORT_DATA(383) in Module: MAIN_000.prg░░░░░░░░░░░░░░░░░░░░░░░░░░| |Called from : MAIN(213) in Module: MAIN_000.prg░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░| Pasha???

Pasha: Oskar_AAA пишет: oAs:oSheet:Paste() // ошибка |Error Excel.Application:ACTIVESHEET/3 DISP_E_MEMBERNOTFOUND: OSHEET Arguments: | Зачем Sheet.Sheet, да ? Масло масляное. Надо просто oAs:Paste() см.help к Excel vba Или просто запись макросов с их последующим просмотром на предмет изучения.

Oskar_AAA: Pasha, спасибо.... с одним Листом справился. Остается объем данных в буфере обмена и выделение вставленных ячеек, где-то на форуме были сообщения по этому поводу.... Теперь надо организовать переход на другие DBF отчеты, там обработка и вставка на соответсвующие листы... в памяти уже загружен Excel файл сводный отчет. Допустим переход на Лист 2,3,4.... N Открытие следующего DBF файла - форматирование итд вставка на листе сводного отчета. /// /// в конеце - 1 раз запись Сводного Отчета

Pasha: Oskar_AAA пишет: Теперь надо организовать переход на другие DBF отчеты, там обработка и вставка на соответсвующие листы... в памяти уже загружен Excel файл сводный отчет. Допустим переход на Лист 2,3,4.... N Открытие следующего DBF файла - форматирование итд вставка на листе сводного отчета. /// /// в конеце - 1 раз запись Сводного Отчета Ну и.. в чем проблема ? В Sheets задать номер листа, выдать select на нужный дбф

Oskar_AAA: Pasha, можно я выложу исходники и задчау в личку?



полная версия страницы