Excel 파일 데이터 직접 읽기

3812 단어

소스 코드 다운로드 선언문은 Excel 파일 데이터를 직접 읽어야 하기 때문에 인터넷에서 여러 번 검색해도 좋은 방법을 찾지 못하고 ODBC나 OLE 방식으로 읽지만 이 두 가지 방법은 모두 한계가 있다.(나는 모두가 잘 알고 있다고 믿는다.)어떡하지?어쩔 수 없이 가장 어려운 길을 선택해야 합니다. - Excel 파일 형식을 분석합니다.S Excel을 소개하는 것은 널리 알려진 스프레드시트 처리 소프트웨어입니다.Excel 파일 형식은 특정한 BIFF(Binary Interchange File Format)로 BIFF에는 많은 기록이 저장되어 있으며 두 번째 기록은 기록 헤더와 기록체를 포함한다.기록 헤더는 4byte이고 앞의 두 자리는 기록 형식을 지정하는 코드(opcode), 뒤의 두 자리는 기록 길이를 지정한다.기록체는 이 기록의 실제 데이터를 저장하는 것이다.예:
BOF record
           |  Record Header    |    Record Body    |
Byte       |  0    1    2    3 |  0    1    2    3 |
           -----------------------------------------
Contents   | 09 | 00 | 04 | 00 | 02 | 00 | 10 | 00 |
           -----------------------------------------
           | opcode  | length  | version |  file   |
           |         |         |  number |  type   |
 :
	opcode: 09h is BOF;
	length: 04h record body is 4 bytes long;
 :
	version number:02h is version number (2 for the initial version of Excel)
	file type:10h is a worksheet file;
 MS Excel File Format。

다음은 본문 프로그램에 대한 간단한 설명입니다.
       : 
	CFile f;
	CFileException e;

	//  
	if (!f.Open("D://Book1.xls", CFile::modeRead, &e))
	{
		TCHAR szError[1024];
		e.GetErrorMessage(szError, 1024);
		AfxMessageBox(szError);
		return;
	}
	 : 
	//  
	while (dwPos < dwLen)
	{
		nRead = f.Read((void*)&RecNo, 2);
		if (RecNo == XL_BOF)	
		{
			WORD Ver, Type;
			f.Read((void*)&RecLen, 2);
			f.Read((void*)&Ver, 2);
			f.Read((void*)&Type, 2);
			f.Seek(RecLen, CFile::current);

			int ver = 0;
			switch (Ver)
			{
			case BIFF7:
				ver = 7;
				break;
			case BIFF8:
				ver = 8;
				AfxMessageBox("Biff8");
				break;
			}

			int type = 0;
			switch (Type)
			{
			case WORKBOOK:
				type = 5;
				AfxMessageBox("Workbook");
				break;
			case WORKSHEET:
				type = 16;
				AfxMessageBox("Worksheet");
				break;
			case CHART:
				type = 32;
				AfxMessageBox("Chart");
				break;
			}

			break;
		}
		dwPos = f.GetPosition();
	}	
	 : 
	f.SeekToBegin();
	dwPos = f.GetPosition();
	//  
	while (dwPos < dwLen)
	{
		nRead = f.Read((void*)&RecNo, 2);
		switch (RecNo)
		{
		case XL_BOF:
			{
				f.Read((void*)&RecLen, 2);
				AfxMessageBox("Bof");
			}
			break;
		case XL_BOUNDSHEET:
			{
				DWORD	temp;
				BYTE	visi;
				BYTE	type;
				TCHAR	name;
				
				f.Read((void*)&RecLen, 2);
				f.Read((void*)&temp, 4);
				f.Read((void*)&visi, 1);
				f.Read((void*)&type, 1);
				f.Read((void*)&StrLen, 2);
				f.Read((void*)&name, StrLen);
				
				char buf[128];
				memset(buf, 0x0, 128);
				strncpy(buf, &name, StrLen);
				
				AfxMessageBox(buf);
			}
			break;
		case XL_DIMENSION:
			f.Read((void*)&RecLen, 2);
			f.Seek(RecLen, CFile::current);
			AfxMessageBox("Dimension");
			break;
		case 0xE2:	// INTERFACED
			f.Read((void*)&RecLen, 2);
			AfxMessageBox("e2");
			break;
		case XL_SST:
			f.Read((void*)&RecLen, 2);
			f.Seek(RecLen, CFile::current);
			AfxMessageBox("SST");
			break;
		case XL_NUMBER:
			f.Read((void*)&RecLen, 2);
			AfxMessageBox("Number");
			break;
		case XL_STRING:
			f.Read((void*)&RecLen, 2);
			AfxMessageBox("String");
			break;
		case XL_RK:
			f.Read((void*)&RecLen, 2);
			AfxMessageBox("RK");
			break;
		case XL_LABEL:
			{
				f.Read((void*)&RecLen, 2);
				AfxMessageBox("Label");
			}
			break;
		case 0xD6:
			f.Read((void*)&RecLen, 2);
			AfxMessageBox("RString");
			break;
		case XL_EOF:
			dwPos = dwLen;
			AfxMessageBox("Eof");
			break;
		default:
			nRead = f.Read((void*)&RecLen, 2);
			if (nRead == 0)
				dwPos = dwLen;
			break;
		}
	}
	 : 
	f.Close();    

좋은 웹페이지 즐겨찾기