BasicExcel說明文檔
BasicExcel原始鏈接:
http://www.codeproject.com/Articles/13852/BasicExcel-A-Class-to-Read-and-Write-to-Microsoft
一個有用的連接:
http://www.360doc.com/content/12/0426/16/7023119_206710295.shtml
為防止此鏈接文章丟失,文章摘錄如下:
vc訪問excel的兩篇文章(主要介紹OLE方式)
文章一、Excel操作類-CSpreadSheet and BasicExcel
CSpreadSheet - A Class to Read and Write to Excel and Text Delimited Spreadsheet,使用ODBC操作Excel
http://www.codeproject.com/KB/database/cspreadsheet.aspx
BasicExcel - A Class to Read and Write to Microsoft Excel,直接從Excel文件格式出發,操作Excel
http://www.codeproject.com/KB/office/BasicExcel.aspx#
轉載:
由於工作需要,需要在excel和mysql數據庫之間互相交換數據,於是在網上搜索了一下用vc如何操作excel,基本上有三種實現方式,一種是利用odbc,一種是使用微軟的automation技術,一種就是直接分析excel的格式並進行解析。
在codeproject上找到兩個開源的操作類,一個是basicexcel,地址為:http://www.codeproject.com/KB/office/BasicExcel.aspx
一個是CSpreadSheet,地址為:http://www.codeproject.com/KB/database/cspreadsheet.aspx
兩個我都使用了一下,最后決定使用basicexcel,下面說說我的感受:
1 CSpreadSheet,采用odbc實現,速度慢,bug多,但是對中文支持比較好,但是有個讓我最不能忍受的確定,就是它把所有的數據寫入excel中時都當作字符串來實現,這樣導致在excel的每個field中的內容前都自動添加一個單引號,原因是excel為了防止自動格式轉換,添加一個單引號使得每個數據項都強制轉換成字符串類型。最后怎么都去不掉,只好放棄使用。
2 basicexcel,采用com方式實現,訪問速度快,api接口也比較簡單,可以隨意設置excel中field內容的類型,但是對於中文的支持不好,要自己處理漢字編碼,支持ansi字符和unicode字符。剛開始的時候寫入的漢字都是亂碼,后來自己做了字符轉換,吧gb2312編碼的漢字轉變成unicode編碼,就可以正常顯示了
這兩個類在官方網頁上都有api使用說明和示例工程,大家一起交流...
由於剛剛使用,感受暫時就這么多了,感覺微軟的東西還真是麻煩...
本文來自CSDN博客,轉載請標明出處:http://blog.csdn.net/handsing/archive/2010/04/08/5461070.aspx
最近在做個數據庫程序,因為有些數據用戶要求導出到Excel文件顯示(需要報給其他單位)。所以查閱了一下相關的VC的Excel編程操作,總結一下吧:(所有資料來源於網絡)
利用VC操作Excel的方法至少有兩種
1 .利用ODBC把Excel文件當成數據庫文件,來進行讀、寫、修改等操作,網上有人編寫了CSpreadSheet類,提供支持。
2. 利用Automation(OLD Automation)方法。將Excel當成組件服務器,利用VBA。又分為基於MFC的和SDK兩種。
主要研究了一下第二種基於MFC的OLE編程方法。
一、Excel的對象模型
在對Excel編程之前首先要了解微軟Excel 對象(Object)模型。(Parent-Child關系)
圖 1 Office 應用程序對象模型(Excel)From msdn
其中:
Application:代表應用程序本身。即Excel應用程序
Workbooks:是Workbook 的集合,代表了工作薄。
Worksheets:是Worksheet的集合,是Workbook的子對象。
Range:是Worksheet的子對象,可以理解為Sheet中一定范圍的單元格。
Shapes:是Worksheet的子對象,用於存儲圖片等信息的單元格。
二、VC操作Excel的初始化過程
1、導入Excel庫文件。
首先打開Class Wizard,點擊"Add class"按鈕下的"From a type Library"導入 office安裝目錄下的"excel.exe"(適用於 Excel2003),然后選擇需要用的一些類,比如_Application, _Workbook, Workbooks, Worksheets,_Wroksheet,Range,Shapes等。點擊確定后,系統會在你的程序目錄下生成excel.h和excel.cpp兩個文件,在要使用這些導入的類時加入#include "Excel.h"即可。
2、初始化Application。
首先, 初始化COM組件
view plaincopy to clipboardprint?
if(!AfxOleInit())
{
AfxMessageBox("無法初始化COM的動態連接庫");
return FALSE;
}
if(!AfxOleInit())
{
AfxMessageBox("無法初始化COM的動態連接庫");
return FALSE;
}
然后,創建Excel 服務器(啟動Excel)
定義app的全局或成員變量 _Application app;
view plaincopy to clipboardprint?
if (!app.CreateDispatch("Excel.Application"))
{
AfxMessageBox("無法啟動Excel服務器");
return FALSE;
}
if (!app.CreateDispatch("Excel.Application"))
{
AfxMessageBox("無法啟動Excel服務器");
return FALSE;
}
3、設置Excel的狀態
view plaincopy to clipboardprint?
app.SetVisible(bVisble); // 使Excel可見
app.SetUserControl(bControl); // 允許其他用戶控制Excel
app.SetVisible(bVisble); // 使Excel可見
app.SetUserControl(bControl); // 允許其他用戶控制Excel
三、VC對Excel的操作
定義變量
view plaincopy to clipboardprint?
Workbooks books;
_Workbook book;
Worksheets sheets;
_Worksheet sheet;
LPDISPATCH lpDisp;
Range range;
COleVariant covOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR);
Workbooks books;
_Workbook book;
Worksheets sheets;
_Worksheet sheet;
LPDISPATCH lpDisp;
Range range;
COleVariant covOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR);
1、打開已有的Excel文件
view plaincopy to clipboardprint?
books.AttachDispatch(app.GetWorkbooks());
// 或者也可以
// books = app.GetWorkbooks();
lpDisp = books.Open("D:////1.xls", covOptional, covOptional, covOptional, covOptional, covOptional, covOptional, covOptional, covOptional, covOptional, covOptional,
covOptional, covOptional, covOptional, covOptional);
books.AttachDispatch(app.GetWorkbooks());
// 或者也可以
// books = app.GetWorkbooks();
lpDisp = books.Open("D:////1.xls", covOptional, covOptional, covOptional, covOptional, covOptional, covOptional, covOptional, covOptional, covOptional, covOptional,
covOptional, covOptional, covOptional, covOptional);
2.、 新建一個.xls文件,並寫入數據
COleVariant covOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR);
// Get the Workbooks collection so that you can add a new workbook
books.AttachDispatch(app.GetWorkbooks()); // 得到Workbooks
book = books.Add(covOptional); // 得到Workbook
// Get the Worksheets collection so that you can get the IDispatch for the first Worksheet
sheets = book.GetWorksheets(); // 得到Worksheets
sheet = sheets.GetItem(COleVariant((short)1)); // 得到Worksheet
// 分別向每個單元格添加數據
// Excel2000 用函數SetValue()即可, Excel2003用函數SetValue2()
//
range = sheet.GetRange(COleVariant("A1"), covOptional); // 獲取A1 Range
range.SetValue2( COleVariant("Date")); // 添加數據
range = sheet.GetRange(COleVariant("B1"), covOptional); // 獲取B1 Range
range.SetValue2(COleVariant("Order")); // 添加數據
range = sheet.GetRange(COleVariant("C1"), covOptional); // 獲取C1 Range
range.SetValue2(COleVariant("Amount")); // 添加數據
range = sheet.GetRange(COleVariant("D1"), covOptional); // 獲取D1 Range
range.SetValue2(COleVariant("Tax")); // 添加數據
// 向單元格中添加公式
range = sheet.GetRange(COleVariant("D2"), covOptional); // 獲得D2 Range
range = range.GetResize(COleVariant((long)NUMROWS), COleVariant((long)1)); // 重新設置D2的大小
range.SetFormula(COleVariant("=C2*0.07")); // 給D2:D21設置公式
// 設置單元格的格式
range = sheet.GetRange(COleVariant("A1"), COleVariant("D1")); // 獲得A1:D1的Range
oFont = range.GetFont(); // 獲得Range的字體
oFont.SetBold(COleVariant((short)TRUE)); // 設置是否粗體
oFont.SetColor(COleVariant((long)RGB(255, 0, 0))); // 設置字體顏色
oFont.SetName(COleVariant("黑體")); // 設置字體類型
range = range.GetEntireColumn(); // 獲得全部的單元格
range.AutoFit(); // 自動適合尺寸
3、 合並單元格
// 思路:1.先獲取A1:C1的Range范圍,然后重新定義此范圍,最后合並
// 2.直接獲得A1:C2的Range范圍,直接合並。結果和第一種方法一樣
Range unionRange;
unionRange = sheet.GetRange(COleVariant("A1"), COleVariant("C1"));
vResult = unionRange.GetMergeCells();
unionRange = unionRange.GetResize(COleVariant((long)2), COleVariant((long)3));
unionRange.Merge(COleVariant((long)0)); //合並單元格
unionRange.SetRowHeight(COleVariant((short)30)); //設置單元格的高度
unionRange.SetHorizontalAlignment(COleVariant((long)-4108));// 水平居中對齊
4、向單元格中插入圖片(支持BMP、JPG格式,其他沒試)
Shapes shapes = sheet.GetShapes(); // 從Sheet對象上獲得一個Shapes
range = sheet.GetRange(COleVariant("B16"),COleVariant("J22")); // 獲得Range對象,用來插入圖片
rgMyRge1 = range;
shapes.AddPicture("D://Test1.jpg" , false , true ,
(float)range .GetLeft().dblVal, (float)range .GetTop().dblVal, // 從本地添加一個圖片
(float)range .GetWidth().dblVal, (float)range .GetHeight().dblVal);
ShapeRange sRange = shapes.GetRange(_variant_t(long(1)));
sRange.SetHeight(float(30));
sRange.SetWidth(float(30));
5、將已建的.xls文件另存為
COleVariant covOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR);
book.SaveAs(COleVariant("D://3.xls"),covOptional,covOptional,
covOptional,covOptional,covOptional,0,
covOptional,covOptional,covOptional,covOptional,covOptional);
6、關閉Excel服務
COleVariant covOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR);
book.SetSaved(TRUE); // 將Workbook的保存狀態設置為已保存,即不讓系統提示是否人工保存
range.ReleaseDispatch(); // 釋放Range對象
sheet.ReleaseDispatch(); // 釋放Sheet對象
sheets.ReleaseDispatch(); // 釋放Sheets對象
book.ReleaseDispatch(); // 釋放Workbook對象
books.ReleaseDispatch(); // 釋放Workbooks對象
book.Close (covOptional, covOptional,covOptional);// 關閉Workbook對象
books.Close(); // 關閉Workbooks對象
app.Quit(); // 退出_Application
app.ReleaseDispatch (); // 釋放_Application
下面是自己心得:
1、 BasicExcel_src (1).zip是此開源工具對應的源文件。
2、 BasicExcel_demo (1).zip和ExcelTest分別是作者和我做測試的兩個demo。
3、 BasicExcelChinese.rar是為了解決中文路徑問題對應的修改之后的源文件(作者提供的原始文件不能解決中文路徑問題,在其中設定了中文環境之后,即BasicExcelChinese,則可以解決中文路徑文件的讀寫)。當系統中可能會出現中文路徑時,可以使用此源文件,但是此源文件依然不能解決excel讀寫中文內容的問題。
4、 但是ConvertACPToUtf8.txt中的函數ConvertACPToUtf8()將GB2312轉換為Unicode,可以解決讀寫中文內容問題。
5、 經測試,發現兩個函數方法Save()似乎有bug不穩定,簡單的讀寫保存可以,復雜時出現錯誤。而SaveAs()可以。