CAFE

엑셀 다운로드...

작성자일등오이|작성시간05.11.18|조회수938 목록 댓글 1

나름대로 엑셀 다운로드하는 펑션을 만들었는데....

도움이 되시길...

두가지의 경우로 만들어 봤습니다..

참고하시길......

 

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에 문제가 될 수 있음.
// 추가로 탭이나 개행문자를 처리하는 루틴이 추가되어야 함.
// 계산필드에 혹시 따옴표가 있을 경우에는 Eval‎uate의 따옴표 종류와 다르게 지정할 것.
//-----------------------------------------------------------------------------
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("Eval‎uate('" + 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("Eval‎uate('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("Eval‎uate('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("Eval‎uate('" + 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("Eval‎uate('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

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

댓글

댓글 리스트
  • 작성자모지리 | 작성시간 05.12.13 어디서 많이 보던 소스네요...
댓글 전체보기
맨위로

카페 검색

카페 검색어 입력폼