C++Builder Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
C++빌더 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
메신저 프로젝트
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C++빌더 Q&A
C++Builder Programming Q&A
[50945] Re:[질문]컴포넌트 사용하지 않고 엑셀 읽어오기
장성호 [nasilso] 2379 읽음    2007-10-19 12:45
님께서 팁게시판에 이의태님께서 올린 방법을 이용하셨네요
http://cbuilder.borlandforum.com/impboard/impboard.dll?action=read&db=bcb_tip&no=201

그 방법의 장점은
   1. Excel이 없어도 데이타를 저장할수 있다는것입니다.


하지만 단점은?
   1. 지원하는 Data형식이 String , int , float 세가지 뿐이라는것
   2. Sheet가  2장 이상은 안된다는것
   3. 그리고 무엇보다 Excel 프로그램에서 저장한 데이타는 같은 방식으로 읽을 수 없다는것 등이 있습니다.


하지만 위 방법으로 저장한  xls파일은 write할때 방식으로 read하면 되겠죠

WORD CXlsBof[6] = {0x809, 8, 0, 0x10, 0, 0};
WORD CXlsEof[2] = {0x0A, 0};
WORD CXlsLabel[6] = {0x204, 0, 0, 0, 0, 0};
WORD CXlsNumber[5] = {0x203, 14, 0, 0, 0};
WORD CXlsRk[5] = {0x27E, 10, 0, 0, 0};

[위방식으로 저장한 xls파일 읽기]

  1.맨처음에 에 header인  bof 12Byte읽어오구요
  2.그다음부터 데이타를 파일크기만큼 읽어옵니다.
      데이타를 읽을때는
      2.1 먼저 Cell정보를 10~12Byte읽어와서 데이타 종류와 , 데이타 길이를 확인하구요
      2.2 데이타 길이만큼 읽어와서 int 나 double이나 string으로 변환합니다.
  3. 2번과정을 file길이만큼 반복하다가
      데이타 타입니 eof이면 끝내면 됩니다.

직접 코딩해 보시고 안되면.. 다시 질문올리세요


-추신-

아래 링크에 excel파일 저장하는 몇가지 방법이 기술되어있습니다.
그중 1번은 님이 지금 하시는 방법이구요
1번 ,2번 ,4번 , 5번이 excel이 pc에 설치되어있지 않아도 저장및 읽어오는 기능이 됩니다.
문론 한계는 있습니다.


http://cbuilder.borlandforum.com/impboard/impboard.dll?action=read&db=bcb_qna&no=50156

[Excel 저장방법]

1. 직접 바이너리저장
2. XML 스프레드시트
3. OLE 이용
4. CSV 로 저장
5. 탭구분 TEXT파일로 저장
6. 엑셀 지원 StringGrid 이용


그럼..

초보 님이 쓰신 글 :
: 엑셀에 저장시 아래의 팁으로 저장을 했습니다.
: 저장한 내용을 다시 읽어 오려고 하는데 컴포넌트 사용하지 않고 읽어오려면
: 어떻게 해야 하는지요?  아래의 팁을 변형해서 읽어 올수가 있나요?
:
: WORD CXlsBof[6] = {0x809, 8, 0, 0x10, 0, 0};
: WORD CXlsEof[2] = {0x0A, 0};
: WORD CXlsLabel[6] = {0x204, 0, 0, 0, 0, 0};
: WORD CXlsNumber[5] = {0x203, 14, 0, 0, 0};
: WORD CXlsRk[5] = {0x27E, 10, 0, 0, 0};
:
: void __fastcall XlsBeginStream(TStream *XlsStream, const WORD BuildNumber)
: {
:     CXlsBof[4] = BuildNumber;
:     XlsStream->WriteBuffer(CXlsBof, sizeof(CXlsBof));
: }
: ... 중략.
: void __fastcall XlsWriteCellLabel(TStream *XlsStream, const WORD ACol, const
: WORD ARow, const AnsiString AValue)
: {
:     WORD L = AValue.Length();
:     CXlsLabel[1] = 8 + L;
:     CXlsLabel[2] = ARow;
:     CXlsLabel[3] = ACol;
:     CXlsLabel[5] = L;
:     XlsStream->WriteBuffer(CXlsLabel, sizeof(CXlsLabel));
:     XlsStream->WriteBuffer(AValue.c_str(), L);
: }

+ -

관련 글 리스트
50940 [질문]컴포넌트 사용하지 않고 엑셀 읽어오기 초보 1760 2007/10/19
50945     Re:[질문]컴포넌트 사용하지 않고 엑셀 읽어오기 장성호 2379 2007/10/19
50946         Re:Re:[질문]컴포넌트 사용하지 않고 엑셀 읽어오기 초보 1750 2007/10/19
50948             Re:Re:Re:[질문]컴포넌트 사용하지 않고 엑셀 읽어오기 장성호 1958 2007/10/19
50950                 Re:Re:Re:Re:[질문]컴포넌트 사용하지 않고 엑셀 읽어오기 초보 1661 2007/10/19
50951                     Re:Re:Re:Re:Re:[질문]컴포넌트 사용하지 않고 엑셀 읽어오기 장성호 1631 2007/10/19
50953                         Re:Re:Re:Re:Re:Re:[질문]컴포넌트 사용하지 않고 엑셀 읽어오기 unitas 1419 2007/10/19
50954                             Re:Re:Re:Re:Re:Re:Re:[질문]컴포넌트 사용하지 않고 엑셀 읽어오기 장성호 1698 2007/10/19
50956                                 Re:Re:Re:Re:Re:Re:Re:Re:[감사]감사합니다. unitas 1340 2007/10/19
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.