Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / PowerBuilder Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2 3 4   вперед  Ctrl      все
 Экспорт Datawindow в Excel  [new]
ZiZu
Member

Откуда: Донецк
Сообщений: 76
Сам занимался подобной задачей при экспорте отчетов, а сегодня наткнулся на изящное решение:

///////////////////////////////////////////////////////////////////////////////////////////////////////
// Converting DataWindow to Excel file
///////////////////////////////////////////////////////////////////////////////////////////////////////
// Export DataWindow to Excel including computed-columns, headers, footers, groups, text labels, etc...
///////////////////////////////////////////////////////////////////////////////////////////////////////
// ... Init docname
// ... GetFileOpenName or any other method
//
IF dw.SaveAs( docname, HTMLTable!, TRUE ) = -1 THEN
MessageBox("Warning", "Unable to export data. Error writing to file!", Exclamation!)
RETURN ;
END IF ;
//
// Convert HTML file to Excel native format
OLEObject Excel ;
//
Excel = CREATE OLEObject ;
//
IF Excel.ConnectToObject( docname ) = 0 THEN
Excel.Application.DisplayAlerts = FALSE ;
Excel.Application.Workbooks( 1 ).Parent.Windows( excel.Application.workbooks( 1 ).Name ).Visible = TRUE ;
Excel.Application.Workbooks( 1 ).SaveAs(docname, 39 ) ;
Excel.Application.Workbooks( 1 ).Close() ;
END IF ;
//
DESTROY excel
//
// ...Done

Еще много интересного можно взять http://groups.yahoo.com/group/PowerObject/
Только там нужно зарегестрироваться
16 дек 03, 19:14    [462315]     Ответить | Цитировать Сообщить модератору
 Re: Экспорт Datawindow в Excel  [new]
Филипп
Member

Откуда: Boston, MA, USA (c 1989 ) б. Москва
Сообщений: 1880
Так оно получше будет:

$PBExportHeader$gf_save_dw_as_excel.srf

$PBExportComments$savedwtoexcel
global type gf_save_dw_as_excel from function_object
end type

forward prototypes
global function integer gf_save_dw_as_excel (datawindow p_dw)
end prototypes

global function integer gf_save_dw_as_excel (datawindow p_dw);/*------------------------------------------------------------------------------

Function: gf_Save_dw_as_excel

Returns: Integer

Parameters: DataWindow p_dw to be save as Excel via HTML

Copyright © 1998-2001 DTI - Michael Nadar

Date Created: December 1, 1998

Description: PB default save as excel sheet only saves the column list. This
method of saving to excel involves saving the dw as a html and then
saving as excel via ole. This preserves the formatting and also
saves the dw computed columns to the spreadsheet. PB's save as excel
does not save computed columns.

--------------------------------------------------------------------------------
Modifications:
Date Author Comments
02/23/1999 MXN 1) Move creation of ole below the saving of htm string to a
file code, since this has some RETURN - 1's
2) Window Appears to be frozen while excel is loading the
the .htm file. So put an hourglass around this.
11/14/2001 P. Salgannik

10/23/2002 P. Salgannik DO NOT use this function from response windows!!!!
(unless it's being called from closing of the response window)
------------------------------------------------------------------------------*/



string ls_type, ls_name, ls_html_name, ls_html, ls_html_parse
string ls_excel_report_name, ls_secured_directory_check, ls_print_ind
integer li_filenumber, li_bytes, li_loop, li
integer li_rc
long ll_stringlen, ll_start, LL_EXCEL_STANDARD_FILE_TYPE
ulong ll_handle, ll_rc
string ls_rc
boolean lb_exists
oleobject lole_excel, lole_workbook
//Pointer OldPointer
LL_EXCEL_STANDARD_FILE_TYPE = -4143


// Get The directory in which to save the report
string ls_dir, ls_file
li_rc = GetFileSaveName('Save As Excel', ls_dir,ls_file, 'XLS','Excel,*.xls')
IF li_rc = 0 THEN RETURN -1

