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、

 

 

 

 

 

 

 

 

 

 

 

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