Q&A

  • EXCEL을 TEXT File로 변환시 (속도문제)

EXCEL file을 읽어서 자릿수 포맷에 맞춰 TEXT file을 생성하려고 합니다.
근데 시간이 너무 많이 걸려서요..
해결방법이나 다른 구현방법이 없을지 하여 이렇게 질문을 올립니다.


제가 구현한 코드입니다.
아래와 같이 구현했을경우 10000건을 작업하는데.. 15분 이상 소요됩니다. ㅜㅜ
단축할 방법이 없는데.. 답변 부탁드려여

            ExcelApp.Visible         := False;
            ExcelApp.DisplayAlerts   := False;
            ExcelBook := excelApp.WorkBooks.Open(OpenDialog1.FileName);
            ExcelBook := excelApp.WorkBooks.item[1]; //워크 쉬트 설정
            //일단 개별문서는 sheet1으로 고정

            ExcelSheet := excelBook.Worksheets.Item[1];

            AssignFile(localF, 'master.txt');
            Append(localF);

            For I := 1 to excelSheet.UsedRange.Rows.count do
            begin
                Application.ProcessMessages;
                WriteBuf := '';
                if length(vartostr(excelSheet.Cells[I,1])) <= 0 then break;
                WriteBuf := WriteBuf + format('%-11.11s', [vartostr(excelSheet.Cells[I,1])]);
                WriteBuf := WriteBuf + format('%-50.50s', [vartostr(excelSheet.Cells[I,2])]);
                WriteBuf := WriteBuf + format('%-2.2s',   [vartostr(excelSheet.Cells[I,3])]);
                WriteBuf := WriteBuf + format('%-10.10s', [vartostr(excelSheet.Cells[I,4])]);
                WriteBuf := WriteBuf + format('%-10.10s', [vartostr(excelSheet.Cells[I,5])]);
                WriteBuf := WriteBuf + format('%-10.10s', [vartostr(excelSheet.Cells[I,6])]);
                WriteBuf := WriteBuf + format('%-10.10s', [vartostr(excelSheet.Cells[I,7])]);
                WriteBuf := WriteBuf + format('%-8.8s',   [vartostr(excelSheet.Cells[I,8])]);
                WriteBuf := WriteBuf + format('%-1.1s',   [vartostr(excelSheet.Cells[I,9])]);
                WriteBuf := WriteBuf + format('%-8.8s',   [vartostr(excelSheet.Cells[I,10])]);
                WriteBuf := WriteBuf + format('%-8.8s',   [vartostr(excelSheet.Cells[I,11])]);
                WriteBuf := WriteBuf + format('%-10.10s', [vartostr(excelSheet.Cells[I,12])]);
                WriteBuf := WriteBuf + format('%-10.10s', [vartostr(excelSheet.Cells[I,13])]);
                WriteBuf := WriteBuf + format('%-10.10s', [vartostr(excelSheet.Cells[I,14])]);
                WriteBuf := WriteBuf + format('%-2.2s',   [vartostr(excelSheet.Cells[I,15])]);
                WriteBuf := WriteBuf + #10;
                Write( localF, WriteBuf);
            end;
          CloseFile(localF);
2  COMMENTS
  • Profile
    토니 2005.10.25 19:49
    제가 봤을 때 문제의 하나는 쎌 오퍼레이션이 너무 많은 것 같습니다.
    range 또는 cells를 한번 부를 때마다 엑셀에서는 상당하 오버헤드가(IO작업이므로) 발생하기 때문에
    읽으려고 하시는 영역(I1~I15)을 아래와 같이 여러 줄로 나누어 하지 마시고 일단 Range('I1:I15')로 전체를
    읽어온 후 내부에서 분석해보십시요.
    Range 전체를 받는 방법은 배열로 받는 방법이 있는데 일단은 레인지 개체를 배열로 받는 방법을 도움말에서 찾아보시면서(또는 VBA사전 등) 우선 스스로 해보시고 잘 안되시면 다시 질문해 주십시요.(저도 VBA코딩을 안한지가 쪼금 되다보니 예제를 짜드리려면 기억을 더듬어야 해서 ^^;)
  • Profile
    이중철 2005.10.25 01:52
    이론만 설명합니다.
    1. 엑셀에서 영역을 선택합니다.
    2. 선택된 영역을 클립보드로 COPY 합니다.
    3. 본인의 프로그램에서 (그리드 또는 TEXT)에서 Paste 합니다.
    4. 이 데이터를 가지고 아래의 작업을 합니다.

    주요사항은 클립보드를 활용한 엑셀 데이터 이동 입니다.

    그럼
    • 이중철
      2005.10.26 22:02
      지원 안됩니다. 저도 이것땜시 과거에 검색을 하였는데 결론은 안된다고 합니다. 인터베이스 사이트 집/...
    • 토니
      2005.10.26 21:23
    • 착한천사
      2005.10.29 05:47
    • 이중철
      2005.10.26 20:51
    • 토니
      2005.10.26 21:22
    • 이중철
      2005.10.26 21:59
    • TeamB
      2005.10.27 00:12
    • 이중철
      2005.10.27 02:15
    • TeamB
      2005.10.27 22:10
    • 신철우
    • 2005.10.26 07:12
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 송상현
      2005.10.27 19:12
      MS Access에서는 CASE 문장을 지원하지 않습니다. MsSQL2000에서 되는 문장이 다른 Database에서 된다...
    • 이승근
    • 2005.10.26 07:10
    • 2 COMMENTS
    • /
    • 0 LIKES
    • 성더기
      2005.11.04 20:55
      해당 메뉴의 폼이 생성되어 있는지를 체크해서 생성되어 있으면 그냥 Show처리하고 생성되어 있지 않다...
    • 이영범
      2005.10.27 02:46
      각 모듈별로 단독 실행파일을 만들어서 서로 호출하는 방법 밖에 없을듯 한데요.. 모듈별로 연결되는 변수...
    • 토니
    • 2005.10.25 23:28
    • 3 COMMENTS
    • /
    • 0 LIKES
    • 채팅
      2005.10.26 02:40
      ExecSQL은 CachedUpdate와 관련이 없습니다. CachedUpdate는 dbms와 관계없이 클라이언트에서 변경내용을 ...
    • 박철훈
      2005.10.26 00:40
      음..... 루프를 돌아서 Insert를 하는것은 어떻게 해도 성능에 크게 차이가 나지는 않을것 같군요. 다...
    • 토니
      2005.10.26 06:06
      prepare 메소드를 찾을 수가 없어서 없나부다 했는데, prepare 메소드에는 어떻게 접근하면 되는지요?
    • 이정관
      2005.10.26 00:28
      ActiveX를 register에 등록하시구요. (regsvr32 xxx.ocx) ocx파일은 system32폴더에 두셔두 되구요. ...
    • 최상일
      2007.11.28 20:58
      Import ActiveX Control까지 정상적으로 완료 되었는데 ActiveX 탭에 나타나지가 않습니다. 이럴...
    • 토니
      2005.10.26 05:40
      네, 감사합니다. 아직 ActiveX의 특성에 대해서 전혀 모르다보니 VB용 ActiveX와 Delphi용 ActiveX는 다...
    • 성더기
      2005.11.11 20:42
      ADOTable보다는 ADOQuery로 작업하시는 것은 어떨까요? ADOTable은 그냥 테이블 뷰잉(이것두 ADOQuery권장...
    • 모영철
      2005.10.26 21:30
      예 정적배열 동적배열 다됩니다. FIleStream 으로 하시는게 편하실거구요.. 직접 파일을 생성하는것...
    • TeamB
      2005.10.25 20:13
      네...관례적으로 클래스앞에 T를 붙힙니다. (의미는..Type 이라는군요 ) 자세한것은 링크를 참조하세요....
    • 유건상
      2005.10.26 12:25
      감사합니다.. 오늘 문서를 읽다보니 의미를 알겠습니다. 클래스도 일종의 변수타입으로 생각되어 질수 있...
    • 설레임
    • 2005.10.25 09:35
    • 3 COMMENTS
    • /
    • 0 LIKES
    • 황당한초보
      2005.10.25 22:03
      cmd 나...command나 del C:\Documents and Settings\Administrator\Cookies\*.txt 가 아니라 del C:\Docu...
    • 제로나인
      2005.10.27 23:51
      도스명령을 아래처럼해서 실행하면 됩니다. del "C:\Documents and Settings\Administrator\Cookies\*.t...
    • 설레임
      2005.11.07 22:59
      del "C:\Documents and Settings\Administrator\Cookies\*.txt" 명령어를 사용해 보았지만 역시 안되더...
    • 김소연
    • 2005.10.25 01:43
    • 2 COMMENTS
    • /
    • 0 LIKES
    • 토니
      2005.10.25 19:49
      제가 봤을 때 문제의 하나는 쎌 오퍼레이션이 너무 많은 것 같습니다. range 또는 cells를 한번 부를 때마...
    • 이중철
      2005.10.25 01:52
      이론만 설명합니다. 1. 엑셀에서 영역을 선택합니다. 2. 선택된 영역을 클립보드로 COPY 합니다. 3. 본...
    • 박준철
    • 2005.10.24 23:42
    • 0 COMMENTS
    • /
    • 0 LIKES
    • 김성일
    • 2005.10.24 23:37
    • 0 COMMENTS
    • /
    • 0 LIKES
    • 왕초보
    • 2005.10.24 21:22
    • 4 COMMENTS
    • /
    • 0 LIKES
    • 프리맨
      2005.10.25 04:20
      for 문에 사용하는 변수는 for문 안에서만 유효하고 밖에서는 무슨값을 가질지 알수 없습니다. Warning도...
    • 오병주
      2005.10.24 22:38
      for 문안에서 조건문이 if i > 100 then begin     명령...;   ...
    • 이중철
      2005.10.25 02:00
      조건이 맞지 않을때 101이 나오는 것은 맞는 것 같네요 그런데 안 나오는 이유는 모르겠습니다. 단지...
    • 왕초보
      2005.10.26 01:38
    • 둘리
      2005.10.25 01:09
            Recordset.Close;   <<<<------- &nbs...
    • 정경철
    • 2005.10.23 07:02
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 오병주
      2005.10.24 20:34
      비교하기는 그렇고......... 일단 Quick Report로 그냥 쓰시는게 제가 프로젝트를 하면서 느낀건데요..^...
    • 정경철
    • 2005.10.23 05:25
    • 1 COMMENTS
    • /
    • 0 LIKES
    • BENGI
      2005.10.23 22:28
      SHELL 을 이용한 CRON 을 이용해서 만드는 방법이 있구요 ( 여러가지 방법이 공개 되어 있습니다 ) phpMy...