IF FileExists(ls_dir) THEN
lb_exists = TRUE
IF f_message_box("Save As", ls_dir + " already exists.~r~nDo you want to replace it?", &
Exclamation!, YesNo!, 2) = 2 THEN
RETURN -1
END IF

END IF


// Next Two Modifys are not supported in PB 5.0 , so comment them
//11/14/2001 P. Salgannik Uncommented - works fine, generates borders
//06/21/2002 P. Salgannik commented again - HTML generation in PB8 is way up higher then
//Excel 97's support for HTML, works fine in Excel 2000
//ls_rc = p_dw.Modify("datawindow.htmlTable.generateCSS = '
yes'")
//ls_rc = p_dw.Modify("datawindow.htmlTable.nowrap = '
no'")
//
ls_html = trim(p_dw.object.datawindow.data.htmltable)
If IsNull(ls_html) THEN RETURN -1
IF Len(ls_html) < 1 THEN RETURN -1


//ll_rc = gnv_app.inv_win32.of_SetCapture(handle(p_dw))
SetPointer(HourGlass!)

IF lb_exists THEN
FileDelete(ls_dir)
END IF

// the Saveas htmltable! only worked up until the html table reached 83K. After that
// different "stuff" appears in the stylesheet property. By doing a filewrite this
// problem was elimanated.

li = Len(ls_dir)
ls_html_name = Mid(ls_dir, 1,li - 4) + ".htm"



ll_stringlen = len(ls_html)


If ll_stringlen > 32765 Then
If Mod(ll_stringlen, 32765) = 0 Then
li_loop = ll_stringlen / 32765
Else
li_loop = (ll_stringlen / 32765) + 1
End if
Else
li_loop = 1
End if

li_fileNumber = FileOpen(ls_html_name, Streammode!, Write!, LockReadWrite!, Replace!)

IF li_fileNumber >= 0 THEN
ll_start = 1
FOR li = 1 to li_loop
ls_html_parse = Mid(ls_html,ll_start,32765)
IF FileWrite(li_filenumber, ls_html_parse) = -1 THEN
FileClose(li_filenumber)
//gnv_app.inv_win32.of_ReleaseCapture()
RETURN -1
END IF
ll_start += 32765
NEXT
ELSE
//gnv_app.inv_win32.of_ReleaseCapture()
RETURN -1
END IF
FileClose(li_filenumber)


//save as excel
//for some reason doing a li_rc = lole_excel.application.workbooks.open(ls_html_name) would
//cause the application to hang. This is true for any command used trying to perform an
//excel function. (SaveAs, Open or Close)

//!!!! That'
s because all these methods return ole objects NOT error codes - P.Salgannik 11/14/2001

// lole_excel is a standard user object of type oleobject
lole_excel = create oleobject
// li_rc = lole_excel.ConnectToNewObject("excel.application.8") SJZ removed .8 to use current version of Excel
li_rc = lole_excel.ConnectToNewObject("excel.application")

IF li_rc <> 0 THEN
destroy lole_excel
//gnv_app.inv_win32.of_ReleaseCapture()
RETURN -1
END IF

lole_workbook = lole_excel.application.workbooks.open(ls_html_name)
IF NOT ISValid(lole_workbook) THEN
lole_excel.application.quit
lole_excel.DisconnectObject()
destroy lole_excel
//gnv_app.inv_win32.of_ReleaseCapture()
RETURN -1
END IF

lole_workbook.saveas(ls_dir,LL_EXCEL_STANDARD_FILE_TYPE)
// 6/20/02 P. Salgannik if you don't close(), the spreadsheet remains in read-only state,
// even after closing this application and excel
lole_workbook.close()

//delete html file !!!!!!!!!
IF fileexists(ls_html_name) THEN
filedelete(ls_html_name)
END IF

