程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> VC >> 關於VC++ >> 直接讀取Excel文件數據

直接讀取Excel文件數據

編輯:關於VC++

前言

由於種種需要直接進行讀取Excel文件數據,然而在網上Search多次也沒有找到好的方法,

一般就通過ODBC或OLE方式進行讀取,但這兩種方法都具有局限性...(我相信大家都很清楚)。

怎麼辦呢?沒辦法了,只好選擇最艱難的路了--分析Excel文件格式。

介紹

MS 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();

結束

本方講述的是獨立於MS Office系統,分析Excel文件格式並讀取其數據。上述程序只讀取最基本的信息。若需應用還需更完整的分析(我也在進行中...),當然讀取Excel文件方法有多種,在這裡只講述了我使用的方法,

希望與各們朋友多交流!

參考文選

1. Microsoft Excel File Format

2. MSDN Library

本文配套源碼

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved