나름대로 엑셀 다운로드하는 펑션을 만들었는데....
도움이 되시길...
두가지의 경우로 만들어 봤습니다..
참고하시길......
1) 펑션 변수는 adw_source로 했고 타입은 datawindow로 하면 됩니다...
// FUNCTION : f_copy2excel
//
// DESCRIPTION : Datawindow를 Excel로 Copy한다.
//
// RETURN : String ,
///////////////////////////////////////////////////////////////////////////////
DataStore lds_excel
String ls_objects, ls_object[], ls_objtype[]
String ls_trailer[], ls_header[], ls_detail[], ls_summary[]
string ls_objname, ls_type, ls_band, ls_visible, ls_exp
String ls_colname , ls_coltype , ls_data , ls_filepath , ls_filename
Long ll_rowcount , I, J, k, t, a
integer li_pos, li_nextpos
Integer li_colcount, li_currentcol , li_visiblecol = 0 , li_rc
Boolean lb_fileexist
String ls_excelpath, ls_editstyle, coltype, ls_copydata
String ls_select, ls_select1, ls_object1[]
//-----------------------------------------------------------------------------
// 데이터윈도의 모든 오브젝트를 읽어온다.
//-----------------------------------------------------------------------------
ls_objects = adw_source.describe("Datawindow.objects" )
//-----------------------------------------------------------------------------
//오브젝트들을 탭을 구분으로 하나씩 분리해 저장한다.
//-----------------------------------------------------------------------------
li_pos = 1
do while(true)
i++
li_pos = li_nextpos + 1
li_nextpos = pos(ls_objects, '~t', li_pos)
if li_nextpos > 0 then
ls_object[i] = mid(ls_objects, li_pos, li_nextpos - li_pos)
else //맨 끝이면
ls_object[i] = mid(ls_objects, li_pos, len(ls_objects))
exit
end if
loop
IF i < 1 then Return 0
DataWindowChild ldwc_dw
a = 0
FOR k = 1 TO i
IF Left(ls_object[k],3) = 'dw_' THEN
adw_source.GetChild(ls_object[k], ldwc_dw)
a++
if f_excel1(ldwc_dw) <> 1 THEN
RETURN 0
END IF
END IF
NEXT
IF a > 0 THEN RETURN 1
//-----------------------------------------------------------------------------
// 오브젝트에서 column, compute, text인 것만 다시 저장한다.
//-----------------------------------------------------------------------------
for i = 1 to upperbound(ls_object)
ls_objname = trim(ls_object[i])
ls_type = upper(adw_source.describe( ls_objname + ".type" ))
ls_band = upper(adw_source.describe( ls_objname + ".band" ))
ls_visible = upper(adw_source.describe( ls_objname + ".visible" ))
IF ls_visible = '1' THEN
IF ls_type = "COLUMN" or ls_type = "COMPUTE" THEN
CHOOSE CASE ls_band
CASE 'DETAIL'
j++
ls_detail[j] = ls_objname
ls_objtype[j] = ls_type
ls_select = ls_select + "/" + ls_objname
// CASE 'SUMMARY'
// IF ISNULL(ls_objname) OR TRIM(ls_objname) = '' THEN
// ELSE
// t++
// ls_summary[t] = ls_objname
// ls_objtype[t] = ls_type
// END IF
END CHOOSE
END IF
END IF
next
IF J < 1 then return 0
adw_source.SetRedraw(false)
//컬럼의 순서를 알아내기 위한 작업을 한다.
ls_select = '1/1' + ls_select
adw_source.modify("datawindow.selected= '" + ls_select + "'")
ls_select = adw_source.describe("datawindow.selected")
ls_select1 = right(ls_select, len(ls_select) - 4)
ls_select1 = ls_select1 + '/'
adw_source.modify(" datawindow.selected=''")
adw_source.SetRedraw(true)
Long i_target, i_pos, object_max, ll_col
String detail_objects[]
String detail_object_labels
i_target = 0 ; i_pos = 1 ; j = 1
//각 컬럼의 이름을 배치된 순서대로 다시 저장한다.
do while(true)
i_target = pos(ls_select1, '/', i_pos)
if i_target = 0 then
ls_detail[j] = mid(ls_select1, i_pos, len(ls_select1))
exit
else
ls_detail[j] = mid(ls_select1, i_pos, i_target - i_pos)
i_pos = i_target + 1
j++
end if
loop
//-----------------------------------------------------------------------------
// DataStore를 설정한다.
//-----------------------------------------------------------------------------
lds_excel = CREATE DataStore
lds_excel.dataobject = "d_excel"
lds_excel.SetTransObject(SQLCA)
//-----------------------------------------------------------------------------
// row , column의 개수를 가져온다.
// row의 갯수는 Excel의 한계인 65536에서 Title열을 뺀 65535로 제한한다.
// column의 갯수는 d_excel에 정의된 열의 갯수로 한정한다.
//-----------------------------------------------------------------------------
li_colcount = upperbound(ls_detail)
ll_rowcount = adw_source.RowCount()
IF ll_rowcount < 1 then return 0
IF li_colcount > 40 then li_colcount = 40
IF ll_rowcount > 35535 then ll_rowcount = 36635
//-----------------------------------------------------------------------------
// row의 수만큼 DataStore에 추가한다.
//-----------------------------------------------------------------------------
FOR I = 1 TO ll_rowcount
lds_excel.InsertRow(0)
NEXT
//-----------------------------------------------------------------------------
// 자료를 copy한다.
// data에 탭이나 개행문자가 있을 경우에는 copy & paste에 문제가 될 수 있음.
// 추가로 탭이나 개행문자를 처리하는 루틴이 추가되어야 함.
// 계산필드에 혹시 따옴표가 있을 경우에는 Evaluate의 따옴표 종류와 다르게 지정할 것.
//-----------------------------------------------------------------------------
FOR J = 1 to li_colcount
ls_data = ''
IF ISNULL(ls_detail[J]) OR TRIM(ls_detail[J]) = '' THEN
lds_excel.SetItem(I , J , '')
ELSE
ls_editstyle = adw_source.describe(ls_detail[J] + ".edit.style")
// 원Data의 coltype을 보고 char(##), number에 따라 처리
choose case ls_editstyle
case 'checkbox'
ls_coltype = upper(adw_source.describe( ls_detail[J] + ".coltype" ))
if left(ls_coltype,4) = 'CHAR' then //문자열인 경우
for I = 1 to ll_rowcount
ls_data = adw_source.getitemstring(I,ls_detail[J])
lds_excel.SetItem(I , J , ls_data)
next
else //숫자형인 경우
for I = 1 to ll_rowcount
ls_data = string(adw_source.getitemnumber(I,ls_detail[J]))
lds_excel.SetItem(I , J , ls_data)
next
end if
case else //checkbox 이외의 edit style
ls_type = upper(adw_source.describe( trim(ls_object[J]) + ".type" ))
ls_coltype = upper(adw_source.describe( ls_detail[J] + ".coltype" ))
IF ls_objtype[J] = 'COLUMN' then
FOR I = 1 TO ll_rowcount
IF UPPER(Left(ls_detail[J],7)) = 'COMPUTE' THEN
// ls_exp = adw_source.describe(ls_detail[J] + ".expression")
// IF ls_exp = '!' THEN
// ls_data = ''
// ELSE
// ls_data = adw_source.Describe("Evaluate('" + ls_exp + "'," + string(I) + ")")
// END IF
if left(ls_coltype,4) = 'CHAR' then //문자열인 경우
ls_data = adw_source.getitemstring(I,ls_detail[J])
else //숫자형인 경우
ls_data = string(adw_source.getitemnumber(I,ls_detail[J]))
end if
ELSE
IF UPPER(Right(ls_detail[J],5)) = '_HELP' THEN
ls_data = ''
ELSE
if left(ls_coltype,4) = 'CHAR' then //문자열인 경우
ls_data = adw_source.getitemstring(I, ls_detail[J])
elseif left(ls_coltype,4) = 'DATE' then //날자열인 경우
ls_data = adw_source.Describe("Evaluate('LookupDisplay(" + &
ls_detail[J] + ")' , " + String(I) + ")")
elseif left(ls_coltype,3) = 'DEC' then //날자열인 경우
ls_data = string(adw_source.getitemdecimal(I,ls_detail[J]))
else
ls_data = String(adw_source.getitemNumber(I, ls_detail[J]))
end if
IF ISNULL(ls_data) OR TRIM(ls_data) = '' OR Lower(right(ls_data,3)) = 'bmp' THEN
ls_data = ''
ELSE
ls_data = adw_source.Describe("Evaluate('LookupDisplay(" + &
ls_detail[J] + ")' , " + String(I) + ")")
END IF
END IF
END IF
lds_excel.SetItem(I , J , ls_data)
NEXT
elseif ls_objtype[J] = 'COMPUTE' then
ls_exp = adw_source.describe(ls_detail[J] + ".expression")
FOR I = 1 TO ll_rowcount
// IF ls_exp = '!' THEN
// ls_data = ''
// ELSE
// ls_data = adw_source.Describe("Evaluate('" + ls_exp + "'," + string(I) + ")")
// END IF
if left(ls_coltype,4) = 'CHAR' then //문자열인 경우
ls_data = adw_source.getitemstring(I,ls_detail[J])
elseif left(ls_coltype,4) = 'DATE' then //날자열인 경우
ls_data = adw_source.Describe("Evaluate('LookupDisplay(" + &
ls_detail[J] + ")' , " + String(I) + ")")
elseif left(ls_coltype,3) = 'DEC' then //날자열인 경우
ls_data = string(adw_source.getitemdecimal(I,ls_detail[J]))
else //숫자형인 경우
ls_data = string(adw_source.getitemNumber(I,ls_detail[J]))
end if
IF ISNULL(ls_data) THEN ls_data = ''
lds_excel.SetItem(I , J , ls_data)
NEXT
end if
end choose //edit style에 따른 처리 종료
END IF
NEXT
//-----------------------------------------------------------------------------
// Header title 삽입
//-----------------------------------------------------------------------------
lds_excel.InsertRow(1)
FOR J = 1 TO li_colcount
ls_colname = adw_source.Describe(ls_detail[J] + ".name")
lds_excel.SetItem(1 , J , adw_source.Describe(ls_colname + "_t.text"))
NEXT
//-----------------------------------------------------------------------------
// Saveas에서 OLE object를 이용한 Copy & Paste로 로직을 변경함.
//-----------------------------------------------------------------------------
oleobject myoleobject
myoleobject = CREATE oleobject
li_rc = myoleobject.ConnectToNewObject ( "Excel.Application" )
IF li_rc <> 0 THEN
MessageBox ( "Error", String ( li_rc ) )
Return -1
END IF
myoleobject.Application.Visible = False
myoleobject.Workbooks.Add()
ls_copydata = lds_excel.object.datawindow.data
ClipBoard ( ls_copydata )
myoleobject.ActiveWorkbook.Sheets(1).Paste()
myoleobject.ActiveWorkbook.sheets(1).Cells(1,1).select
for I = 1 to li_colcount
myoleobject.ActiveWorkbook.sheets(1).Cells(1,I).EntireColumn.AutoFit
next
myoleobject.Application.Visible = True
myoleobject.DisconnectObject()
DESTROY myoleobject
DESTROY lds_excel
RETURN 1
2) 지원하는 함수로 간단하게 만든 경우 입니다....
Long ll_RowTot
String ls_DocName, named
Int li_ColumnCnt
Int li_Value
Int li_FileNum
ll_RowTot = Dw_Print.RowCount()
IF ll_RowTot = 0 Then
MessageBox("자료확인","Excel로 저장할 자료가 없습니다.")
Return
END IF
li_value = GetFileSaveName("Select File", ls_DocName, named, "XLS,TXT",&
"Excel Files (*.XLS),*.XLS," + &
"Text Files (*.TXT),*.TXT")
IF li_value <> 1 Then Return
IF FileExists(ls_docname) THEN
IF MessageBox("Save As...", ls_DocName + '파일이 이미 존재합니다' + '~r' + &
"지정된 파일위에 덮어 쓸까요?", Question!, YesNo!, 2) = 2 THEN Return
END IF
Dw_Print.SaveAsAscii(ls_DocName )
IF Messagebox("Excel Open", "다운받은 파일을 엑셀로 여시겠습니까?",Question!,YESNO!,1) = 2 then RETURN
OLEObject OleExcel
Int iRet
OleExcel = Create OLEObject
iret = OLeExcel.ConnectToNewObject("excel.application")
IF iret <> 0 THEN Destroy OleExcel
OleExcel.Application.Visible=True
OleExcel.Application.WorkBooks.Open(ls_DocName)
OleExcel.Sheets[1].Name =named
OleExcel.Worksheets[1].Columns.AutoFit
OleExcel.DisconnectObject()
Destroy OleExcel