lole_workbook.DisconnectObject()
lole_excel.application.quit
lole_excel.DisconnectObject()
DESTROY lole_workbook
destroy lole_excel
//gnv_app.inv_win32.of_ReleaseCapture()

RETURN 1
end function
16 дек 03, 19:42    [462344]     Ответить | Цитировать Сообщить модератору
 Re: Экспорт Datawindow в Excel  [new]
Филипп
Member

Откуда: Boston, MA, USA (c 1989 ) б. Москва
Сообщений: 1880
...ну и f_message_box на стандартный заменить...
16 дек 03, 19:44    [462347]     Ответить | Цитировать Сообщить модератору
 Re: Экспорт Datawindow в Excel  [new]
Локшин Марк
Member

Откуда: Воронеж
Сообщений: 3154
А я просто сохраняю в HTML - можно открывать не только из Excel'я, но и из других приложений,кроме того не требуется установленный Excel на компьютере с нашим запущенным приложением. Так что я сохранение именно в Excel делал бы, как минимум, опциональным.
Да, и еще. При таком сохранении вид отчета 1 к одному передать очень часто не удается :(
17 дек 03, 10:01    [462682]     Ответить | Цитировать Сообщить модератору
 Re: Экспорт Datawindow в Excel  [new]
ZiZu
Member

Откуда: Донецк
Сообщений: 76
Да, точной передачи дизайна отчета так просто не получается.
Я для этого делал экспорт Tabular Datawindow (все отчеты у меня такие)
по одной ячейке, сам устанавливал бордеры, ширину, длину, вычитывал заголовки и т.д., на больших отчетах все жутко медленно происходит :( А есть вообще такая приблуда, что datawindow 1 к 1-му перегоняет в офисные приложения? (excel, word) Вот например ребята которые делают Preport для Delphi как-то по хитрому экспортят не используя OLE... Может кто-то занимался подобным?
17 дек 03, 11:05    [462842]     Ответить | Цитировать Сообщить модератору
 Re: Экспорт Datawindow в Excel  [new]
ZiZu
Member

Откуда: Донецк
Сообщений: 76
Вот инфа с их сайта http://vtktools.ru/:
vtkExport - This library is intended for export into Excel & HTML formats. Generating of the XLS file runs without using DDE, OLE. That’s why a high speed of export is reached.

The export method is simple – you generate object TvteXLSWorkBook, which has properties & methods similar to properties & methods of OLE from Excel server, & call it’s method SaveAsXLS or SaveAsHTML. You can read about vtkExport possibilities more particularly here.

А как это они делают непойму...
17 дек 03, 11:24    [462894]     Ответить | Цитировать Сообщить модератору
 Re: Экспорт Datawindow в Excel  [new]
Локшин Марк
Member

Откуда: Воронеж
Сообщений: 3154
Я тоже делал что-то типа такого, но перегонял в HTML и использовал шаблоны которые строил автоматически по заданному DW. Получается гораздо быстрее, чем для каждой ячейки expression'ы вычислять, и выглядит правдоподобно, правда expression'ы на x,y,height,width жизнь немного портят.

А экспорт 1 в 1 произвольного DataWindow, как я думаю, не получится, т.к. в DataWindow можно объекты один на другой накладывать, и я слабо представляю как тоже самое сделать, допустим, в Excel'е или HTML'е.
17 дек 03, 11:25    [462897]     Ответить | Цитировать Сообщить модератору
 Re: Экспорт Datawindow в Excel  [new]
AndrewN
Member

Откуда: W4
Сообщений: 119
Ещё можно форматирование ячеек и всё остальное через OLE, а данные через Clipboard передавать. Очень быстро.
8 янв 04, 11:23    [483776]     Ответить | Цитировать Сообщить модератору
 Re: Экспорт Datawindow в Excel  [new]
Локшин Марк
Member

Откуда: Воронеж
Сообщений: 3154
>Ещё можно форматирование ячеек и всё остальное через OLE, а данные
>через Clipboard передавать. Очень быстро.
В этом способе есть один недостаток (может его можно как-то обойти, но я не знаю) - данные в Clipboard может испортить, к примеру, сам пользователь (если сам в процессе передачи данных что-то делает).
8 янв 04, 11:46    [483813]     Ответить | Цитировать Сообщить модератору
 Re: Экспорт Datawindow в Excel  [new]
Anatoly Moskovsky
Member

Откуда: Odessa
Сообщений: 6610
Через HTML или OLE не всегда возможно экспортировать - при больших объемах начинаются тормоза и глюки.

Здесь есть компоненты для PB, где этих проблем нет:
- PB2XLS - создание EXCEL файлов напрямую(без OLE, HTML и т.д.)
- DW2XLS - экспорт DW с использованием PB2XLS

платное
8 янв 04, 12:50    [483952]     Ответить | Цитировать Сообщить модератору
 Re: Экспорт Datawindow в Excel  [new]
Локшин Марк
Member

Откуда: Воронеж
Сообщений: 3154
>Через HTML или OLE не всегда возможно экспортировать - при больших
>объемах начинаются тормоза и глюки.
Ну не знаю какие тормоза и глюки, но 35 страниц этот компонент выкинул в xls за 3m 10s, мой экспорт в html сработал за 4m 50s. После этого оба файла нормально открылись в Excel.
К тому же в некоторых отчетах он хуже внешний вид передает (к примеру - не учитывает expression'ы на начертание шрифта), высоту Detail Band'а и т. д. Правда на таком отчете мой экспорт работал раза в 4 дольше :)

Эх, знал бы я формат *.psr у меня бы экспорт просто летал.
8 янв 04, 14:34    [484138]     Ответить | Цитировать Сообщить модератору
 Re: Экспорт Datawindow в Excel  [new]
Anatoly Moskovsky
Member

Откуда: Odessa
Сообщений: 6610
Локшин Марк
Ну не знаю какие тормоза и глюки

При экспорте через OLE - Excel подвисал, приходилось перегужать комп.
При импорте больших HTML в Excel - большой расход памяти, свопинг.
Все это с Офис97, может в других версиях и не было такого.

Локшин Марк
Эх, знал бы я формат *.psr у меня бы экспорт просто летал.

Хе-хе :))
8 янв 04, 15:18    [484253]     Ответить | Цитировать Сообщить модератору
 Re: Экспорт Datawindow в Excel  [new]
