摘要本文通過研究,找到了C++對類似excel的高級文件的操作的途徑。它為我們今后進行C++訪問Office辦公文檔文件的研究提供了必要的方向。
關鍵詞 ODBC數據源 excel驅動 橋梁
中圖分類號:TP31 文獻標志碼:A
Operation Research of Excel Form Document based on C++
LI Yibiao
(School of Science and Technology Electronic Information,
Chengdu Agricultural Vocational College, Chengdu, Sichuan 611130)
AbstractThis paper found a operation way similar to C + + for advanced file excel by research. It provides the necessary direction for the research of C + + to access the office document files in future.
Key wordsODBC; data source; excel; drive; bridge
曾經,我們在C或者C++中通過構造類型創建一個通訊錄的記事本文本文件,這當然沒有問題。然而,這種記事本結構的文本文檔,畢竟是一種簡單的文件,在辦公文檔中,它是很少用的,一般我們都是通過建立excel結構的文檔作為通訊錄更加直觀、實用。而且excel還可以作為數據庫數據的形式為其他程序所共享和使用。所以,我們有必要探討一下如何通過C++創建、存取excel文件的原理和實現方法。
首先,我們必須搞清楚C++對excel表格文檔操作的實質或者原理。
很多人可能認為, 通過C++創建excel文件的創建很簡單,就直接利用C或者C++中間創建普通文件的方法就行了。其實,即使“表面上”創建好了excel文檔,當用Excel環境打開該excel時都會出現將文本導入到excel文檔的向導步驟。比如,下面的代碼
fp=fopen(\"c:\\\\人員通訊錄.xls\",\"w\");
fprintf(fp,\"\\姓名\性別\年齡\\");
for(i=0;i<3;i++)
{
scanf(\"%s\",perin[i].name);
scanf(\"%s\",perin[i].sex);
scanf(\"%s\",perin[i].telecode);fprintf(fp,\"\%s\%s\%s\\",perin[i].name,perin[i].sex,perin[i].telecode);
}
為此可以創建一個相應的excel文件,但是,當打開時該文件是,會出現如下對話框(見圖1)。
這足以說明,雖然生成的文件“貌似”excel文檔文件,但是真正打開時就出現了上面提示的“文本文件”情況,點擊“下一步”、“下一步”,“完成”之后才是如下界面(見圖2)。
很明顯,這些數據都是通過簡單的“文本文件”這種實質機理進行轉換到excel中去的,不是真正的excel類型結構的文件。而C或者C++沒有直接操作excel的方式,而是通過ODBC的方式進行的。
圖1
第一,確保在ODBC中安裝excel文件驅動\"Microsoft Excel Driver (*.xls)\";第二,C或者C++是通過ODBC(開放數據庫連接)進行操作excel文件的。所以,ODBC是C或者C++操作excel文件的中間橋梁。
其次,我們來研究下C++操作excel表格文檔的實現步驟。
圖2
(1)在ODBC中安裝excel驅動。
主要步驟:[控制面板]→[管理工具]→[數據源 (ODBC)] →[用戶DSN]選項卡→[添加] [ Microsoft Excel Driver (*.xls)]→ [完成]→[數據源名 手工輸入數據源名稱]→[確定]→[確定]
(2)修改頭文件StdAfx.h內容。
StdAfx是頭文件預編譯,沒有函數庫,只是定義了一些環境參數,使得編譯出來的程序能在32位的操作系統環境下運行。用VC6.0打開該文件,加入(包含)兩個重要的庫文件:
#include
#include
(3)C++通過ODBC向excel文檔中寫入數據。
假定我們創建的excel文件名是relationbook.xls, 然后,核心代碼如下:
CDatabase database;
CString sDriver=\"Microsoft Excel Driver(*.xls)\";
CString sExcelFile=\"c:\\\\relationbook.xls\";
CString sSql;
sSql.Format(\"DRIVER={%s};DSN='''';FIRSTROWHASNAMES=1;READONLY=FALSE;CREATE_DB=\\\"%s\\\";DBQ=%s\",sDriver, sExcelFile, sExcelFile);
// 創建數據庫 (即Excel表格文件)
if( database.OpenEx(sSql,CDatabase::noOdbcDialog) )
{
// 創建表結構(姓名、年齡)
sSql = \"CREATE TABLE relationbook (Name TEXT,Age NUMBER)\";
database.ExecuteSQL(sSql);
// 向剛建立的excel文件插入新數據
sSql = \"INSERT INTO relationbook (Name,Age) VALUES ('黃飛鴻',26)\";
……
database.ExecuteSQL(sSql);
}
以上即是完全展示了C++通過ODBC創建并且像剛創建的excel文件添加數據的過程,筆者可以認真組織這些代碼成為完整的程序模塊
(4)C++通過ODBC讀取excel文檔數據。
下面,我們給出核心實現代碼,并賦予必要的注釋
// 創建進行存取的字符串
sDsn.Format(\"ODBC;DRIVER={%s};DSN='';DBQ=%s\", sDriver, sFile);
// 打開數據庫(即Excel文件)
database.Open(NULL, 1, 1, sDsn);
CRecordset recset(database);
// 設置讀取的查詢語句。
sSql = \"SELECT Name, Age FROM relationbook ORDER BY Name \";
// 執行查詢語句,recset是記錄集
recset.Open(CRecordset::forwardOnly, sSql, CRecordset::readOnly);
// 獲取查詢結果
while (!recset.IsEOF())
{
//讀取Excel內部數值,并且傳遞到Item1、Item2
recset.GetFieldValue(\"Name \", Item1);
recset.GetFieldValue(\"Age\", Item2);
// 移到下一行
recset.MoveNext();
}
// 關閉數據庫
database.Close();
以上即是完全展示了C++通過ODBC讀取excel文件數據并且將查詢結構返回給定義的變量的過程,這中間還涉及到獲取excel驅動的方法,需要好好體驗。
通過上面的探究,我們認識到,要使C++真正操作excel文檔,要通過ODBC這個中間橋梁,而ODBC幾乎是很多程序語言操作數據庫表文件的橋梁。正是因為引入了ODBC這個橋梁,使得C++操作excel文檔才從本質上得到了保證。
總之,用C++操作excel文檔文件,終于得到了可行的辦法,也許讀者還有更好的辦法,我在這里也是起到拋磚引玉的作用。通過這種探究的思路和方向,也以讓C++同訪問excel文檔一樣訪問office的其他文檔文件,相信大家潛心研究,會得到解決的。
參考文獻
[1]跟著實例學Visual C++ 6.0 訪問數據庫·繪圖·制表.北京航空航天大學出版社,2003.
[2]譚浩強編著.C++程序設計.清華大學出版社,2004.