CAFE

파워빌더 공부

엑셀 내보내기 속도 올리기

작성자파빌신|작성시간17.03.24|조회수1,475 목록 댓글 2

엑셀 내보내기 속도 올리기


1. 구조체 선언

type str_cols from structure

string title

string colname

string coltype

integer colalignment

string ColFormat

end type


2. 구조체 값 설정 함수 만들기

/* Header와 컬럼, 형식, 정렬, 포멧 의 목록을 만든다

각자 상황에 맞도록

*/

//integer f_GetNM_Cl1(Ref str_Cols as_Cols[] )

str_Cols ls_Null[]

integer icnt

as_Cols[] = ls_Null[]


icnt = UpperBound(as_Cols[]) + 1

as_Cols[icnt].Title   = '구분'

as_Cols[icnt].ColName = 'Column01'

as_Cols[icnt].ColType = 'EDIT'    // 그냥 값을 읽는다.

as_Cols[icnt].ColAlignment = 2

as_Cols[icnt].ColFormat = ""


as_Cols[icnt].Title   = '컬럼값'

as_Cols[icnt].ColName = 'Column01'

as_Cols[icnt].ColType = 'DDDW'    // DDDW Display 값을 읽는다.

as_Cols[icnt].ColAlignment = 2

as_Cols[icnt].ColFormat = ""


as_Cols[icnt].Title   = '자료1'

as_Cols[icnt].ColName = 'Column02'

as_Cols[icnt].ColType = 'DDLB'    // DDLB Display 값을 읽는다.

as_Cols[icnt].ColAlignment = 2

as_Cols[icnt].ColFormat = ""       // 엑셀의 포멧 형식을 작성한다.


return UpperBound(as_Cols[])


3. DataWindow 값을 읽어 들이는 함수 및 보조  만들기

/* 

컬럼의 값을 반환

*/

//any f_GetItem(datawindow adwobj,long row, string column) 

any la_data

choose case f_Getcoltype (adwobj, column )

case 'decimal', 'real'

la_data = adwobj.getitemdecimal(row,column)

Case 'number', 'long', 'ulong', 'integer', 'int'

la_data = adwobj.getitemnumber(row,column)

case 'char'

la_data = adwobj.getitemstring(row,column)

case 'time'

la_data = adwobj.getitemtime(row,column)

case 'date'

la_data = adwobj.getitemdate(row,column)

case 'datetime'

la_data = adwobj.getitemdatetime(row,column)

end choose

return la_data


/* string f_Getcoltype (datawindow adw, string ascolumn) */

string ls_type

ls_type = adw.Describe(asColumn+".ColType")

if pos(ls_type, '(') > 0 then

ls_type = Left( ls_type, pos(ls_type, '(') - 1 )

end if

return ls_type


/* string f_IsNull (string as_string)  */

if isNull(as_string) then

return ''

else

return as_string

end if


/* f_excelcolumtoalphabet 는  http://cafe.daum.net/SWShin/N7Ql/310  참조*/


/* string of_dddw_data( datawindow ad_datawindow, long al_row, string as_column_name )

dddw에 디스플레이 된값을 가져오는 함수이다.

반환은 String값이며 DataWindow와 Row 값, 컬럼의 이름을 주면 된다.

*/

any la_any

string ls_dispcol, ls_codecol, ls_coltype

String ls_return

long ll_frow

datawindowchild dwc


la_any = f_GetItem(ad_datawindow, al_row, as_column_name)

ad_datawindow.getchild(as_column_name, dwc)

ls_dispcol = ad_datawindow.describe(as_column_name + ".DDDW.DisplayColumn")

ls_codecol = ad_datawindow.describe(as_column_name + ".DDDW.DataColumn")

ls_coltype = dwc.describe(ls_codecol + ".coltype")

if pos(ls_coltype,'char') > 0 or pos(ls_coltype,'date') > 0 or pos(ls_coltype,'datetime') > 0 then

ll_frow = dwc.find(ls_codecol + " = '" + string(la_any) + "'", 1, dwc.rowcount())

else

ll_frow = dwc.find(ls_codecol + ' = ' + string(la_any), 1, dwc.rowcount())

end if

if ll_frow > 0 then

ls_coltype = dwc.describe(ls_dispcol + ".coltype")

