MFC寫EXCEL

關於如何使用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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章