Локшин Марк
Member

Откуда: Воронеж
Сообщений: 3154
>При импорте больших HTML в Excel - большой расход памяти, свопинг.
>Все это с Офис97, может в других версиях и не было такого.
Есть такое дело, но зато IE влет открывает :)

> Локшин Марк
> Эх, знал бы я формат *.psr у меня бы экспорт просто летал.
>Хе-хе :))
Что означает ваше "хе-хе" ?
8 янв 04, 15:52    [484359]     Ответить | Цитировать Сообщить модератору
 Re: Экспорт Datawindow в Excel  [new]
Anatoly Moskovsky
Member

Откуда: Odessa
Сообщений: 6610
автор
Что означает ваше "хе-хе" ?

При наличии большого желания (или денег :)) можно получить эту информацию.

Например. Обращаешься в Sybase, говоришь, что ты ISV и для твоего приложения требуется такая-то информация, обязуешься не разглашать и т.д.

Есть и другие способы...
:)
8 янв 04, 16:03    [484384]     Ответить | Цитировать Сообщить модератору
 Re: Экспорт Datawindow в Excel  [new]
AndrewN
Member

Откуда: W4
Сообщений: 119
Локшин Марк

>Ещё можно форматирование ячеек и всё остальное через OLE, а данные
>через Clipboard передавать. Очень быстро.
В этом способе есть один недостаток (может его можно как-то обойти, но я не знаю) - данные в Clipboard может испортить, к примеру, сам пользователь (если сам в процессе передачи данных что-то делает).


А слабо на практике "испортить" данные в Клипборде?
Если в коде между двумя вызовами нет больше никаких операций.
Например:

dw.SaveAs....
OLEObject.Paste...


Надо очень сильно постараться. ;) А работает действительно мухой, даже на очень больших объемах.
19 янв 04, 18:34    [497766]     Ответить | Цитировать Сообщить модератору
 Re: Экспорт Datawindow в Excel  [new]
Nikulitsa
Member

Откуда:
Сообщений: 3
автор
Ещё можно форматирование ячеек и всё остальное через OLE, а данные через Clipboard передавать. Очень быстро.

В данном методе есть несколько недостатков.
1. Для больших отчетов форматирование ячеек через OLE занимает очень много времени
2. Подготовка данных для передачи через Clipboard тоже весьма
непростая задача, особенно если Datawindow группированный
3. Написать универсальную процедуру, которая бы таким способом экспортировала в Excel достаточно трудоемко (если конечно не ограниваться
только простыми случаями вроде тривиального Grid или Columnar)
автор
А я просто сохраняю в HTML - можно открывать не только из Excel'я, но и из других приложений,кроме того не требуется установленный Excel на компьютере с нашим запущенным приложением.

Открыть то его можно, но работать с таким отчетом в Excel - весьма неблагодарное занятие.
1. Форматирование ячеек практически не сохраняется
2. Расположение ячеек и их размеры тоже весьма далеки от оригинала
3. А с данными вообще происходит полный кошмар:
  • некоторые строки почему-то превращаются в даты
  • числа - в строки, из которых потом прийдется удалить разделитель тысячных разрядов если вы захотите их просуммировать
    От такого способа лучше сразу отказаться так как кроме головной боли он вам ничего хорошего не принесет

    Единственный способ получить качественный экспорт в Excel - это использовать OLE, но и тут надо быть готовым к сюрпризам. Разные версии Excel ведут себя по разному. Если ваш скрипт экспорта работает с Excel 97 это не значит что он будет работать с Excel 2000.

    Что касается библиотеки DW2XLS
    она конечно имеет некоторые недостатки, но она достаточно успешно решает
    все перечисленные проблемы
  • 20 янв 04, 00:59    [498000]     Ответить | Цитировать Сообщить модератору
     Re: Экспорт Datawindow в Excel  [new]
    Локшин Марк
    Member

    Откуда: Воронеж
    Сообщений: 3154
    >Открыть то его можно, но работать с таким отчетом в Excel - весьма
    >неблагодарное занятие.
    >1. Форматирование ячеек практически не сохраняется
    >2. Расположение ячеек и их размеры тоже весьма далеки от оригинала
    ...
    >От такого способа лучше сразу отказаться так как кроме головной боли он
    >вам ничего хорошего не принесет

    Ну я же его не через dw_1.SaveAs(...) сохраняю. Все получается веьма культурно. Зачастую вид один к одному.
    20 янв 04, 10:37    [498302]     Ответить | Цитировать Сообщить модератору
     Re: Экспорт Datawindow в Excel  [new]
    Nikulitsa
    Member

    Откуда:
    Сообщений: 3
    автор
    Ну я же его не через dw_1.SaveAs(...) сохраняю. Все получается веьма культурно. Зачастую вид один к одному.

    Форматирование ячеек - это не главная проблема
    главная проблема в том что Excel не может правильно распознать тип данных
    в ячейке.
    и строки вида '01-02' преобразуются в даты
    числа отформатированные с тысячным разделителем например: 1 300.00
    или 1,300.00 будут восприняты как строки "1 300.00" и "1,300.00"
    20 янв 04, 16:41    [499380]     Ответить | Цитировать Сообщить модератору
     Re: Экспорт Datawindow в Excel  [new]
    A709
    Member

    Откуда:
    Сообщений: 5
    А возможно ли выполнить экспорт datawindow практически без искажений?
    В частности, сохранить печатную форму счета, где искажения недопустимы?
    Кто нибудь решал такую задачу?
    5 фев 04, 09:52    [521794]     Ответить | Цитировать Сообщить модератору
     Re: Экспорт Datawindow в Excel  [new]
    A709
    Member

    Откуда:
    Сообщений: 5
    Необходимо выполнить разовую работу по экспорту datawindow - печатной формы счета - в файл. В какой срок и за какие деньги это можно сделать?
    5 фев 04, 10:08    [521831]     Ответить | Цитировать Сообщить модератору
     Re: Экспорт Datawindow в Excel  [new]
    Локшин Марк
    Member

    Откуда: Воронеж
    Сообщений: 3154
    Ой, забыл ответить. :)
    to Nikulitsa
    автор
    главная проблема в том что Excel не может правильно распознать тип данных
    в ячейке.
    и строки вида '01-02' преобразуются в даты

    все проблемы решаются при помощи явного указания формата,
    к примеру для строк вида '01-02' нужно задать в стиле ячейки формат
    mso-number-format:"\@"
    5 фев 04, 10:43    [521904]     Ответить | Цитировать Сообщить модератору
    Между сообщениями интервал более 1 года.
     Re: Экспорт Datawindow в Excel  [new]
    Дремучий
    Member

    Откуда:
    Сообщений: 122
    Во втором сообщении этой темы Филипп предложил вариант переброски в Excel через HTML.
    У меня есть маленькая проблема. То DW, что я экспортирую, содержит колонку с данными отображающимися как checkbox. В результате в Excel пользователь видит checkbox в этой колонке, но он смещен влево и имеет слишком большие размеры (наплывает на границы)... можно ли как нибудь это поправить?

    Как это выглядит можно увидеть во вложенном рисунке.

    К сообщению приложен файл. Размер - 0Kb
    13 окт 05, 17:33    [1967106]     Ответить | Цитировать Сообщить модератору
     Re: Экспорт Datawindow в Excel  [new]
    Дремучий
    Member

    Откуда:
    Сообщений: 122
    Хорошо! Поставим вопрос по иному:

    Кто нибудь перебрасывал dw со стобцом\ами типа checkbox в Excel?
    14 окт 05, 18:35    [1971465]     Ответить | Цитировать Сообщить модератору
     Re: Экспорт Datawindow в Excel  [new]
    Dim2000
    Member

    Откуда: Москва
    Сообщений: 5318

    Дремучий wrote:

    > Кто нибудь перебрасывал dw со стобцом\ами типа checkbox в Excel?

    Перебрасывал, но не через HTML, а ручками. Для эмуляции включённого
    checkbox-а проканывает "ь" в шрифте Wingdings. Помогло ;)?

    Posted via ActualForum NNTP Server 1.3

    14 окт 05, 18:47    [1971485]     Ответить | Цитировать Сообщить модератору
     Re: Экспорт Datawindow в Excel  [new]
    Дремучий
    Member

    Откуда:
    Сообщений: 122
    Dim2000
    Перебрасывал, но не через HTML, а ручками. Для эмуляции включённого checkbox-а проканывает "ь" в шрифте Wingdings. Помогло ;)?

    :( У меня используется наше расширение DW. Мне надо подправить общую функцию переброски. Честно говоря, я надеялся на информацию как ручками подправить переброшенные checkbox`ы. Фактически, там нужно каждому уменьшить размер и отцентрировать. А вот синтаксис этого (из PB) я никак не могу понять... :(

    Мысль переписань к черту всю процедуру переброски на "ручками" я пока держу в запасе :(.
    17 окт 05, 11:12    [1974184]     Ответить | Цитировать Сообщить модератору
    Топик располагается на нескольких страницах: [1] 2 3 4   вперед  Ctrl      все
    Все форумы / PowerBuilder Ответить