if pos(ls_coltype,'(') > 0 then ls_coltype = left(ls_coltype,pos(ls_coltype,'(') - 1)

choose case ls_coltype

case 'decimal', 'real'

la_any = dwc.getitemdecimal(ll_frow,ls_dispcol)

ls_return = string(la_any, "#,###")

Case 'number', 'long'

la_any = dwc.getitemnumber(ll_frow,ls_dispcol)

ls_return = string(la_any, "#,###")

case 'char'

la_any = dwc.getitemstring(ll_frow,ls_dispcol)

ls_return = string(la_any)

case 'time'

la_any = dwc.getitemtime(ll_frow,ls_dispcol)

ls_return = string(la_any, "HH:MM:SS")

case 'date'

la_any = dwc.getitemdate(ll_frow,ls_dispcol)

ls_return = string(la_any, "YYYY-MM-DD")

case 'datetime'

la_any = dwc.getitemdatetime(ll_frow,ls_dispcol)

ls_return = string(la_any, "YYYY-MM-DD HH:MM:SS")

end choose

end if

return ls_return


/* string f_ddlb_data(datawindow adw, string : column, data) */

string ls_data, ls_rows[]

integer i

if IsValid(adw) then

ls_data = adw.Describe(column+".Values")

f_StringToArray(ls_data, '/', ls_rows)

for i = 1 to upperbound(ls_rows)

if f_nth(ls_rows[i],'~t',2) = data then

ls_data = f_nth(ls_rows[i],'~t',1)

end if

next

else

ls_data = ''

end if

return ls_data


/* int f_StringToArray( String : as_String, as_gchar, ref as_array[])

구분자로 되어 있는 String -> String Array

*/

String  ls_string, ls_Fs, ls_AS[]

long    lPos

as_array = ls_AS

ls_String = as_String + as_gchar

lPos = Pos(ls_String, as_gChar)

Do While lPos > 0

ls_Fs = Left(ls_String, lPos - 1)

if Not ( Trim(ls_Fs) = '' or IsNull(ls_Fs) ) then

ls_AS[UpperBound(ls_AS) + 1] = ls_Fs

end if

ls_String = Mid(ls_String, lPos + Len(as_gChar))

lPos = Pos(ls_String, as_gChar)

Loop

as_array = ls_AS

return UpperBound( as_array )


//===============================================

// 프로그램명 : 일정한 문자로 분리된 문자열에서 N번째 String 인출 Function

// 작  성  자 : 신성욱

// 최초작성일 : 1992/07/01

// 최종수정일 : 

// 비      고 : 

// String f_nth(string as_data, String as_Gubun, Integer al_nth)

//===============================================

String ls_rtn

Long ll_i, ll_strlen

Long ll_f, ll_t

if isNull(as_data) or isNull(al_nth) then

SetNull(ls_rtn)

return ls_rtn

end if

ll_f = 0

for ll_i = 1 to al_nth - 1

ll_f = Pos(as_data, as_Gubun, ll_f + 1)

if ll_f = 0 then

exit

end if

next

if ll_f = 0 and al_nth > 1 then

SetNull(ls_rtn)

return ls_rtn

end if

ll_t = Pos(as_data, as_Gubun, ll_f + 1)

if ll_t = 0 then

ll_t = Len(as_data) + 1

end if

if al_nth = 1 then

ls_rtn = String(Mid(as_data, ll_f + 1, ll_t - ll_f - 1))  //문자 1개짜리 구분자

else

ls_rtn = String(Mid(as_data, ll_f + len(as_Gubun), ll_t - ll_f - len(as_Gubun))) //단어로된 구분자

end if


return ls_rtn



4. 내보내기를 실행 한다.

OleObject myExcel, mySheet

Integer Start_Col, End_Col, i_Result, i

Long ll_row, ll_rowcnt, ll_y_row, ll_y_start

Any la_data

String ls_data

str_cols ls_Cols[]


if dw_print.rowcount() <= 0 then

MessageBox("확인","저장할 내역이 없습니다.")

Return

end if


myExcel = Create OleObject 

i_Result = myExcel.ConnectToNewObject( "excel.application" )

If i_Result <> 0 Then

MessageBox("확인","엑셀 프로그램을 찾을 수 없습니다.")

