本文將詳細介紹如何利用 ODBC 技術,將 Excel 試算表視為資料庫來進行讀寫操作。透過封裝良好的 CSpreadSheet 類別,開發者能夠輕鬆實現建立新檔案、寫入與讀取資料、插入/刪除/替換列行儲存格、查詢特定資料,甚至將 Excel 匯出為指定分隔符號的文字檔等功能。文中附有完整的 VC6 範例程式碼與執行畫面示意。
基本原理與先前文章《直接通過 ODBC 讀寫 Excel 表格文件》相同:透過 ODBC 驅動程式將 .xls 檔案視為資料來源,藉由 SQL 語句操作資料。關鍵在於「欄位名稱(標題列)必須唯一」,這相當於資料庫的主鍵。本文將所有操作封裝於 CSpreadSheet 類別中,提供直觀的介面並支援擴充。
#include "CSpreadSheet.h"
// 指定檔案路徑與工作表名稱
CSpreadSheet SS("c:\\Test.xls", "TestSheet");
CStringArray sampleArray, testRow;
SS.BeginTransaction();
// 寫入標題列
sampleArray.RemoveAll();
sampleArray.Add("姓名");
sampleArray.Add("年齡");
SS.AddHeaders(sampleArray);
// 批次新增資料列
CString strName[] = {"徐景周","徐志慧","郭徽","牛英俊","朱小鵬"};
CString strAge[] = {"27","23","28","27","26"};
for(int i = 0; i < sizeof(strName)/sizeof(CString); i++) {
sampleArray.RemoveAll();
sampleArray.Add(strName[i]);
sampleArray.Add(strAge[i]);
SS.AddRow(sampleArray);
}
SS.Commit();
CSpreadSheet SS("c:\\Test.xls", "TestSheet");
CStringArray Rows;
m_AccessList.ResetContent();
for (int i = 1; i <= SS.GetTotalRows(); i++) {
SS.ReadRow(Rows, i);
CString strContents;
for (int j = 1; j <= Rows.GetSize(); j++) {
if (j == 1) strContents = Rows.GetAt(j-1);
else strContents += " --> " + Rows.GetAt(j-1);
}
m_AccessList.AddString(strContents);
}
// 準備測試資料
for (int k = 1; k <= 2; k++) testRow.Add("Test");
SS.AddRow(testRow); // 附加至末尾
SS.AddRow(testRow, 2); // 插入至第 2 列
SS.AddRow(testRow, 6, true); // 取代第 4 列(參數意義請參考原始碼)
SS.AddCell("徐景周", 1, 2); // 設定/取代第 2 列第 1 欄儲存格
SS.Commit();
範例展示了完整的 OnQuery() 處理函式,涵蓋四種查詢模式:
ReadColumn()ReadRow()ReadCell()// 片段:查詢單一儲存格
if(!SS.ReadCell(tempString, iColumn, iRow)) {
AfxMessageBox(SS.GetLastError());
return;
}
CString str;
str.Format("行號: %d, 列號: %d ,內容: %s", iRow, iColumn, tempString);
AfxMessageBox(str);
// 以分號分隔,另存為同檔名 .txt
SS.Convert(";");
SS.DeleteSheet(); // 刪除所有工作表
SS.DeleteSheet("TestSheet");// 刪除指定工作表
int iCols = SS.GetTotalColumns(); // 總欄數
int iRows = SS.GetTotalRows(); // 總列數
int iCurRow = SS.GetCurrentRow(); // 目前游標列號
CStringArray rowHeader;
SS.GetFieldNames(rowHeader);
// 迴圈顯示...
完整實作細節(含交易控制、錯誤處理、邊界條件)請下載隨文提供的原始碼研讀,內含詳細註解。另可參考: