在 VS2008 下操作 Excel 的方法總結

2021-05-22 04:59:08 字數 2576 閱讀 7313

這些天做個軟體,需要讀取 excel 並匯入到資料庫中,所以研究了一下在 vc 下操作 excel 的方法,這裡做個總結,以作備忘。

一、最常用的 ole 自動化方式

這個方式應該說是功能最全的方式,可能也是應用的最多的方式。由於這種方式採用的是隱藏啟動 office excel 的方式,所以幾乎是全能,任何功能都可以完成。不過缺點也是比較明顯的:

1、採用 ole 方式,需要使用者計算機上安裝有 office excel,否則就失敗;

2、由於是隱藏啟動 office excel,而 mcirosoft 的一貫作風就是功能強大、體積巨大無比,所以這個速度是個很大的瓶頸,如果是批量讀取的話,那...

3、它的基本方法是使用匯出 .h 進行 ole 操作,但是網上關於 excel ole 的完善的參考資料並不是很多,大多也是抄來抄去,所以要想很好的使用它們,恐怕還要好好的探索一下。

不過總之,這種方式在檔案數目不多,對功能要求大過速度的話,這是首選。

**可參考:http://blog.csdn.net/hyz_9257/archive/2008/12/27/3621309.aspx

二、ado/odbc 的方式

這種方式需要確保 odbc 中已安裝有 excel **檔案的驅動 "microsoft excel driver (*.xls)",所以同樣依賴於 office excel 是否安裝。

常規例子:http://www.vckbase.com/document/viewdoc/?id=421

這裡不得不提的是:新加坡人 yap chun wei 在 codeproject 上 2001 年發布的 cspreadsheet,非常流行的乙個 excel 操作類。位址是:http://www.codeproject.com/kb/database/cspreadsheet.aspx

具體我在最後第六點來介紹和對比。

三、sourceforge 上的開源 excel 庫

四、第三方收費 excel 操作庫

第三方收費的,找到乙個 libxl (注意不是 libxls),他的官方**是 http://www.libxl.com/,首先嘗試找了一下 cr,可惜沒有,由於工期緊,我甚至都考慮要付費購買乙份授權,$199 啊!在決定之前,還是先好好測試一下他的功能是否達到我的要求,於是編譯了他的幾個 demo,居然... 他自己的 edit demo 居然連自己 generate demo 程式生成的 excel 都打不開,俺機器可是安裝的有 office excel 的呀!實在是,寒

五、一些不需要依賴 office excel 的方式

網上還有一些說的不依賴 office excel 的方式,比如 http://www.vckbase.com/document/viewdoc/?id=815,但,說實話,這裡的只是理論可行,離實際運用還有很遠的路需要走。

六、重點推薦的

噹噹噹噹,basicexcel !

他的作者和 cspreadsheet 的作者是同乙個,不過是因為他考慮到以前 cspreadsheet 的一些侷限性和想實現相容性,重新寫的。位址是:http://www.codeproject.com/kb/office/basicexcel.aspx

對比 cspreadsheet,他的優點在於:

1、cspreadsheet 採用 cstringarray 賦值和取值,所以對數字等都處理不是很合適;

2、cspreadsheet  採用 odbc 方式,odbc 是拿來當資料庫讀取和賦值的,所以,必須依賴於 office 是否安裝;odbc 的速度也是一大瓶頸;而 basicexcel 直接解析 excel 格式,從檔案下手,速度有相當提高,並且不再依賴於 office 是否安裝;

3、cspreadsheet 不支援對 sheet 的操作,而 basicexcel 可以;

4、cspreadsheet 需要被讀取的 excel 每一列需要乙個列頭,比如「姓名」、「年齡」等,不是 excel 自身的 a、b、aa 等,沒辦法,要作為 odbc 資料來源使用,需要相當於資料庫表的列名一樣,這是不可避免的;

眾多優點,是 cspreadsheet 不能比的,所以作者在 2006 年新發布了這個類。

我的起點,便在這裡。

由於作者在發布這一款操作類的時候,考慮的更多是跨平台性,windows/(*)nix,所以採用的都是標準 c++ 函式,如 wcstombs、wcscpy 等,而這些在 visual studio 在被認為是不安全的,microsoft 認為存在緩衝區溢位的隱患,所以 microsoft 建立了一系列自己的函式,加了個 _s,如 wcstombs_s 等,另外由於不同的平台對 int short 等的精度不一樣,所以還會有「初始化截斷常量」這樣怪異的警告。總共編譯下來居然有 200 多個 warnning,要崩潰了!於是乙個乙個修改,終於到最後消滅了所有的 warnning。

另外乙個我做的很大的調整就是完善對 unicode 的支援。原類中作者似乎並沒有考慮到這些,或者說是考慮的不全(誰叫人家新加坡的官方語言是英語呢?),所以只要開啟或者儲存的檔案中含有中文,必定失敗,被這個問題折騰了好久,一點點修改、除錯。增加了很多 wchar_t* 形式的過載函式。

對這些類的收集、分析和 basci excel 的修改和除錯,整整用了我 5 天時間!不過好在,到昨天凌晨,終於大功告成了,可以完美的支援 unicode 了,嘿嘿

SNMP 在vs2008下的編譯

專案要做snmp的網路管理軟體,用c 開發,在網上查了些資料,決定用snmp 開發包來做。我用的環境是vs2008,在網上基本就沒找到資料,查了很多在vc6.0下編譯的,發現大家也都有很多問題,我自己就試了很久才成功,怕之後忘了,來記錄下來 是在這篇文章的基礎上做的謝謝 libdes l 4.01a...

boost asio在VS2008下的編譯錯誤

boost asio在vs2008下的編譯錯誤。公升級vs到vs2008後,編譯boost asio出錯,old win sdk compat.hpp 58行報錯,該行 是 struct in6 addr emulation u char s6 addr 16 究其原因,是因為c program f...

在VS2008中配置QT

學了這麼多年的c 最近才開始研究qt。用了一段時間的wpf,覺得當年苦哈哈的學習mfc真是太傻了。用過openframeworks,覺得也還不錯,但是功能還是不夠強大,尤其在ui設計方面,所以現在開始學習qt,希望不會太晚。簡單介紹一下qt在vs2008中的配置。qt win opensource ...