vc操作Excel儲存 和Excel的退出
最近在做個數據庫程式,因為有些資料使用者要求匯出到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元件
[cpp:nogutter] view plaincopyprint?- if(!AfxOleInit())
- {
- AfxMessageBox("無法初始化COM的動態連線庫");
- return FALSE;
- }
然後,建立Excel 伺服器(啟動Excel)
定義app的全域性或成員變數 _Application app;
[cpp:nogutter] view plaincopyprint?- if (!app.CreateDispatch("Excel.Application"))
- {
- AfxMessageBox("無法啟動Excel伺服器");
- return FALSE;
- }
3、設定Excel的狀態 [cpp:nogutter] view plaincopyprint?
- app.SetVisible(bVisble); // 使Excel可見
- app.SetUserControl(bControl); // 允許其他使用者控制Excel
三、VC對Excel的操作
定義變數
[cpp:nogutter] view plaincopyprint?- Workbooks books;
- _Workbook book;
- Worksheets sheets;
- _Worksheet sheet;
- LPDISPATCH lpDisp;
- Range range;
- COleVariant covOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR);
1、開啟已有的Excel檔案
[cpp:nogutter] view plaincopyprint?- 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
先寫這麼多吧,以後再新增!