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);
range 또는 cells를 한번 부를 때마다 엑셀에서는 상당하 오버헤드가(IO작업이므로) 발생하기 때문에
읽으려고 하시는 영역(I1~I15)을 아래와 같이 여러 줄로 나누어 하지 마시고 일단 Range('I1:I15')로 전체를
읽어온 후 내부에서 분석해보십시요.
Range 전체를 받는 방법은 배열로 받는 방법이 있는데 일단은 레인지 개체를 배열로 받는 방법을 도움말에서 찾아보시면서(또는 VBA사전 등) 우선 스스로 해보시고 잘 안되시면 다시 질문해 주십시요.(저도 VBA코딩을 안한지가 쪼금 되다보니 예제를 짜드리려면 기억을 더듬어야 해서 ^^;)