Автор | Сообщение |
|
| постоянный участник
|
Пост N: 19
Зарегистрирован: 06.02.07
|
|
Отправлено: 10.10.07 03:43. Заголовок: экспорт в Excel (тормоза)
Не пойму, в чем причина... Объясните, братцы, "тупому" :) ---- делаю экспорт в Excel (база с лекарствами) .... oExcel := TOleAuto():New( "Excel.Application" ) oExcel:Visible := .F. oLibros := oExcel:Get( "WorkBooks" ) oLibro := oLibros:Add() oHoja := oExcel:Get( "ActiveSheet" ) oHoja:Cells:Font:Name := "Arial" oHoja:Cells:Font:Size := 10 row0:=3 pbi:=1 ... do while .not. AFTG_X->(eof()) // AFTG_X - база, из которой экспортирую (лекарства, цены...) // (aftg_fi - массив макросов для выводимых выражений) oHoja:Cells( row0+pbi, 1 ):Value := " " for iii:=1 to 20 do case case iii=9 // цена oHoja:Cells( row0+pbi, iii ):Value := strtran( str(&(aftg_fi[iii]), 11, 2), ".", ",") oHoja:Cells( row0+pbi, iii ):Set( "NumberFormat", "#######0,00" ) oHoja:Cells( row0+pbi, iii ):HorizontalAlignment := XL_RIGHT case iii=11 // сумма oHoja:Cells( row0+pbi, iii ):Value := strtran( &(aftg_fi[iii]), ".", ",") oHoja:Cells( row0+pbi, iii ):Set( "NumberFormat", "##########0,00" ) oHoja:Cells( row0+pbi, iii ):HorizontalAlignment := XL_RIGHT otherwise // все остальные - просто взять значение if valtype(&(aftg_fi[iii]))="C" // если это строка oHoja:Cells( row0+pbi, iii ):Value := trim(&(aftg_fi[iii])) else if iii=3 // "Код ЛС" oHoja:Cells( row0+pbi, iii ):Value := &(aftg_fi[iii]) oHoja:Cells( row0+pbi, iii ):HorizontalAlignment := XL_RIGHT else // другие oHoja:Cells( row0+pbi, iii ):Value := &(aftg_fi[iii]) endif endif endcase if valtype(&(aftg_fi[iii]))="N" // если это число - выравнять вправо oHoja:Cells( row0+pbi, iii ):HorizontalAlignment := XL_RIGHT endif next iii AFTG_X->(dbskip()) pbi++ enddo ... // формируем заголовок таблицы oHoja:Cells( 1, 1 ):Value := "Выборка из БД формуляров МУ" oHoja:Cells( 1, 1 ):Font:Size := 12 oHoja:Cells( 1, 1 ):Font:Bold := .T. oHoja:Range("A1:F1"):Merge() oHoja:Range("A1:F1"):HorizontalAlignment := XL_CENTER oHoja:Columns("A:"+ckmax):AutoFit() // ckmax - max.буква (самой правой из заполняемых граф) в Экселе for iii:=1 to 20 if at( str(iii,3), " 2 4 5 6 12 13 14 15" ) > 0 // устанавливаем ширину колонок: // ФТГ (наим.), МНН, Торг, Форма, ЛПУ, Терр., Основание, Цел.Прог. if oHoja:Columns(chr(asc("A")-1+iii)+":"+chr(asc("A")-1+iii)):ColumnWidth > 20 oHoja:Columns(chr(asc("A")-1+iii)+":"+chr(asc("A")-1+iii)):ColumnWidth := 20 endif endif next iii // центрируем данные по Ед.Изм. oHoja:Range("G"+ltrim(str(row0))+; ":G"+ltrim(str(row0+pbi-1))):HorizontalAlignment := XL_CENTER oHoja:Cells( 2, 1 ):Select() oExcel:Visible := .T. oHoja:End() oLibro:End() oLibros:End() oExcel:End() ..... и вроде всё... Непонятка в том, что на небольших выборках (100-200-400) всё отрабатывает "мухой", а при попытке выкинуть 25-30 тысяч - ОППАНЬКИ... и идём нервно курить минут на ..дцать. Комп шуршит там чего-то, трудится... а процесс "нескончаем" (во всяком случае, за "разумное" время - ну пусть ЕДИНИЦЫ минут! а это "рубилово" идет минут 20-30!!!). На всякий - операционная обстановка: Win98, Office-97 [увы -так НАДО!..], Athlon 2400, оперативки 512 [сам знаю, что мало! но на "обычное экселЕние" хватает выше головы] И - заодно уж - подскажите неразумному: не пойму, как пользовать (для того же форматирования в ячейках, к примеру) экселовские константы (xlRight, xlCenter и пр.)? Пишу, например: oHoja:Cells( row0+pbi, iii ):HorizontalAlignment := oExcel:Constants():xlRight (или что-то типа) - и, естественно, бываю послан... Пришлось вверху писать дифайны вроде #define XL_RIGHT -4152 (понимаю, что глупо ["всё уже украдено до нас!"] - но "с налету" не понял еще, как правильно сделать) TsBrowse'овский Excel2() не выходит использовать (по ряду причин) (хотя потестил - получил тот же "нервный перекур"...) Или это "напряги" Эксела?.. Не может переварить 30 тыс.строк "за раз"? Заранее спасибо! "То ли лыжи погнулись... то ли я..." :)
|
|
|
Ответов - 32
, стр:
1
2
All
[только новые]
|
|
|
| Администратор
|
Пост N: 596
Зарегистрирован: 23.05.05
|
|
Отправлено: 10.10.07 08:12. Заголовок: Re:
Наверное ничего с этим не поделаешь, Эксель так и работает Я когда-то пытался понять причину, и у меня возникло впечатление, что с каждой следующей Row работа идет медленнее. Т.е, чтобы выбрать строку с большим номером N, мелкософтовский продукт лопатит строки 1 .. N-1 Возможно в более поздних версиях это улучшено Но все рано код надо оптимизировать, введя промежуточные переменные вместо oHoja:Cells( row0+pbi, iii ):Value := strtran( str(&(aftg_fi[iii]), 11, 2), ".", ",") oHoja:Cells( row0+pbi, iii ):Set( "NumberFormat", "#######0,00" ) oHoja:Cells( row0+pbi, iii ):HorizontalAlignment := XL_RIGHT надо oCell := oHoja:Cells( row0+pbi, iii ) oCell:Value := strtran( str(&(aftg_fi[iii]), 11, 2), ".", ",") oCell:NumberFormat := "#######0,00" oCell:HorizontalAlignment := XL_RIGHT Метод Set лучше не использовать, с прямым обращением работает лучше
|
|
|
|
| |
Пост N: 46
Зарегистрирован: 29.07.05
|
|
Отправлено: 10.10.07 10:25. Заголовок: Re:
Эта тема уже здесь обсуждалась года два назад. Набери в поиске TOleAuto, почитай. Виноват не Excel, а механизм OLE. Тут ничего не поделаешь. Для себя я решил проблему так: 1. Вывод информации в HTML-файл с расширением .xls программой на основе TB2Html от Jovan Bulajic 2. Вызов Excel с параметром <имя файла>. Работает ГОРАЗДО быстрее чем OLE!
|
|
|
|
| постоянный участник
|
Пост N: 349
Зарегистрирован: 12.09.06
|
|
Отправлено: 10.10.07 22:44. Заголовок: Re:
les пишет: цитата: | 1. Вывод информации в HTML-файл с расширением .xls программой на основе TB2Html от Jovan Bulajic |
| А можно поподробнее в этом месте, с примером ? Заранее спасибо.
|
|
|
|
| |
Пост N: 47
Зарегистрирован: 29.07.05
|
|
Отправлено: 11.10.07 09:39. Заголовок: Re:
|
|
|
|
| постоянный участник
|
Пост N: 20
Зарегистрирован: 06.02.07
|
|
Отправлено: 13.10.07 03:12. Заголовок: Re:
Спасибо за помощь! Буду "копать"... А то начальство захотело непременно "экселить" выборки (ну привыкли они!). Кстати: писал сперва, что "затыкается" на 20-30 тыщах... фигвам! те же "тормоза", оказывается, уже после 1-1,5 тысяч. :((
|
|
|
|
| постоянный участник
|
Пост N: 22
Зарегистрирован: 06.02.07
|
|
Отправлено: 26.10.07 03:21. Заголовок: сыскал решение!
сыскал решение проблемы! гонит в Эксел "мухой"! в нижележащем примере (на 1000 строк): через OLE - 32 сек :(( ; через буфер обмена ~2 сек. ===================== /* from comp.lang.xharbour: Yes, cell by cell is still slow. I use the clipboard functions when I have more than a screen full of data. Run the code below and you will see the dramatic difference between cell update versus paste from clipboard method. */ #include "minigui.ch" #include "common.ch" FUNCTION MAIN() LOCAL oExcel, oSheet LOCAL nRow LOCAL nCounter, nStart, nSeconds, nSecOle, nSecClip // oExcel = CREATEOBJECT( "Excel.Application" ) oExcel := TOleAuto():New( "Excel.Application" ) oExcel:WorkBooks:Add() // oSheet := oExcel:ActiveSheet oSheet := oExcel:Get("ActiveSheet") // GAL oExcel:Visible := .T. // GAL (добавил - просто чтоб видеть процесс) nRow := 2 oSheet:Cells( nRow, 1 ):Value = "Counter" oSheet:Cells( nRow, 2 ):Value = "Date" oSheet:Cells( nRow, 3 ):Value = "Row" nCounter := 1 nStart := nCounter // ------------------ Start Cell by Cell method nSeconds := seconds() DO WHILE nCounter < 1000 oSheet:Cells( nCounter+nRow, 1 ):Value := nCounter oSheet:Cells( nCounter+nRow, 2 ):Value := date()-nCounter oSheet:Cells( nCounter+nRow, 3 ):Value := nCounter-1 nCounter++ ENDDO nSecOle := seconds()-nSeconds // ------------------ Stop Cell by Cell oSheet:Cells( 1, 5):Value := "OLE time, sec" oSheet:Cells( 1, 6):Value := nSecOle nRow += nCounter+2 oSheet:Cells( nRow, 1 ):Value := "Counter" oSheet:Cells( nRow, 2 ):Value := "Date" oSheet:Cells( nRow, 3 ):Value := "Row" // ------------------ Start Clipboard method nSeconds := seconds() nCounter := 1 nStart := nCounter cMemo := '' DO WHILE nCounter < 1000 // build record cMemo += ltrim( str( nCounter ) ) cMemo += chr(9)+dtoc( date()-nCounter ) cMemo += chr(9)+ltrim( str( nCounter+nRow-1 ) ) cMemo += chr(10) nCounter++ // update sheet every 1000 records or eof() *IF mod( nCounter, 1000 ) = 0 // .or. eof() IF mod( nCounter, 100 ) = 0 // .or. eof() /* почему-то выдает ошибку ("нет такой ф-и" - хотя RTL.LIB подключается) GTSetClipboard( cMemo ) заменил на CopyToClipboard( cMemo ) */ CopyToClipboard( cMemo ) oSheet:Cells( nRow+nStart, 1 ):Select() oSheet:paste() nStart := nCounter cMemo := '' ENDIF ENDDO nSecClip := seconds()-nSeconds // ------------------ Stop Clipboard method oSheet:Cells( 1, 8):Value := "CLIP time, sec" oSheet:Cells( 1, 9):Value := nSecClip oSheet:Cells( 1, 11):Value := "1000 rows" // ------------------ Results on Screen * ? 'Ole = '+ltrim(str(nSecOle)) * ? 'Clip = '+ltrim(str(nSecClip)) * wait * oSheet:Columns( "A:C" ):AutoFit() oSheet:Columns( "A:I" ):AutoFit() // чтобы форматировало и графы тайминга oSheet:Cells( 1, 1 ):Select() // GAL oExcel:Visible := .T. // добавил для закрытия (не было) oSheet:End() oExcel:End() RETURN( nil ) =====================
|
|
|
|
| постоянный участник
|
Пост N: 292
Зарегистрирован: 09.10.06
|
|
Отправлено: 26.10.07 09:53. Заголовок: Re:
gustow пишет: цитата: | сыскал решение проблемы! гонит в Эксел "мухой"! |
| В некоторых случаях такое решение может быть небезопасным. Есть еще вариант выгрузки в файл с разделителями ( например CHR(9) ) средствами [x]Harbour и импорт средствами Excel.
|
|
|
|
| Администратор
|
Пост N: 612
Зарегистрирован: 23.05.05
|
|
Отправлено: 26.10.07 10:34. Заголовок: Re:
gustow пишет: цитата: | И - заодно уж - подскажите неразумному: не пойму, как пользовать (для того же форматирования в ячейках, к примеру) экселовские константы (xlRight, xlCenter и пр.)? |
| Ай хэв файлы word.ch и excel.ch с определениями констант Не помню, откуда он у меня взялся, то ли сам делал, то ли скачал где-то. Давно это было Могу выслать
|
|
|
|
| постоянный участник
|
Пост N: 360
Зарегистрирован: 12.09.06
|
|
Отправлено: 26.10.07 16:44. Заголовок: Re:
Pasha пишет: цитата: | Ай хэв файлы word.ch и excel.ch с определениями констант |
| Очень надо ! 30195@mail.ru Заранее благодарен
|
|
|
|
| |
Не зарегистрирован
Зарегистрирован: 01.01.70
|
|
Отправлено: 27.10.07 09:45. Заголовок: Re:
Петр пишет: цитата: | В некоторых случаях такое решение может быть небезопасным. |
| В каких? А то я постоянно его ( клипборд) использую.. aDb_cr := Ra->( dbstruct() ) for nCol := 1 to len( aDb_cr ) aadd( aHd, aDb_cr[ nCol, 1 ] ) next aHd[1]:="Попа" oClip := TClipBoard():New() oExc := TExcels():New() oExc :Font("Arial Cyr") oExc :SetFont("Arial Cyr") m := 1 Ra->( dbgotop() ) do while !Ra->( eof() ) cStr := "" for n := 1 to len( aDb_cr ) cField := aDb_cr[ n, 1 ] cStr1 := Ra->&cField if aDb_cr[ n, 2 ] == "N" cStr1 := alltrim( str( cStr1 ) ) endif cStr += cStr1 + if( n # len( aDb_cr ), chr( 9 ), "" ) next if !empty( cStr ) oClip:SetText( cStr ) oExc:SetPos( "A" + alltrim( str( m ) ) ) oExc:Paste() oClip:Clear() m ++ endif Ra->( dbskip() ) enddo
|
|
|
|
| постоянный участник
|
Пост N: 293
Зарегистрирован: 09.10.06
|
|
Отправлено: 27.10.07 10:26. Заголовок: Re:
ММК пишет: цитата: | В каких? А то я постоянно его ( клипборд) использую.. |
| И все работает прекрасно? Случай первый: пользователь запустил программу, которая экспортирует таким образом базу обьемом так в 1000000 записей. Поскольку он (пользователь) знает, что подобный процесс довольно длительный, а времени терять не хочется, он запускает Word и что-то там начинает делать с использованием очень распространенного метода Copy-Paste. Случай второй: у пользователя установлена какая-то ну уж очень нужная программа, которая висит в трее и все время проверяет, что там в буфере обмена происходит (переводчик, клавиатурный нинзя или шпион, что-то другое ) и производит какие-то операции над содержимым буфера. Случай третий: у клиента установлена не одна, а целых две ваших (или чужих) программы, которые постоянно его ( клипборд) используют и он их запустил на выполнение одновременно.. И так далее.
|
|
|
|
|
| |
Не зарегистрирован
Зарегистрирован: 01.01.70
|
|
Отправлено: 27.10.07 12:15. Заголовок: Re:
Петр пишет: цитата: | И все работает прекрасно? |
| Вот черт!! :))) Еслиб я сначало прочитал все , что ниже наверняка бы не работало:))) А может каждая прожка использует свой кусочек памяти для клипборда? Хотя не могу с Вами не согласится - если подумать , вроде так . А, буду ждать пока чё не случится. Ну не все же они сразу будут клипбордом пользоваться:)
|
|
|
|
| постоянный участник
|
Пост N: 294
Зарегистрирован: 09.10.06
|
|
Отправлено: 27.10.07 14:49. Заголовок: Re:
ММК пишет: цитата: | А может каждая прожка использует свой кусочек памяти для клипборда? |
| Я не думаю, что мы должны теряться в догадках msdn довольно подробно все излагает. Еше предлагаю по этой ссылке посмотреть как не надо писать программы http://www.flounder.com/badprogram.htm
|
|
|
|
| |
Не зарегистрирован
Зарегистрирован: 01.01.70
|
|
Отправлено: 27.10.07 15:36. Заголовок: Re:
Петр пишет: цитата: | как не надо писать программы |
| :))) Наверное было бы здорово если бы мы прислушивались ко всем советчикам:)) Но не все советы ... Действительно ( и без всяких догадок) клипборд он и есть клипборд, это всем понятно. Но работа с ним дает хороший результат , а все остальное просто надо иметь в виду:))На всякий случай я не жду заполнения всей страницы, oClip:SetText( cStr ) oExc:SetPos( "A" + alltrim( str( m ) ) ) oExc:Paste() oClip:Clear() Никто от ворда не отказался? :)
|
|
|
|
| |
Пост N: 87
Зарегистрирован: 17.10.05
|
|
Отправлено: 28.10.07 10:59. Заголовок: METHOD TSBrowse:Excel2()
Посмотрите код вывода таблицы в Excel напрямую - может не стоит париться с Ole?
|
|
|
|
| постоянный участник
|
Пост N: 72
Зарегистрирован: 13.10.05
|
|
Отправлено: 29.10.07 08:49. Заголовок: Re:
В Делфи есть примеры (вроде не официальные ) по работе с Ехсел. Все аналогично по работе через буфер.Только там стоит еще процедура очистки и все ок. Сам пробовал, вопросов не было
|
|
|
|
| постоянный участник
|
Пост N: 2193
Зарегистрирован: 12.09.06
|
|
Отправлено: 03.05.12 00:14. Заголовок: Народ, а за время на..
Народ, а за время написания этой статьи не появились ли новые возможности БЫСТРОГО перегона DBF для EXCEL ? Появилась нужда 65 000 записей (25-30 столбцов/полей ) перегнать в простую таблицу EXCEL с простым заголовком. В какую сторону копать, чтобы не наткнутся на Статьи на форуме читал....
|
|
|
|
| постоянный участник
|
Пост N: 308
Зарегистрирован: 13.10.05
|
|
Отправлено: 03.05.12 09:40. Заголовок: А способ, который оп..
А способ, который описывает ММК не пробовал? Он должен быть достаточно быстрый (относительно)
|
|
|
|
| |
Пост N: 60
Зарегистрирован: 16.12.08
|
|
Отправлено: 03.05.12 10:18. Заголовок: Есть класс texcel ра..
|
|
|
|
| постоянный участник
|
Пост N: 2194
Зарегистрирован: 12.09.06
|
|
Отправлено: 03.05.12 11:31. Заголовок: santy пишет: Есть ..
santy пишет: цитата: | Есть класс texcel разработанный Marcelo Torres. |
| Что-то даже демка не работает ...
|
|
|
|
| постоянный участник
|
Пост N: 313
Зарегистрирован: 06.02.07
|
|
Отправлено: 03.05.12 11:38. Заголовок: Протестировал копипа..
Протестировал копипаст в Excel 2007 Вылетает (Error BASE/1004 Метод не экспортирован: SELECT) (Win XP, HMG Ext. 2.0.1) при попытке вставить в строку экселки с номером больше 65536 (64к). Т.ч. все работает в общем-то быстро (10'000 записей около 20 сек.) - но аппетиты по кол-ву вставляемых строк надо соразмерять :) Возможно, в 2010м Экселе этого ограничения нет?..
|
|
|
|
|
| постоянный участник
|
Пост N: 2195
Зарегистрирован: 12.09.06
|
|
Отправлено: 03.05.12 12:00. Заголовок: gustow пишет: Проте..
gustow пишет: цитата: | Протестировал копипаст в Excel 2007 |
| Пример в студию... gustow пишет: цитата: | Вылетает (Error BASE/1004 Метод не экспортирован: SELECT) (Win XP, HMG Ext. 2.0.1) при попытке вставить в строку экселки с номером больше 65536 (64к). |
| Т.е. записи больше 65536 не попадут в таблицу ?
|
|
|
|
| постоянный участник
|
Пост N: 314
Зарегистрирован: 06.02.07
|
|
Отправлено: 03.05.12 12:03. Заголовок: если надо кусок рабо..
если надо кусок рабочего примера (криворукий, конечно, но работает :) ) - держи: private gtim0 := seconds(), gtim1 // для тайминга use SPMESLPU codepage "RU866" new oSheet:Cells( 5, 1 ):Select() nRow00 := 5 // самая начальная строка, с которой вставляем nRow := 5 // текущая строка nRow0 := 5 // с какой строки вставлять очередной кусок do while .not.SPMESLPU->(EoF()) cClip := "" for j := 1 to 200 // чем больше буфер, тем быстрее // (НО! чем "шире" запись, тем легче упрёмся // в макс.длину строки = 65к... или неправ?) cClip := cClip + ; ltrim( str(SPMESLPU->LPU , 7, 0) ) + chr(9) + ; // еще бы (если десятичные точки есть) ltrim( str(SPMESLPU->MESBEG, 8, 0) ) + chr(9) + ; // заменять по ходу точки на запятые ltrim( str(SPMESLPU->MESEND, 8, 0) ) + chr(9) + ; // strtran( ... , ".", "," ) ltrim( dtoc(SPMESLPU->DBEG) ) + chr(9) + ; ltrim( dtoc(SPMESLPU->DEND) ) + chr(9) + ; ltrim( str(SPMESLPU->POCL , 2, 0) ) + chr(9) + ; ltrim( str(SPMESLPU->OTD , 4, 0) ) + chr(9) + ; ltrim( str(SPMESLPU->TYPEMS, 1, 0) ) skip nRow++ if SPMESLPU->(EoF()) exit endif if j < 200 cClip := cClip + chr(10) endif next j // копируем-вставляем CopyToClipboard( cClip ) // встаем на ту ячейку, начиная откуда надо вставлять oSheet:Cells( nRow0, 1 ):Select() // начиная с 1-й // вставляем из буфера обмена: oSheet:Paste() if .not.SPMESLPU->(EoF()) nRow0 := nRow endif enddo // выделяем весь диапазон вставленного oSel:=oSheet:Range( "A" + ltrim(str( nRow00, 0 )) + ":H" + ltrim(str( nRow-1, 0 )) ) oSel:VerticalAlignment := xlTop oSel:Rows:AutoFit() oSheet:Cells( 4, 1 ):Select() // ставим курсор (в этом листе) над шапкой gtim1 := seconds() close SPMESLPU MsgInfo("Тайминг: " + ltrim(str(gtim1-gtim0, 1)) + " сек." )
|
|
|
|
| постоянный участник
|
Пост N: 315
Зарегистрирован: 06.02.07
|
|
Отправлено: 03.05.12 12:08. Заголовок: Andrey пишет: Т.е. ..
Andrey пишет: цитата: | Т.е. записи больше 65536 не попадут в таблицу ? |
|
В 2007м, получается, что нет :(( Может, я неправ?.. но пока так выходит....
|
|
|
|
| постоянный участник
|
Пост N: 2196
Зарегистрирован: 12.09.06
|
|
Отправлено: 03.05.12 13:08. Заголовок: А как к этой таблице..
А как к этой таблице заголовки (на русском) приделать и название таблицы сделать (типа МОЯ ТАБЛИЦА - шрифт побольше) ?
|
|
|
|
| постоянный участник
|
Пост N: 316
Зарегистрирован: 06.02.07
|
|
Отправлено: 03.05.12 14:54. Заголовок: Ну что-то типа (корр..
Ну что-то типа (коррекция примера начиная с "enddo"): enddo // выделяем весь диапазон вставленного oSel:=oSheet:Range( Diapazon( "A", nRow0, "H", nRow-1 ) ) oSel:VerticalAlignment := xlTop oSel:Rows:AutoFit() // выделяем ячейки во 2-й строке для заголовка над таблицей oSel:=oSheet:Range( "A2:H2" ) // объединяем ячейки oSel:Merge() // заголовок над таблицей oSheet:Cells( 2, 1 ):Value := "Список лицензированных МЭС для всех ЛПУ" // заголовки для колонок oSheet:Cells( 4, 1 ):Value := "Код ЛПУ" oSheet:Cells( 4, 2 ):Value := "Нач. код МЭС" oSheet:Cells( 4, 3 ):Value := "Кон. код МЭС" oSheet:Cells( 4, 4 ):Value := "Нач. дата" oSheet:Cells( 4, 5 ):Value := "Кон. дата" oSheet:Cells( 4, 6 ):Value := "Поколение" oSheet:Cells( 4, 7 ):Value := "Отделение" oSheet:Cells( 4, 8 ):Value := "Тип МС" // выделяем общий и колоночные заголовки oSel:=oSheet:Range( "A2:H4" ) oSel:VerticalAlignment := xlCenter oSel:HorizontalAlignment := xlCenter // заголовки полужирно oSel:Font:Bold := .T. oSel:Rows:AutoFit() oSheet:Cells( 4, 1 ):Select() // ставим курсор (в этом листе) над шапкой gtim1:=seconds() // тайминг close SPMESLPU Или, наоборот, все дела про заголовки сделать ДО "do while ..." - а потом встал на ячейку, откуда начинать вставлять, и погнали наши городских... :)
|
|
|
|
| постоянный участник
|
Пост N: 2197
Зарегистрирован: 12.09.06
|
|
Отправлено: 03.05.12 15:00. Заголовок: gustow пишет: если..
gustow пишет: цитата: | если надо кусок рабочего примера |
| Спасибо БОЛЬШОЕ !
|
|
|
|
| постоянный участник
|
Пост N: 317
Зарегистрирован: 06.02.07
|
|
Отправлено: 03.05.12 15:02. Заголовок: шрифт у общего (надт..
шрифт у общего (надтабличного) заголовка побольше: // выделяем ячейки во 2-й строке для заголовка над таблицей oSel:=oSheet:Range( "A2:H2" ) // объединяем ячейки oSel:Merge() oSel:Font:Size := 14 // заголовок над таблицей oSheet:Cells( 2, 1 ):Value := "Список лицензированных МЭС для всех ЛПУ"
|
|
|
|
| постоянный участник
|
Пост N: 2198
Зарегистрирован: 12.09.06
|
|
Отправлено: 03.05.12 17:15. Заголовок: gustow пишет: oShe..
gustow пишет: цитата: | oSheet:Cells( 5, 1 ):Select() |
| gustow пишет: цитата: | // выделяем весь диапазон вставленного oSel:=oSheet:Range( "A" + ltrim(str( nRow00, 0 )) + ":H" + ltrim(str( nRow-1, 0 )) ) oSel:VerticalAlignment := xlTop oSel:Rows:AutoFit() |
| Немного запутался... oSel: это oSel := oExcel:ActiveSheet() Просто нет в начале открытия ОЛЕ... Каждый по разному открывает... Приведи пожалуйста кусок открытия ОЛЕ ! И как потом результат в файл сохранить ?
|
|
|
|
| постоянный участник
|
Пост N: 318
Зарегистрирован: 06.02.07
|
|
Отправлено: 04.05.12 06:48. Заголовок: Звиняйте, батьку :) ..
Звиняйте, батьку :) думал, понятно (потому как "стандартно"). В начале (открытие OLE) банально так: oExcel := TOleAuto():New( "Excel.Application" ) if Ole2TxtError() != 'S_OK' MsgStop('А у вас не установлен MS Excel !', "Ай-яй-яй! Низззяяяя..." ) Return Nil endif oExcel:Visible := .F. // невидимость Эксела при формировании // (хотя тут тестил БЕЗ невидимости - все равно быстро) //oExcel:ScreenUpdating := .F. // выключил прорисовку листа (ускоряет) // отменить автоматическую калькуляцию формул (ускоряет) //oExcel:Calculation := xlManual oExcel:WorkBooks:Add() oBook := oExcel:Get("ActiveWorkBook") oSheet := oExcel:Get( "ActiveSheet" ) ... oSheet:Cells( 5, 1 ):Select() и т.д. И уже selection'ы диапазонов ячеек (называя указатель на выделенный диапазон как oSel) делаю (в данном случае) в этом конкретном текущем листе, который oSheet. Извиняй, может запутал ненамеренно... :) Сохранение в файл в большинстве случаев я как раз не делаю - потому как просто Excel делаю видимым и показываю пользователю, ЧТО вывелось в пока еще безымянную экселку; а он потом, если надо, сам "сохранит как", распечатает и т.п. (зачем винчестер мусором загаживать - сперва "сохранив как"... а вдруг не надо было вообще?) А если надо автоматом "сохранить в файл с предписанным именем и закрыться без вопросов", то так, например: ... oBook:SaveAs( fold + "\" +"Список МУ.xls", xlExcel8 ) // сохранить в формате "совместимый с Excel 97-2003" (xlExcel8 = 56) // если сохранить "в формате по умолчанию", параметр опускаем // "fold" - папка, куда сохраняем (например, где-то выше "fold:=GetCurrentFolder()" ) oBook:Close(0) // закрыть БЕЗ вопросов о сохранении oExcel:Quit() // закрываем сеанс OLE oSheet:=Nil // зачищаем следы антигосударственной деятельности oBook:=Nil // не думаю, что это уж так обязательно - но вдруг неправ? oExcel:=Nil что-то вроде этого...
|
|
|
|
| постоянный участник
|
Пост N: 2199
Зарегистрирован: 12.09.06
|
|
Отправлено: 04.05.12 07:34. Заголовок: gustow пишет: что-т..
gustow пишет: Спасибо БОЛЬШОЕ !
|
|
|
|
|
| постоянный участник
|
Пост N: 319
Зарегистрирован: 06.02.07
|
|
Отправлено: 04.05.12 09:08. Заголовок: Во! :) А теперь на о..
Во! :) А теперь на основе этого "ликбеза" надо, думаю, написать главку в Викикнигу про Харбор (назвав типа "Харбор и Эксел"). Кто б подмог из "техписо-способных"?
|
|
|
Ответов - 32
, стр:
1
2
All
[только новые]
|
|