Автор | Сообщение |
|
| |
Пост N: 4
Зарегистрирован: 05.08.08
|
|
Отправлено: 12.05.09 10:16. Заголовок: Нужен конвертер DBF в XLS
Добрый день, нужен конвертер формата DBF (консольный xHarbour) в формат XLS, с перекодировкой из 866 в 1251 Спасибо...
|
|
|
Ответов - 105
, стр:
1
2
3
4
5
6
All
[только новые]
|
|
|
| |
Пост N: 21
Зарегистрирован: 08.02.11
|
|
Отправлено: 28.09.11 02:13. Заголовок: Элементарные операци..
Элементарные операции. Копия из текста одной утилиты. Начало работы // oExcel := TOleAuto():New( "Excel.Application" ) oBook:=oExcel:WorkBooks:Add() //новая пустая книга //подогнать количество листов под количестко точек измерения k:=oBook:Sheets:Count //количество листов в новой книге do while (oBook:Sheets:Count)<len(aTmp) //листов меньше чем точек измерения - добавить oBook:Sheets:Add() enddo Если нужно - добавляй еще новые книги - oBook1, oBook2, ... ---------- заполнение и форматирование ячеек 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.
|
|
|
|
| |
Пост N: 6
Зарегистрирован: 09.09.11
|
|
Отправлено: 28.09.11 12:20. Заголовок: Спасибо, за помощь....
Спасибо, за помощь.... С форматированием таблицы разобрался, на сегодня пойдет. Фрагмент кода 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.
|
|
|
|
| |
Пост N: 23
Зарегистрирован: 08.02.11
|
|
Отправлено: 29.09.11 01:40. Заголовок: Oskar_AAA пишет: SA..
Oskar_AAA пишет: цитата: | SADSTAR4: по коду oSheet:=oBook:Worksheets(1) вылетает ошибка |
| Если это в четвертой строке - я не вижу создания ранее объекта oBook
|
|
|
|
| |
Пост N: 7
Зарегистрирован: 09.09.11
|
|
Отправлено: 29.09.11 05:30. Заголовок: SADSTAR4, да это 4 с..
SADSTAR4, да это 4 строка кода. Но там открывается Сводный (конечный) отчет, в котром куча листов, шапки итд. Мне нужно перейти на Лист N, допустим 1 или 3. Далее по тексту кода в Excel Открывается полученный в результате обработки файл формата DBF, проходит его форматирование итд. теперь скопировать текущий лист и далее вставить его в соответсвующий Лист Сводного отчета. Т.е. не надо создавать (добавлять) листы в существующие файлы Excel....
|
|
|
|
| |
Пост N: 24
Зарегистрирован: 08.02.11
|
|
Отправлено: 29.09.11 06:22. Заголовок: Если объект oBook не..
Если объект 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))) Числовое значение преобразовать в строку а затем опять в число?
|
|
|
|
| |
Пост N: 8
Зарегистрирован: 09.09.11
|
|
Отправлено: 29.09.11 07:29. Заголовок: попробовал "oShe..
попробовал "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.
|
|
|
|
| Администратор
|
Пост N: 2080
Зарегистрирован: 23.05.05
|
|
Отправлено: 29.09.11 08:14. Заголовок: Oskar_AAA пишет: по..
Oskar_AAA пишет: цитата: | попробовал "oSheet :=oBook:Worksheets(1) " |
| Откуда взялся worksheets ? В лучших домах Европы и Филадельфии используют Sheets
|
|
|
|
| |
Пост N: 9
Зарегистрирован: 09.09.11
|
|
Отправлено: 29.09.11 08:21. Заголовок: т.е. надо oSheet:=oB..
т.е. надо oSheet:=oBook:Sheets(1) - все равно ошибка |Error BASE/1004 Class: 'NIL' has no exported method: SHETTS Arguments: ( [ 1] =| | Type: U [ 2] = Type: N Val: 1)░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░| Paha, подскажи как сделать.....
|
|
|
|
| Администратор
|
Пост N: 2081
Зарегистрирован: 23.05.05
|
|
Отправлено: 29.09.11 08:28. Заголовок: Oskar_AAA пишет: Er..
Oskar_AAA пишет: цитата: | Error BASE/1004 Class: 'NIL' has no exported method: SHETTS Arguments: ( [ 1] =| |
| Просто очепятка. Надо Sheets
|
|
|
|
| |
Пост N: 10
Зарегистрирован: 09.09.11
|
|
Отправлено: 29.09.11 08:34. Заголовок: Pasha, точно опечатк..
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()
|
|
|
|
| Администратор
|
Пост N: 2082
Зарегистрирован: 23.05.05
|
|
Отправлено: 29.09.11 08:42. Заголовок: Oskar_AAA пишет: Pa..
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
|
|
|
|
|
| |
Пост N: 11
Зарегистрирован: 09.09.11
|
|
Отправлено: 29.09.11 08:48. Заголовок: Pasha, в этом я вооб..
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()....
|
|
|
|
| Администратор
|
Пост N: 2083
Зарегистрирован: 23.05.05
|
|
Отправлено: 29.09.11 09:13. Заголовок: Oskar_AAA пишет: по..
Oskar_AAA пишет: цитата: | понятно, что нет COPY().... |
| Дык надо сделать copy. То, что надо вставить - предварительно скопировать. Метод Copy применяется к объекту range
|
|
|
|
| |
Пост N: 12
Зарегистрирован: 09.09.11
|
|
Отправлено: 29.09.11 09:20. Заголовок: Pasha, oAs:Cells(2,2..
Pasha, oAs:Cells(2,2):Select() переход на ячей oAs:Range(oAs:Cells(2,2),oAs:Cells(cRecno,cColumn-4)):Copy() или как Правильно написать??? т.е надо с ячейки 2.2 до Crecno - количество строк, cColumn - количество столбцов выбрать в буфер
|
|
|
|
| Администратор
|
Пост N: 2084
Зарегистрирован: 23.05.05
|
|
Отправлено: 29.09.11 09:26. Заголовок: Oskar_AAA пишет: oA..
Oskar_AAA пишет: цитата: | oAs:Cells(2,2):Select() переход на ячей oAs:Range(oAs:Cells(2,2),oAs:Cells(cRecno,cColumn-4)):Copy() или как Правильно написать??? т.е надо с ячейки 2.2 до Crecno - количество строк, cColumn - количество столбцов выбрать в буфер |
| Так правильно написано.
|
|
|
|
| |
Пост N: 13
Зарегистрирован: 09.09.11
|
|
Отправлено: 29.09.11 09:33. Заголовок: ошибок нет oAs:Range..
ошибок нет 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???
|
|
|
|
| Администратор
|
Пост N: 2085
Зарегистрирован: 23.05.05
|
|
Отправлено: 29.09.11 09:47. Заголовок: Oskar_AAA пишет: oA..
Oskar_AAA пишет: цитата: | oAs:oSheet:Paste() // ошибка |Error Excel.Application:ACTIVESHEET/3 DISP_E_MEMBERNOTFOUND: OSHEET Arguments: | |
| Зачем Sheet.Sheet, да ? Масло масляное. Надо просто oAs:Paste() см.help к Excel vba Или просто запись макросов с их последующим просмотром на предмет изучения.
|
|
|
|
| |
Пост N: 14
Зарегистрирован: 09.09.11
|
|
Отправлено: 29.09.11 10:10. Заголовок: Pasha, спасибо.... с..
Pasha, спасибо.... с одним Листом справился. Остается объем данных в буфере обмена и выделение вставленных ячеек, где-то на форуме были сообщения по этому поводу.... Теперь надо организовать переход на другие DBF отчеты, там обработка и вставка на соответсвующие листы... в памяти уже загружен Excel файл сводный отчет. Допустим переход на Лист 2,3,4.... N Открытие следующего DBF файла - форматирование итд вставка на листе сводного отчета. /// /// в конеце - 1 раз запись Сводного Отчета
|
|
|
|
| Администратор
|
Пост N: 2086
Зарегистрирован: 23.05.05
|
|
Отправлено: 29.09.11 10:55. Заголовок: Oskar_AAA пишет: Те..
Oskar_AAA пишет: цитата: | Теперь надо организовать переход на другие DBF отчеты, там обработка и вставка на соответсвующие листы... в памяти уже загружен Excel файл сводный отчет. Допустим переход на Лист 2,3,4.... N Открытие следующего DBF файла - форматирование итд вставка на листе сводного отчета. /// /// в конеце - 1 раз запись Сводного Отчета |
| Ну и.. в чем проблема ? В Sheets задать номер листа, выдать select на нужный дбф
|
|
|
|
| |
Пост N: 15
Зарегистрирован: 09.09.11
|
|
Отправлено: 29.09.11 13:25. Заголовок: Pasha, можно я вылож..
Pasha, можно я выложу исходники и задчау в личку?
|
|
|
Ответов - 105
, стр:
1
2
3
4
5
6
All
[только новые]
|
|