Destroy myExcel

Return

End if


//gf_waitpop(2, '준비 중...' ) //시작컬럼과 종료컬럼을 

Start_Col = 1

End_Col = uf_GetNM_Cl1(ls_Cols[]) + Start_Col - 1

//workbooks 추가

myoleobject.application.workbooks.add


// Sheet 정보 설정

mySheet = myoleobject.application.workbooks(1).worksheets(1)

mysheet.name = "Sheet이름"


// Title

ll_y_row = 1

mySheet.range(mySheet.cells(ll_y_row,Start_Col), mySheet.cells(ll_y_row,End_Col)).Merge

mySheet.range(mySheet.cells(ll_y_row,Start_Col), mySheet.cells(ll_y_row,End_Col)).HorizontalAlignment = 3

mySheet.range(mySheet.cells(ll_y_row,Start_Col), mySheet.cells(ll_y_row,End_Col)).Interior.Color = RGB(220,220,220)

mySheet.cells(ll_x_row,Start_Col).value = '제목을 넣어 주세요.'

mySheet.cells(ll_x_row,Start_Col).Font.Size = 15

mySheet.cells(ll_x_row,Start_Col).font.bold = true


// Header

ll_y_row ++

for i = 1 to End_Col

mySheet.cells(ll_y_row,i).value = ls_Cols[i].Title

mySheet.cells(ll_y_row,i).HorizontalAlignment = 3

next

// 자료 작성 시작

ll_y_row ++

ll_y_start = ll_y_row

ll_rowcnt = dw_print.rowcount()

for ll_row = 1 to ll_rowcnt

// 여기서부터 자료를 만드는 과정 입니다..... 실무에서 적당히 수정하고

for i = 1 to End_Col

choose case ls_Cols[i].ColType

case 'EDIT'

la_data = f_GetItem(dw_print,ll_row,ls_Cols[i].ColName)

case 'DDDW'

la_data = f_dddw_data(dw_print,ll_row,ls_Cols[i].ColName)

case 'DDLB'

la_data = f_GetItem(dw_print,ll_row,ls_Cols[i].ColName)

la_data = f_ddlb_data(dw_print,ls_Cols[i].ColName,la_data)

end choose

la_data = f_IsNull( String(la_data) )

ls_data += String(la_data)+'~t'

next

ls_data = Left(ls_data, Len(ls_data) - len('~t')) + '~n'

ll_y_row ++

next

ls_data = Left(ls_data, Len(ls_data) - len('~n'))

::Clipboard(ls_data)

mySheet.cells(ll_y_start,Start_Col).PasteSpecial


// 총 합

mySheet.range(mySheet.cells(ll_y_row,Start_Col), mySheet.cells(ll_y_row,9)).Merge

mySheet.range(mySheet.cells(ll_y_row,Start_Col), mySheet.cells(ll_y_row,9)).HorizontalAlignment = 4

mySheet.cells(ll_y_row,Start_Col).Value = '총 합 : '

mySheet.cells(ll_y_start,10).Formula = "=SUM("+ &

        f_excelcolumtoalphabet(10)+string(ll_y_start)+":"+&

        f_excelcolumtoalphabet(10)+String(ll_y_row - 1)+")"


// 마무리

//Line 

mySheet.range( mySheet.cells(ll_y_row - 1,Start_Col), mySheet.cells(ll_x_row,End_Col) ).borders.linestyle = 1

mySheet.range( mySheet.cells(ll_y_row,Start_Col), mySheet.cells(ll_x_row,End_Col) ).Font.Size = 9


//컬럼 Auto Width

mySheet.Columns(f_excelcolumtoalphabet(Start_Col)+':'+f_excelcolumtoalphabet(End_Col)).AutoFit


myExcel.application.visible = true 

Destroy mySheet

Destroy myExcel



** 끝 **

엑셀을 조금더 쉽게 만들수 있는 그날까지 .....

다음검색
현재 게시글 추가 기능 열기

댓글

댓글 리스트
  • 작성자짐승 | 작성시간 17.03.28 멋지네요
    감사합니다.
  • 작성자야구사랑 | 작성시간 17.03.31 아 정말 감사합니다
댓글 전체보기
맨위로

카페 검색

카페 검색어 입력폼