MFC导出到EXCLE

软件:vs2013

程序功能:将ListControl内容导出到Excle里

步骤:

第一步:创建基于对话框的MFC工程

第二步:添加库、添加Excle类库

在工程名上右键,选择“添加”—“类”(或者点击菜单栏的“项目”->“添加类”),选择“TypeLib中的MFC类”(MFC Class From TypeLib)

类来源选“注册表”,在可用的类型库中选择“Microsoft Excel 12.0 Object Library<1.6>”在接口列表框中选择需要的类,在此,我们选择_Application,_Workbook,Worksheet,Range,Workbooks,Worksheets这六个就可以了。

但是有的接口里没东西,例如:

怎么办呢?不急。可以选“文件”,找到EXCEL.EXE的位置,来进行添加:(我的位置在:D:\office\Office14\EXCEL.EXE)

第三步:修改头文件

分别将加进来的六个头文件上面的“#import "C:\\Program Files\\Microsoft Office\\OFFICE11\\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()”,这样就可以编译成功了。

第五步:删除对话框内容,添加对应控件

1.在对话框中添加列表控件,关联变量m_Grid,并设置显示为报表样式:

打开工具箱选择List Control(列表控件),移到合适位置后,更改属性,鼠标右击选择“属性”,View-->Report,Border-->True

添加变量:类别Control,变量名m_Grid

2.在对话框中添加“导出”按钮

第六步:代码(可以直接将代码复制运行下)

添加头文件

#include "CWorkbook.h"                //管理单个工作表
#include "CWorkbooks.h"         //统管所有的工作簿
#include "CApplication.h"          //Excel应用程序类,管理我们打开的这整个Excel应用
#include "CRange.h"               //区域类,对EXcel的大部分操作都要和这个打招呼
#include "CWorksheet.h"            //工作薄中的单个工作表
#include "CWorksheets.h"            //统管当前工作簿中的所有工作表

在初始化函数中,先初始化列表(C导出到ExcleDlg::OnInitDialog)红框里为添加的代码位置

//设置列表视图的扩展风格
	m_Grid.SetExtendedStyle(LVS_EX_FLATSB            //扁平风格显示滚动
		| LVS_EX_FULLROWSELECT                       //允许整行选中
		| LVS_EX_HEADERDRAGDROP               //允许整列拖动
		| LVS_EX_ONECLICKACTIVATE                //单击选中项
		| LVS_EX_GRIDLINES                  //画出网格线
		);
	//设置表头
	m_Grid.InsertColumn(0, _T("编号"), LVCFMT_LEFT, 80, 0);
	m_Grid.InsertColumn(1, _T("姓名"), LVCFMT_LEFT, 80, 1);
	m_Grid.InsertColumn(2, _T("所属部门"), LVCFMT_LEFT, 80, 2);

	//向列表中插入数据
	int count = 0;
	m_Grid.InsertItem(count, _T("001"));//行
	m_Grid.SetItemText(count, 1, _T("张一"));
	m_Grid.SetItemText(count++, 2, _T("销售部"));

	m_Grid.InsertItem(count, _T("002"));
	m_Grid.SetItemText(count, 1, _T("张二"));
	m_Grid.SetItemText(count++, 2, _T("研发部"));
	m_Grid.InsertItem(count, _T("003"));
	m_Grid.SetItemText(count, 1, _T("张三"));
	m_Grid.SetItemText(count++, 2, _T("采购部"));
	m_Grid.InsertItem(count, _T("004"));
	m_Grid.SetItemText(count, 1, _T("张四"));
	m_Grid.SetItemText(count, 2, _T("宣传部"));

编写按钮的响应函数:
 

	CString strFile = _T("E:\\Test.xls");
	COleVariant
		covTrue((short)TRUE),
		covFalse((short)FALSE),
		covOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR);
	CApplication app;
	CWorkbooks books;
	CWorkbook book;
	CWorksheets sheets;
	CWorksheet sheet;
	CRange range;
	CFont font;
	if (!app.CreateDispatch(_T("Excel.Application")))
	{
		MessageBox(_T("创建失败!"));
		return;
	}

	books = app.get_Workbooks();
	book = books.Add(covOptional);
	sheets = book.get_Worksheets();             //得到books
	sheet = sheets.get_Item(COleVariant((short)1));
	//得到全部Cells
	range.AttachDispatch(sheet.get_Cells());
	CString sText[] = { _T("编号"), _T("姓名"), _T("所属部门") };
	for (int setnum = 0; setnum < m_Grid.GetItemCount() + 1; setnum++)   //GetItemCount()列表的里面的条目数量, 横着的  行
	{
		for (int num = 0; num < 3; num++)
		{
			if (!setnum)
			{
				range.put_Item(_variant_t((long)(setnum + 1)), variant_t((long)(num + 1)),
					_variant_t(sText[num]));
			}
			else
			{
				range.put_Item(_variant_t((long)(setnum + 1)), _variant_t((long)(num + 1)),
					_variant_t(m_Grid.GetItemText(setnum - 1, num)));//GetItemText()获取第setnum-1行,num列的文本
			}
		}
	}
	//保存
	book.SaveCopyAs(COleVariant(strFile));  //SaveCopyAs在strFile路径下保存为指定格式.xlsx的文件
	book.put_Saved(true);   //将Workbook的保存状态设置为已保存,即不让系统提示是否人工保存
	app.put_Visible(true);        //设置表可见性

	//释放对象
	range.ReleaseDispatch();
	sheet.ReleaseDispatch();
	sheets.ReleaseDispatch();
	book.ReleaseDispatch();
	books.ReleaseDispatch();
	app.ReleaseDispatch();
	app.Quit();

最终结果如下:

按下导出按钮后

猜你喜欢

转载自blog.csdn.net/cai_niaocainiao/article/details/81606324