Q&A

  • DBGrid To Excel 고수님들께 도움 받고자 해서.....
안녕하십니까
델파이 프로젝트 수행중인 김정식이라합니다.
초면에 죄송합니다.
일면식은 없지만 님의 도움으로 유용한 기능들 많이 쓰고 있는 사람입니다.
거듭 감사하단 말씀 드리며....

빈말 같겠지만 http://www.delphi.co.kr/이곳에서 여러 도움주시는
모든분들께 보답할 날 있길 바라며....

인사가 길었군요.

질문사항은
최용일님께서 팁으로 올려놓으신
'[팁] OLE없이 엑셀파일 만들기'
OLE를 사용안하고 직접 엑셀파일을 만드는 예제입니다.

const
CXlsBof: array[0..5] of Word = ($809, 8, 00, $10, 0, 0);
CXlsEof: array[0..1] of Word = ($0A, 00);
CXlsLabel: array[0..5] of Word = ($204, 0, 0, 0, 0, 0);
CXlsNumber: array[0..4] of Word = ($203, 14, 0, 0, 0);
CXlsRk: array[0..4] of Word = ($27E, 10, 0, 0, 0);

procedure XlsBeginStream(XlsStream: TStream; const BuildNumber: Word);
begin
CXlsBof[4] := BuildNumber;
XlsStream.WriteBuffer(CXlsBof, SizeOf(CXlsBof));
end;

procedure XlsEndStream(XlsStream: TStream);
begin
XlsStream.WriteBuffer(CXlsEof, SizeOf(CXlsEof));
end;

procedure xlswriteCellRk(XlsStream: TStream; const ACol, ARow: Word; const AValue: Integer);
var
V: Integer;
begin
CXlsRk[2] := ARow;
CXlsRk[3] := ACol;
XlsStream.WriteBuffer(CXlsRk, SizeOf(CXlsRk));
V := (AValue shl 2) or 2;
XlsStream.WriteBuffer(V, 4);
end;

procedure xlswriteCellNumber(XlsStream: TStream; const ACol, ARow: Word; const AValue: Double);
begin
CXlsNumber[2] := ARow;
CXlsNumber[3] := ACol;
XlsStream.WriteBuffer(CXlsNumber, SizeOf(CXlsNumber));
XlsStream.WriteBuffer(AValue, 8);
end;

procedure xlswriteCellLabel(XlsStream: TStream; const ACol, ARow: Word; const AValue: string);
var
L: Word;
begin
L := Length(AValue);
CXlsLabel[1] := 8 + L;
CXlsLabel[2] := ARow;
CXlsLabel[3] := ACol;
CXlsLabel[5] := L;
XlsStream.WriteBuffer(CXlsLabel, SizeOf(CXlsLabel));
XlsStream.WriteBuffer(Pointer(AValue)^, L);
end;

procedure TForm1.Button1Click(Sender: TObject);
var
FStream: TFileStream;
I, J: Integer;
begin
FStream := TFileStream.Create('J:e.xls', fmCreate);
try
XlsBeginStream(FStream, 0);
for I := 0 to 99 do
for J := 0 to 99 do
begin
xlswriteCellNumber(FStream, I, J, 34.34);
// xlswriteCellRk(FStream, I, J, 3434);
// xlswriteCellLabel(FStream, I, J, Format('Cell: %d,%d', [I, J]));
end;
XlsEndStream(FStream);
finally
FStream.Free;
end;
end;

를 응용해서
아주 유용하게 쓰고 있습니다.
그런데 문제에 봉착한 것은 쿼리된 항목이 엑셀의 가로(columns) 셀 갯수를 오버해서
같은 엑셀파일에 새로운 쉬트를 만들고(추가) 싶은데 그방법을 알수가 없어서....

source를 보이자니 너무 길고 웅....
가령 dbgrid columns이 256(엑셀한계치)이 넘을때 1~100까지 1번쉬트에 101~200까지 2번쉬트에 나머진 3번쉬트에
이렇게 넣구 싶은겁니다.

설명이 너무 서툴러서 이해가 되셨는지....
그럼 저의 고민 해결해주실 거마운 고수님을 기다리며....
이글 보시는 모든 분들 즐거운 나날 되시길....
1  COMMENTS