首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> VC >> 關於VC++

直接解析 Excel 檔案格式讀取資料(不依賴 ODBC/OLE)

     編輯:關於VC++

前言

專案需直接讀取 Excel 檔案資料,網路搜尋多為 ODBC 或 OLE 方式,兩者皆有侷限性。無奈之下,只能選擇最艱難的路徑——深入分析 Excel 二進位檔案格式(BIFF)。

Excel BIFF 檔案格式簡介

Excel 採用 BIFF (Binary Interchange File Format) 格式,檔案由多筆「記錄」組成。每筆記錄包含:

  • 記錄頭 (4 bytes):前 2 bytes 為記錄類型代碼,後 2 bytes 為記錄長度
  • 記錄體:實際儲存的資料內容

BOF Record 範例

Byte | 0 1 2 3 | 0 1 2 3 |
---------------------------
     | 09 00 04 00 | 02 00 10 00 |
---------------------------
     | opcode | length | version | file type |
  • opcode: 09h 代表 BOF
  • length: 04h 記錄體 4 bytes
  • version: 02h 版本號
  • file type: 10h 試算表檔案

程式實作流程

步驟 1:開啟檔案

CFile f;
CFileException e;
if (!f.Open("D:\\Book1.xls", CFile::modeRead, &e)) {
    TCHAR szError[1024];
    e.GetErrorMessage(szError, 1024);
    AfxMessageBox(szError);
    return;
}

步驟 2:讀取版本資訊

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);
        // 判斷版本與檔案類型...
        break;
    }
    dwPos = f.GetPosition();
}

步驟 3:讀取其他資料記錄

f.SeekToBegin();
dwPos = f.GetPosition();
while (dwPos < dwLen) {
    nRead = f.Read((void*)&RecNo, 2);
    switch (RecNo) {
        case XL_BOUNDSHEET:  // 工作表資訊
            // 讀取工作表名稱...
            break;
        case XL_DIMENSION:   // 儲存格範圍
            f.Seek(RecLen, CFile::current);
            break;
        case XL_NUMBER:      // 數值儲存格
            break;
        case XL_LABEL:       // 字串儲存格
            break;
        case XL_EOF:         // 檔案結尾
            dwPos = dwLen;
            break;
        default:
            f.Read((void*)&RecLen, 2);
            f.Seek(RecLen, CFile::current);
            break;
    }
}

步驟 4:關閉檔案

f.Close();

結語

本文示範獨立於 MS Office 環境下,解析 BIFF 格式讀取 Excel 基本資訊。實際應用仍需更完整的記錄型別處理(筆者持續研究中)。讀取 Excel 方法不只一種,此為筆者採用之路徑,期盼與同好交流。

參考資料:Microsoft Excel File Format、MSDN Library

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved