Visual Studio 2012 —— 創建EXCEL表格

方法一:實現簡單(C++),功能單一,對環境要求低

1、頭文件

#include<fstream>

2、創建EXCEL表格

ofstream oFile;

//取個名字
CString m_strName = _T("xxx");
//後綴
//此方法只能創建.csv格式
CString strSuffix = _T(".csv");
char *m_clsExcelName = new char[128];
#ifdef _UNICODE
    USES_CONVERSION;
    // T2A():CString 轉 char*
    strcpy_s(m_clsExcelName, strlen(T2A(m_strName + strSuffix));
#else
    strcpy_s(m_clsExcelName, strlen(m_strName + strSuffix);
#endif

//生成的路徑是可以設置的
oFile.open(m_clsExcelName,ios::out|ios::trunc);

//防止內存泄漏
delete []m_clsExcelName;
m_clsExcelName = NULL;

//打印內容(.csv格式以逗號爲分隔符)
int m_nId = 1;
oFile<<"ID:"<<","<<m_nId<<endl;
//空行
oFile<<" "<<endl;
//所有需要打印的字符串都需要轉化爲char*格式
CString m_strNO = _T("10");
char *strNo = new char[32];
#ifdef _UNICODE
    USES_CONVERSION;
    strcpy_s(strNo, strlen(T2A(m_strNO))+1, T2A(m_strNO));
#else
    strcpy_s(strNo, strlen(m_strNO)+1, m_strNO);
#endif
oFile<<"編號:"<<","<<strNo<<endl;

delete []strNo;
strNo = NULL;

oFile.close();

方法二、稍複雜(MFC),功能多樣,需要下載EXCEL

1、下載安裝Office

2、右擊MFC項目->【添加】->【類】->【Visual C++】->【MFC】->【TypeLib中的MFC類】->【添加】

以下A、B兩種方法均可

選項A:

類來源=> "註冊表"=> 類型庫=>在【可用的類型庫】中選擇【Microsoft Excel 16.0 Object Library<1.9>】

【接口】中選擇_Application,_Workbook,_Worksheet,Range,Workbooks,Worksheets,Font這7個接口。

選項B:類來源=> "文件"=> 找到"EXCEL.EXE"文件的位置=> 添加上述7個接口。

3、修改頭文件

分別將加進來的7個頭文件上面的“#import "C:\\Program Files (x86)\\Microsoft Office\\Root\\Office16\\EXCEL.EXE" no_namespace”註釋掉。

 

【注】編譯時可能會報錯

…\crange.h(335): warning C4003: “DialogBoxW”宏的實參不足
…\crange.h(335): error C2059: 語法錯誤:“,”

【解決方案】


雙擊錯誤提示,定位在錯誤行,
    VARIANT DialogBox()
    {
         VARIANT result;
         InvokeHelper(0xf5, DISPATCH_METHOD, VT_VARIANT, (void*)&result, NULL);
         return result;
    }
將該函數名“DialogBox()”前面加“_”下劃線,即“_DialogBox()”,這樣就可以編譯成功了。

4、頭文件

#include "CApplication.h"
#include "CFont0.h"
#include "CRange.h"
#include "CWorkbook.h"
#include "CWorkbooks.h"
#include "CWorksheet.h"
#include "CWorksheets.h"

5、創建EXCEL表格

//EXCEL軟件
CApplication app;
//工作簿
CWorkbook book;
//工作簿集合
CWorkbooks books;
//工作表
CWorksheet sheet;
//工作表集合
CWorksheets sheets;
//選區
CRange range;
//字體
CFont0 font;

COleVariant covOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR);
if (!app.CreateDispatch(_T("Excel.Application")))
{
	this->MessageBox(_T("無法啓動Excel應用!"));
	return;
}
	
books = app.get_Workbooks();
book = books.Add(covOptional);
sheets = book.get_Worksheets();
//獲取第一個工作表
sheet = sheets.get_Item(COleVariant((short)1));  
//工作表名稱
CString strSheetName = _T("test1");
sheet.put_Name(strSheetName);

//選中A1-K1
range = sheet.get_Range(COleVariant(_T("A1")), COleVariant(_T("K1"))); 
//合併
range.Merge(_variant_t((long)0));
/*//設置列寬
range.put_ColumnWidth(_variant_t((long)8));
//設置上下邊距
 range.put_RowHeight(_variant_t((long)36));*/
//打印想要的內容
range.put_Value2(COleVariant(_T("拳打北海幼兒園,腳踢南山敬老院")));  
//水平方向和豎直方向居中
//水平對齊:默認=1,居中=-4108,左=-4131,右=-4152   
//垂直對齊:默認=2,居中=-4108,左=-4160,右=-4107  
range.put_HorizontalAlignment(COleVariant((long)-4108)); 
range.put_VerticalAlignment(COleVariant((long)-4108)); 
//修改字體樣式
font.AttachDispatch(range.get_Font());
font.put_Name(_variant_t("Times New Roman"));
//加粗
font.put_Bold(_variant_t((long)1));
font.put_Size(_variant_t((long)20));

range = sheet.get_Range(COleVariant(_T("A2")), COleVariant(_T("A2"))); 
range.put_Value2(COleVariant((long)1));
range = sheet.get_Range(COleVariant(_T("B2")), COleVariant(_T("K2"))); 
//自動換行
//range.put_WrapText(_variant_t((long)1));
//強制換行
CString strFirst = _T("贏則雙親健在");
CString strSecond = _T("輸則族譜昇天");
range.put_Value2(COleVariant(COleVariant(strFirst  + '\n' + strSecond)));
range = sheet.get_Range(COleVariant(_T("A2")), COleVariant(_T("K2"))); 
range.put_VerticalAlignment(COleVariant((long)-4108)); 
font.AttachDispatch(range.get_Font());
font.put_Name(_variant_t("Times New Roman"));
font.put_Size(_variant_t((long)11));

//若是浮點數——設置小數位
//range.put_NumberFormat(COleVariant(_T("0.000")));

//畫邊框
CString strCellName;
for(int i=1; i <= 2; i++){
    for(int j=1; j <= 11; j++){
	strCellName.Format(_T("%c%d"), j+64, i);
	range.AttachDispatch(sheet.get_Range(COleVariant(strCellName), COleVariant(strCellName)));
         range._BorderAround(_variant_t((long)1),_variant_t((long)3),_variant_t((long)-4105), vtMissing);
    }
}

/**  
*//保存excel文件
*COleVariant VOption((long)DISP_E_PARAMNOTFOUND,VT_ERROR);
*book.SaveAs(COleVariant(path),VOption,VOption,VOption,VOption,VOption,(long)0,VOption,VOption,VOption,VOption,VOption);
**/
// 保存
book.SaveCopyAs(COleVariant(EXCEL_FILE + strSheetName  + _T(".xlsx")));
book.put_Saved(TRUE);

// 釋放對象
books.ReleaseDispatch();
book.ReleaseDispatch();
sheets.ReleaseDispatch();
sheet.ReleaseDispatch();
range.ReleaseDispatch();
font.ReleaseDispatch();

app.Quit();
// 退出 Excel 程序,注意這裏要先退出,後釋放
app.ReleaseDispatch();


 

 

 

 

定義生成路徑

#define EXCEL_FILE	ReturnPath()+ _T("\\EXCEL REPORT\\")

CString ReturnPath()  
{
	CString sPath;
	GetModuleFileName(NULL, sPath.GetBufferSetLength(MAX_PATH+1), MAX_PATH);   
	sPath.ReleaseBuffer();
	int nPos;
	nPos=sPath.ReverseFind('\\');
	sPath=sPath.Left(nPos);
	return sPath;
}

2、

 

 

 

 

 

 

 

 

 

 

 

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