[ 파워빌더.엑셀 - Import ]

 

 

 

☞   

 
OLEObject  excel

Integer    li_RetValue, li_rtn
Boolean    lb_sheet_rtn
Long       ll_cnt


excel = create OLEObject

li_rtn = excel.ConnectToNewObject("excel.application")
IF li_rtn <> 0 THEN
    MessageBox('Excel erro','can not run Excel Program')
    DESTROY excel
    RETURN 0
END IF

excel.WorkBooks.Open( "c:\mysheet.xls" )
excel.Application.Visible = false
excel.windowstate = 2 // 1 : Normal, 2 : Minimize, 3 : Maximize

lb_sheet_rtn = excel.worksheets(1).Activate
excel.Worksheets(1).Range("A1:E5000").Copy  //  copy to clipboard
ll_cnt = dw_1.importclipboard()
IF ll_cnt <= 1 THEN
    Messagebox("Inf", "Could not find .")
END IF

excel.Worksheets(1).Range("A10000:A10000").Copy  //reset clipboard
excel.Application.Quit
excel.DisConnectObject()
DESTROY excel

Posted by 농부지기
,

[ 파워빌더.엑셀 - Export 5 ]

 

 

☞   

 

 

요새 엑셀변환 문제로 테스트를 하다가 찾아낸 방법입니다.

(검색을 안 해봐서..-- 이미 올라와 있을지도..;;)

 

아래와 같이 적용하였을 경우 엑셀 전환 후 숫자필드의 자릿수 때문에 이상하게 보여지는 것도 해결이 가능하네요.

<?xml:namespace prefix = o />

 

String   s_FileDir, s_FileName

Integer  s_Result

 

s_Result = GetFileSaveName("Select File", s_FileDir, s_FileName, "Excel", "Excel Files (*.xls), *.xls")

 

If s_result <> 1 Then RETURN

 

dw_list.setredraw(false)

//dw내의 editmask가 설정이 되어 있지 않으면 문제 발생 – default로 지정되는 xxxxxxxxxxxxxxxxxx 로라도 선택이 되어 있어야 함.

String ls_mask[], ls_col[]

Long ll_i

 

ls_col[1] = 'sim_no'  //적용할 컬럼

ls_col[2] = 'phone_id'   //적용할 컬럼

 

For ll_i = 1 To Upperbound(ls_col)

           ls_mask[ll_i] = dw_list.describe(ls_col[ll_i] + ".editmask.mask")

           dw_list.Modify( ls_col[ll_i] + ".EditMask.Mask= '" + charA(28) + ls_mask[ll_i] + "'")         

Next

 

dw_list.saveasascii(s_FileDir)

 

//원래 상태의 editmask로 돌려놓음..

For ll_i = 1 To Upperbound(ls_col)

        dw_list.Modify( ls_col[ll_i] + ".EditMask.Mask= '"  + ls_mask[ll_i] + "'")  

Next

 

dw_list.setredraw(true)

Posted by 농부지기
,

[ 파워빌더.엑셀 - Export 4 ]

 

☞   

 

안녕하십니까?

 

엑셀 저장할 때 저장하고자 하는 파일이 열려있을 경우 저장이 안되거나 오류나서 죽는 현상이 있습니다.

 

그럴때 아래 스크립트를 추가하여 체크해 보십시오.

 

String  Ls_DocName, Ls_Named, Ls_FileFormat
Integer Li_Value, Li_FileNo

Ls_DocName=''
Ls_FileFormat='MS-Excel File Format (*.xls),*.xls'          // MS-Excel 저장

Li_Value = GetFileSaveName('Save File Name', Ls_DocName, Ls_Named, 'xls', Ls_FileFormat)

If Li_Value<>1 Then
 Return -1
End If

 

// 이부분에서 선택한 파일을 그냥 FileOpen()으로 열어봅니다.

// 현재 열려있다면

If FileExists(Ls_DocName) Then

Li_FileNo = FileOpen(Ls_DocName, StreamMode!, Write!, LockReadWrite!, Append!)
If Li_FileNo = -1 Or IsNull(Li_FileNo) Then
 MessageBox('확인', '선택하신 파일이 현재 열려있습니다. 열려진 파일을 닫고 작업하십시오.')
 Return -1
