|
엑셀 내보내기 속도 올리기
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
** 끝 **
엑셀을 조금더 쉽게 만들수 있는 그날까지 .....
첫댓글 멋지네요
감사합니다.
아 정말 감사합니다