關於如何使用MFC寫EXCEL表的問題,這已經是第三次做了。這一次一定要成功!使用的是OLE技術(對象鏈接與嵌入)
環境:Windows 7 旗艦版,32位操作系統,VC6.0,MFC,WPS,接下來以新建一個EXCEL並寫入“Hello Excel”爲例說明具體用法
第一步:建立一個OLE自動化工程
1,首先新建一個對話框,並加上一個按鈕“新建”,其功能爲點擊按鈕就新建一個excel表並寫入“Hello Excel”,該Excel命名自定義
2,View -->ClassWizard --> AddClass --> From a type library -->WPS Office(需要自己知道自己的WPS安裝的位置)--> office6(我這裏有兩個文件夾都有office6這個文件夾,此時隨便找了一個)-->etapi.dll --> 打開 --> 把類全選,雖然很多沒必要 --> OK ,這個時候就添加結束,可以看到多了“etapi.h”和“etapi.cpp”。關於這一個步驟如果使用的微軟的excel時,選擇C:\Program Files\Microsoft Office\Office12\EXCEL.EXE (具體位置跟自己電腦有關)將接口列表中的_Application, _Workbook, _Worksheet, Range, Ranges, Workbooks, Worksheets 等類添加。點擊“完成”。
3,打開stdafx.h頭文件確保包含如下頭文件: #include <afxdisp.h> #include "etapi.h"。注意先後順序
4,打開NewExcel.cpp文件(主窗口),修改CNewExcelApp::InitInstance(),加入如下代碼:
BOOL CNewExcelApp::InitInstance()
{
if(!AfxOleInit())
{
AfxMessageBox("初始化OLE出錯!");
return false;
}
AfxEnableControlContainer();
...
...
}
5, 打開"etapi.h",首尾加#if !defined ETAPI #define ETAPI #endif防止重複定義(c++類頭文件的一般做法)。到此OLE自動化工程全部完成。
注意:編譯時可能缺少DLL文件,如mfc42d.dll、msvcrtd.dll、mfco42d.dll,下載後放入C:\WINDOWS\system32文件夾
6,Project --> Settings --> General --> Microsoft Foundation Classes --> Use MFC in a Static Library
這一小塊的知識點並沒有完全搞清楚,就是Static Library和Shared DLL執行到CreateDispatch(“Excel.Application”)函數時,不一樣。
第二步:操作excel文件。
1,寫,先看結果,
代碼如下:
_Application app; // 先創建一個_Application類,用_Application來創建一個Excel應用程序
接口。
Workbooks books; // 工作簿集合
_Workbook book; // 工作簿
Worksheets sheets; // 工作表集合
_Worksheet sheet; // 工作表
Range range; // 單元格
Font font;
Range cols;
COleVariant covOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR);
if(!app.CreateDispatch("Excel.Application")) // 啓用excel服務器
{
this->MessageBox("無法創建excel應用!");
return;
}
/************************************************************************************
*app.CreateDispatch("Excel.Application") 之後
*
* 開始查類型庫(註冊表),找到 Excel 的安裝路徑等各種信息,然後啓動該程序(叫宿主程序)。
*
* 1.如果註冊表損壞導致類型註冊信息丟失或不完整,就找不到了,啓動失敗。
*
* 2.如果宿主程序本身已經啓動了,而且剛好在做其他的事情,剛好又停止響應了,那麼,自然會啓動失
* 敗。
************************************************************************************/
books = app.GetWorkbooks();
book = books.Add(covOptional);
sheets = book.GetSheets();
sheet = sheets.GetItem(COleVariant((short)1));
range = sheet.GetRange(COleVariant("A1"), COleVariant("A1"));
// 參數A1A1表示定位了一個單元格A1,如果是A1D9就表示定位了A1到D9的一個矩形區域。
range.SetValue2(COleVariant("Hello Excel"));
// 設置寬度爲自適應,以下兩句缺一不可
cols = range.GetEntireColumn();
cols.AutoFit();
app.SetVisible(true);
app.SetUserControl(true);
剩下的操作用時百度嘍!
簡單介紹幾個實操:
1,有的時候單元格內的數據對不齊,這時候可以用Range的類成員函SetHorizontalAlignment(COleVariant((long)-4108));實現居中對齊,爲水平對齊的一種,SetVerticalAlignment爲垂直對齊函數。具體參數表示意思如下:
//水平對齊:默認=1,居中=-4108,左=-4131,右=-4152
//垂直對齊:默認=2,居中=-4108,左=-4160,右=-4107
2,保存,將文件以具體的名字保存到具體的路徑中。
m_WorkBook.SaveAs(COleVariant(strExcelPath),covOptional,covOptional, //保存該excel
covOptional, covOptional, covOptional, (long)0, covOptional,
covOptional, covOptional, covOptional, covOptional);
strExcelPath爲文件全稱,包括了文件路徑+文件名+後綴.xlsx
參考:http://www.cnblogs.com/QSHL/p/10296079.html https://wenku.baidu.com/view/4340358d9fc3d5bbfd0a79563c1ec5da50e2d6c0.html