End If
FileClose(Li_FileNo)

End If

....(계속)

 

이것저것 많이 찾아보다(오후내내 헤멨다는..ㅋㅋ)가 발견했네요 ㅎㅎㅎ

 

더 좋은 방법이나 이 방법에 버그가 있다면 알려주세요~~제발~~~~ ^^

=============

2010-12-21

FileOpen()을 사용하면 파일이 없을 때 해당 파일을 생성시켜주는 작용을 합니다.

따라서 FileOpen()체크시 새로운 이름의 파일일경우 해당 파일이 생성되버리는 버그가 됩니다.

그게 빨간색 부분을 추가합니다.

Posted by 농부지기
,

[  ◎ Excel로 저장하는 방법(숫자 0 살리고, Sheet별 저장) ]     

 

 

☞   

 

아래 작성내용은 이미 카페에서 oleExcel..이용하여 Sheet별 저장방법, Cell의 특성 설정방법 등..많은 글들을 올리셨던 분들의 혼합본임을 밝혀 둡니다. 질문올렸던 내용들은 대부분 안되는 부분에 대해

올린글들이었기 때문에 혹여 저를 비롯한 초보자분들은 혼란스러워 하실 것 같아 올려봅니다.

큰 도움 주셨던 건우아빠님을 비롯한 많은 분들에게 감사드리며 올립니당 ~ (__)(--)

 

Excel로 입력되는 값 Text형식 지정 방법

*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*

//먼저 지정하고자 하는 셀의 위치에 값을 지정해줍니다 : (1:일반),(2:텍스트),(3:날짜)
long Array1[], Array2[]
Array1[] = {1,1,1,2,2} //ex = {A,B,C,D,E} 라면..A,B,C는 일반형식(기본)이 되고 D,E는 텍스트형식이 됩니다.
Array2[] = {1,1,1,2,2} //엑셀에 값이 먼저 들어가기전에 형식지정을 먼저 해주어 ' 0 ' 값이 사라지는것을 막습니다.

 

OleObject oleExcel , oleQuery
long li_rc

 

//하나의 Excel에 저장하려는 datawindow name 과 .txt파일을 먼저 저장할 경로 지정
dw_main.SaveAs('c:\t1.txt', TEXT!, True)
dw_main.SaveAs('c:\t2.txt', TEXT!, True)

 

//이제 Excel 생성 - .txt로 생성한 파일을 Excel로 이동

oleExcel = Create OleObject
li_rc = oleExcel.ConnectToNewObject("excel.application")
IF li_rc <> 0 THEN
 MessageBox("Information!", "File Conversion Failed!")
 MessageBox('오류!', 'Excel을 구동하면서 오류가 발생했습니다.', stopsign!)
 Destroy oleExcel
 RETURN -1
end if

 

//Cell 형식 변경 - 0 (0값이 정상적으로 표현)

//숫자 0 그대로 표현되고 Cell도 문자열로 인식하여 왼쪽 정렬 상태
oleExcel.WorkBooks.Add()
oleExcel.ActiveWorkbook.Sheets.Add.Name = 't1'
oleQuery = oleExcel.ActiveWorkbook.Sheets('t1').QueryTables.Add('TEXT;c:\t1.txt'   , oleExcel.ActiveWorkbook.Sheets('t1').Cells(1,1) )
oleQuery.TextFileColumnDataTypes = Array1
oleQuery.refresh()

 

//Cell 형식 변경 - 1 (0값 표현 안되고, 문자열로 인식)

//숫자 0 표현 안되고, Cell만 문자열로 인식하여 왼쪽 정렬 상태 (단, 아래내용보다 표기가 간단해진다.)
//oleExcel.WorkBooks.Add()
//oleExcel.ActiveWorkbook.Sheets.Add.Name = 't1'
//oleExcel.ActiveWorkbook.Sheets('t1').Range("A:Z").NumberFormatLocal = "@"
//oleQuery = oleExcel.ActiveWorkbook.Sheets('t1').QueryTables.Add('TEXT;c:\t1.txt'   , oleExcel.ActiveWorkbook.Sheets('t1').Cells(1,1) )
//oleQuery.refresh()

 

//Cell 형식 변경 - 2 (0값 표현 안되고, 문자열로 인식)

//숫자 0 표현 안되고, Cell만 문자열로 인식하여 왼쪽 정렬 상태
//oleExcel.WorkBooks.Add()
//oleExcel.ActiveWorkbook.Sheets.Add.Name = 't1'
//oleQuery = oleExcel.ActiveWorkbook.Sheets('t1').QueryTables.Add('TEXT;c:\t1.txt'   , oleExcel.ActiveWorkbook.Sheets('t1').Cells(1,1) )
//oleExcel.application.workbooks(1).worksheets(1).Range( "D:D").select
//oleExcel.application.workbooks(1).worksheets(1).Range( "D:D").NumberFormatLocal = "@"
//oleExcel.application.workbooks(1).worksheets(1).Range( "E:E").select
//oleExcel.application.workbooks(1).worksheets(1).Range( "E:E").NumberFormatLocal = "@"

//oleQuery.refresh()


 //oleExcel.ActiveWorkbook.Sheets.Add.Name = 't2'
//oleQuery = oleExcel.ActiveWorkbook.Sheets('t2').QueryTables.Add('TEXT;c:\t2.txt'   , oleExcel.ActiveWorkbook.Sheets('t2').Cells(1,1) )
//oleQuery.refresh()


oleExcel.Application.Visible = True

*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*

0번 예제는 0이 표시되고, 1번과 2번 예제는 왜 0이 표시 안되는지 보시면 아시겠지만..

Excel은 자료를 넣고난 이후에 형식지정을 해주느냐 자료를 넣기 이전에 형식지정을 해주느냐에 따라 표현되는 값이 틀려집니다.

 

계좌번호나 전화번호등의 정보를 입력받을 때, 처음부터 - 이라던가, 다른 문자열이 섞여들어간다면 상관없겠으나..

들어가면 안되는 경우나 입력받을때 숫자만 기입받는 경우에는 저런 문제가 생겨 버리게 되어 난감한 경우가 많이 생기게 되죠.

 

Excel에 저장하는 함수나 방법들을 여러가지 사용해 보았으나(경우에따라 다르겠지만), dw2xls를 이용하는 방법과 위처럼 아예 형식을

미리 지정해주고 시작하는 방법이 제일 안전하고 보기 좋은 것 같다는 생각이 드네요.

 

물론, 맨 앞자리에 숫자 0이 사라지지않게하기 위해서 datawindow에서 직접 Computed Field를 이용해서 표현식에 ' 라던가

특정 문자를 삽입하여 표기하는 방법도 있으나 여의치않은 상황이라면 저렇게 사용하는게 좋다고 생각하네요.

 

아, 참고로.. 여러개의 datawindow화면을 하나의 Excel에 Sheet별로 저장하는 방법이기도 합니다.

 

Test Version : 7.0.3.10009 Build

 

☞  

 

  

 

'파워빌더 > DataWindow (Excel)' 카테고리의 다른 글

파워빌더.엑셀 - Import  (0) 2017.01.26
파워빌더.엑셀 - Export 5  (0) 2017.01.26
파워빌더.엑셀 - Export 4  (0) 2017.01.26
파워빌더.엑셀 - Export 2  (0) 2017.01.26
파워빌더.엑셀 - Export 1  (0) 2017.01.26
Posted by 농부지기
,

[ 파워빌더.엑셀 - Export 2 ]

 

 

☞   

 

어느사이트인지는 모르겠는데.. 암튼   zingga1@netian.com 이분이 올려주신 내용이었습니다.

이분의 노고에 정말  감사드립니다.

 

------------------
* Global Externa Function 선언

FUNCTION UInt FindWindowA( Ulong className, string winName )  LIBRARY "user32.dll"
FUNCTION UInt SetFocus( int winHand )  LIBRARY "user32.dll"
FUNCTION boolean DeleteFileA(ref string filename) LIBRARY "Kernel32.dll"
------------------------------------------------------------------------------
//변수 선언
int object_count, object_index, object_max
string objects, object_name, object_list[], object_select, object_band, object_type
string detail_object_spec, detail_objects[], detail_object_labels, s_header, header_text[]
string s_trailer1, s_trailer1_object[], s_footer, s_footer_object[], s_footer_data
boolean object_visible, b_detail = false, b_trailer1= false, b_summury = false, b_footer = false
int i_trailer1_count = 0, i_detail_count = 0, i_footer_count = 0


//데이터윈도우의 모든 오브젝트를 읽어온다.
objects = dw_1.describe("Datawindow.Objects" )

int i_pos, i, i_target, j, i_target_row, i_row = 1

object_max = 1
i_pos = 1

//오브젝트들을 탭을 구분으로 하나씩 분리해 저장한다.
do while(true)
  i_target = pos(objects, '~t', i_pos)
if i_target = 0 then
 object_list[object_max] = mid(objects, i_pos, len(objects))
 exit
end if
  object_list[object_max] = mid(objects, i_pos, i_target - i_pos)
i_pos = i_target + 1
object_max++
loop

//각 오브젝트들이 속해 있는 밴드와 타입, visible여부를 알아내어서
//오브젝트의 갯수와 각 변수들에 저장을 한다.
for object_index = 1 to object_max
object_name = trim(object_list[object_index])
object_band = upper(dw_1.describe( object_name + ".band" ))
object_type = upper(dw_1.describe( object_name + ".type" ))
object_visible = dw_1.describe( object_name + ".visible" ) = "1"
  if object_visible then //보이는 오브젝트만 처리
 choose case object_band
  case "TRAILER.1" //그룹밴드
   b_trailer1 = true
   if (object_type = "COLUMN" or object_type = "COMPUTE" or object_type = "TEXT") then
          i_trailer1_count++
              s_trailer1_object[i_trailer1_count] = object_name
   end if
  case "DETAIL" //Detail 밴드
           if (object_type = "COLUMN" or object_type = "COMPUTE") then
              object_select = object_select + "/" + object_name
      i_detail_count++        
         end if
  case "FOOTER" //Footer 밴드
   b_footer = true
   if (object_type = "COLUMN" or object_type = "COMPUTE" or object_type = "TEXT") then
          i_footer_count++
              s_footer_object[i_footer_count] = object_name
   end if
   end choose
  end if
next

i_target = 0 ; i_pos = 1 ; object_max = 1

dw_1.SetRedraw(false)
//컬럼의 순서를 알아내기 위한 작업을 한다.
object_select = '1/1' + object_select
dw_1.modify("datawindow.selected= '" + object_select + "'")

object_select = dw_1.describe("datawindow.selected")

detail_object_spec = right(object_select, len(object_select) - 4)

detail_object_spec = detail_object_spec + '/'
dw_1.modify(" datawindow.selected=''")
dw_1.SetRedraw(true)


i_pos = 1
object_max = 1

//각 컬럼의 이름을 배치된 순서대로 다시 저장한다.
do while(true)
  i_target = pos(detail_object_spec, '/', i_pos)
if i_target = 0 then
 detail_objects[object_max] = mid(detail_object_spec,i_pos, len(detail_object_spec))
 exit
end if
  detail_objects[object_max] = mid(detail_object_spec,i_pos, i_target - i_pos)
i_pos = i_target + 1
object_max++
loop

//헤드에 있는 텍스트들의 text값을 저장한다.
for object_index = 1 to object_max
object_name = detail_objects[object_index]
if detail_object_labels <> '' then detail_object_labels = detail_object_labels + '~t'
 if dw_1.describe( object_name + "_t.visible" ) <> '!' then
  detail_object_labels = detail_object_labels + dw_1.describe(object_name + "_t.text")
 else
    detail_object_labels = detail_object_labels + "?"
 end if
next
//요기까지 detail 밴드의 화면상에 보이는 컬럼들만 detail_objects에 담는다.

detail_object_labels = detail_object_labels + "~r~n"

//엑셀과 연결 시작
oleobject export_object
uint excel_handle, excel_state
string excel_title

export_object = create oleobject

export_object.connecttonewobject("excel.application")

excel_title = export_object.Application.Caption

export_object.Application.Visible = True
excel_handle = FindWindowA( 0, excel_title )
SetFocus( excel_handle )

//파일작성
long row_count, start_row
string data_buffer, s_select, filename, s_syn, s_trailer1_data
int file_num, ii

filename = "c:\export.txt"
start_row = 1

row_count = dw_1.rowcount()
if row_count = 0 then Return

if fileexists(filename) then
DeleteFileA(filename)
end if

file_num = fileopen(filename, streammode!, write!, lockreadwrite!, append!)

//각 로우별로 데이터를 읽어서 파일에 기록한다.
for start_row = 1 to row_count
  s_select = string(start_row) + "/" + string(start_row) + "/" +detail_object_spec
 dw_1.modify(" Datawindow.selected = '" + s_select + "'")
   data_buffer = dw_1.describe("datawindow.selected.data") + "~r~n"
 if start_row = 1 then data_buffer = detail_object_labels + data_buffer
   if b_trailer1 then //그룹이 존재한다면
  i_target_row = dw_1.FindGroupChange(start_row, 1) - 1
    if i_target_row = start_row then
   for i = 1 to i_trailer1_count
     if upper(dw_1.describe( s_trailer1_object[i] + ".type" )) = "COMPUTE" then
      s_syn = dw_1.describe(s_trailer1_object[i] + ".expression")
              s_syn = dw_1.Describe("Evaluate('" + s_syn + "',"  + string(start_row) + ")")
              if i = 1 then
      for ii = 1 to i_detail_count - i_trailer1_count - 1
       s_trailer1_data = s_trailer1_data + '~t'
        next
      end if
      s_trailer1_data = s_trailer1_data + '~t' + s_syn 
      elseif upper(dw_1.describe( s_trailer1_object[i] + ".type" )) = "COLUMN" then
      s_syn = dw_1.Describe("Evaluate('LookUpDisplay(" + s_trailer1_object[i] + ") '," + &
                          string(start_row) + ")")
              if i = 1 then
       for ii = 1 to i_detail_count - i_trailer1_count - 1
        s_trailer1_data = s_trailer1_data + '~t'
       next
      end if
      s_trailer1_data = s_trailer1_data + '~t' + s_syn          
      elseif upper(dw_1.describe( s_trailer1_object[i] + ".type" )) = "TEXT" then
      s_syn = dw_1.Describe(s_trailer1_object[i] + ".text")
              if i = 1 then
       for ii = 1 to i_detail_count - i_trailer1_count - 1
        s_trailer1_data = s_trailer1_data + '~t'
       next
      end if
      s_trailer1_data = s_trailer1_data + '~t' + s_syn                 
      end if
     next
   data_buffer = data_buffer + "~r~n" + s_trailer1_data + "~r~n"
   end if
end if
filewrite(file_num, data_buffer)
setnull(data_buffer)
s_trailer1_data = ''
next

//Footer 밴드를 마지막으로 파일에 덧붙힌다.
if b_footer then
  for i = 1 to i_footer_count
    if upper(dw_1.describe( s_footer_object[i] + ".type" )) = "COMPUTE" then
     s_syn = dw_1.describe(s_footer_object[i] + ".expression")
       s_syn = dw_1.Describe("Evaluate('" + s_syn + "',"  + string(row_count) + ")")
         if i = 1 then
    for ii = 1 to i_detail_count - i_footer_count - 1
      s_footer_data = s_footer_data + '~t'
      next
     end if
   s_footer_data = s_footer_data + '~t' + s_syn 
    elseif upper(dw_1.describe( s_footer_object[i] + ".type" )) = "COLUMN" then
   s_syn = dw_1.Describe("Evaluate('LookUpDisplay(" + s_footer_object[i] + ") '," + &
                         string(row_count) + ")")
         if i = 1 then
    for ii = 1 to i_detail_count - i_footer_count - 1
      s_footer_data = s_footer_data + '~t'
      next
     end if         
     s_footer_data = s_footer_data + '~t' + s_syn          
    elseif upper(dw_1.describe( s_footer_object[i] + ".type" )) = "TEXT" then
   s_syn = dw_1.Describe(s_footer_object[i] + ".text")
         if i = 1 then
    for ii = 1 to i_detail_count - i_footer_count - 1
      s_footer_data = s_footer_data + '~t'
      next
     end if   
       s_footer_data = s_footer_data + '~t' + s_syn                 
    end if
  next
data_buffer = "~r~n" + s_footer_data
filewrite(file_num, data_buffer)
end if

fileclose(file_num)

export_object.statusbar = "Importing data...."
export_object.workbooks.opentext(filename)
export_object.windows("export.txt").caption = "Export Workbook"

//엑셀파일의 포맷을 실시한다.

//자동 칸맞춤을 적용한다.
export_object.Worksheets[1].Columns.AutoFit

//헤드 줄은 bold로 지정한다.
export_object.rows("1:1").select
export_object.selection.font.bold = true
export_object.selection.font.italic = false


export_object.statusbar = " Formatting labels....."
export_object.rows("1:1").select
//셀들의 줄맞춤을 실시한다.
export_object.selection.wraptext  = true
export_object.selection.horizontalalignment = true
export_object.selection.verticalalignment = true

//미리보기에서 헤드셀들은 반복되어 나타나게 한다.
export_object.Activesheet.PageSetup.PrintTitleRows = "$1:$1"

export_object.DisConnectObject() //연결종료
Destroy export_object //오브젝트 제거 

 

Posted by 농부지기
,

[ 파워빌더.엑셀 - Export 1 ]

 

Long ll_ret

String ls_ret

String ls_string1

oleobject myoleobject

myoleobject = create oleobject

ll_ret = myoleobject.connecttoobject("c:\a.xls")

Messagebox("Result!",string(ll_ret))

myoleobject.Application.Visible = TRUE

// 쓰기

myoleobject.application.workbooks(1).worksheets(1).cells(1,1).value="Test"

// 읽기

ls_ret = myoleobject.application.workbooks(1).worksheets(1).cells(1,1).value

 

/* 추가 사항 */

//Excel File Open

myOleObject.WorkBooks.Open("c:\a.xls")

// Sheet Name

ls_string1 = myOleObject.sheets[1].Name

// Sheet 자동마춤

myOleObject.Worksheets[1].Columns.AutoFit

//읽기

ls_ret = myOleobject.application.workbooks(1).worksheets(1).Range( "A1" ).Value

//쓰기

myOleobject.application.workbooks(1).worksheets(1).Range( "A1" ).Value = 'Test'

// 시트의 이름을 지정

myoleobject.Sheets[1].Name = "Sheet명"

//저장

myoleobject.application.workbooks(1).Save()

//다른이름으로 저장

myoleobject.application.workbooks(1).SaveAs("c:\b.xls")

 

//새로열기

myoleobject.connecttonewobject("excel.application")

//파일열기

myoleobject.WorkBooks.Opentext('c:\tmpgoodef.xls')

//타이틀바 바꾸기

myoleobject.Application.caption = "My Excel"

 

// 첫번째 Row 선택후 처리

myoleobject.rows("1:1").select

//굵은글씨

myoleobject.selection.font.bold = true

//이탤릭으로

myoleobject.selection.font.italic = true

//글씨색

myoleobject.selection.font.Color = RGB (128,128,0)

//보더색

myoleobject.selection.Borders.Color = RGB (0,0,128)

//워드랩

myoleobject.selection.wraptext = true

//가로정렬

myoleobject.selection.horizontalalignment = true

//세로정렬

myoleobject.selection.verticalalignment = true

 

//상태바 표시

myoleobject.statusbar = " My Status"

//첫번째Row를 프린트시 반복으로 (헤더로 표시)

myoleobject.Activesheet.PageSetup.PrintTitleRows = "$1:$1"

 

//첫번째쉬트를 복사 - 자세한 내용은 엑셀도움말을 참조

myoleobject.Worksheets(1).copy

//저장없이 닫기

myoleobject.WorkBooks(1).Close(false)

//연결해제

myoleobject.DisConnectObject()

 

destroy myoleobject

------------------------------

oleExcel.ActiveWorkbook.saveas("파일명", 56)

56이면 97~2003용

51이면 2007용

 

--------------------------------

선그리기...

OleExcel.application.workbooks[1].worksheets[1].Range('A4:D'+String(j)).Borders(1).LineStyle = 1

 

Posted by 농부지기
,