VS2010 MFC 将多次运行的Edit Control数据保存到Excel中

实现功能:
在基于MFC 的对话框项目中,将Edit Control 中显示的多次运行的数据保存在Excel中。

详细步骤如下:
1.在建立的基于MFC的对话框项目中,打开类向导 > 点击添加类右边的下拉箭头 > 选择 类型库中的MFC类
在这里插入图片描述
2. 选择 文件 > 选择电脑中安装Microsoft office 路径内的 EXCEL.EXE > 添加如下图中的几个文件。
在这里插入图片描述
其中:
Application :代表应用程序本身。即Excel应用程序
Workbooks :工作薄的集合
Workbook :工作簿,是Workbooks的子对象
Worksheets :是Worksheet(工作表)的集合,是Workbook的子对象
Worksheet :工作表,是Worksheets的子对象

3.添加完成后,将每个类对应的头文件中的 如下图所示的语句注释掉
在这里插入图片描述
3. 在要操作 Excel的 Dlg.cpp 文件中添加 以下头文件
在这里插入图片描述
4.在项目的 .cpp文件的 BOOL CSaveExcelTestApp::InitInstance() 函数中 ,在INT_PTR nResponse = dlg.DoModal(); 语句之前添加 如下语句

if (CoInitialize(NULL)!=0) 
	{ 
		AfxMessageBox(_T("初始化COM支持库失败!")); 
		exit(1); 
	} 

编译程序后会出现如下报警
在这里插入图片描述
解决方法:
在CRange类中,DialogBox()前面添加下划线变成_DialogBox()。
在这里插入图片描述

5.在SaveExcelTestDlg.h 头文件中 定义一个CString 类型的数组,用于存储多次运行的数据。

CString InsData[100];
int n ;

转存数据如下

UpdateData(true);
	InsData[n] = m_Edit1_Data;
	if(n==100)
	{
		n = 0;
	}
	else 
		n++;

m_Edit1_Data 是 Edit Control 的Cstring 类型的 值成员变量。

6.在对话框内新建1个保存按钮,双击进入 void CSaveExcelTestDlg::OnBnClickedButton1() 函数,添加如下程序:

	CWorkbooks    books;
	CWorkbook     book;
	CApplication  	app;
	CWorksheets   sheets;
	CWorksheet    sheet;
	CRange        range;
	CRange		  cols;
 
	COleVariant   vResult;
	COleVariant   covOptional((long) DISP_E_PARAMNOTFOUND,VT_ERROR);

	CTime tm = CTime::GetCurrentTime();  
	CString str,str1,str2;  
	CString Range[]={_T("A"),_T("B"),_T("C"),_T("D"),_T("E"),_T("F")};
	CString title[]={_T("NO."),_T("数据1"),_T("数据2"),_T("数据3"),_T("数据4"),_T("数据5")};
	int i = 0;
	
	if (!app.CreateDispatch(_T("Excel.Application")))
	{
		AfxMessageBox(_T("无法启动服务器"));
		return ;
	}
 
	books.AttachDispatch(app.get_Workbooks()); 
 
	//得到Workbook  
	book.AttachDispatch(books.Add(covOptional),true);  
 
	//得到Worksheets  
	sheets.AttachDispatch(book.get_Worksheets(),true);  
	
	sheet.AttachDispatch(sheets.get_Item(_variant_t("sheet1")),true); 

	
	for(int j=0;j<6;j++)
	{
		str.Format(_T("%s%d"),Range[j],1);
		range=sheet.get_Range(COleVariant(str),COleVariant(str));
		range.put_Value2(COleVariant(title[j]));
		cols = range.get_EntireColumn();//选择整列,并设置宽度为自适应
		cols.AutoFit();
	}
	

	for(int k=0;k<(n/5);k++)
	{
		for(int j=1;j<6;j++)
		{
			str.Format(_T("%s%d"),Range[0],k+2);
			str2.Format(_T("%d"),k+1);
			range=sheet.get_Range(COleVariant(str),COleVariant(str));
			range.put_Value2(COleVariant(str2));

			str.Format(_T("%s%d"),Range[j],k+2);
			range=sheet.get_Range(COleVariant(str),COleVariant(str));
			range.put_Value2(COleVariant(InsData[i]));
			if(i==n)
			{
				i = 0;
			}
			i++;
		}

	}
	

	//range=sheet.get_Range(COleVariant(_T("A")+ (str.Format("%d",i))),COleVariant(_T("A1")));
	//range.put_Value2(COleVariant(str3[i]));
	
	//app.put_Visible(TRUE);  
	str1.Format(_T("e:\\%d%d%d%-d%d%d_InsData.xlsx"),tm.GetYear(),tm.GetMonth(),tm.GetDay(),tm.GetHour(),tm.GetMinute(),tm.GetSecond());  
	book.SaveCopyAs(COleVariant(str1)); //按保存时间命名保存数据文件,地址在E盘
	book.put_Saved(TRUE);
 
	
	books.Close();
	app.Quit();
	range.ReleaseDispatch();
	sheet.ReleaseDispatch();
	sheets.ReleaseDispatch();
	book.ReleaseDispatch();
	books.ReleaseDispatch();
	app.ReleaseDispatch();
	AfxMessageBox(_T("数据保存成功!"));

以上就完成了,点击保存按钮后就可以保存数据了。 可以根据自己的需求 做相应的修改。
保存后的效果如下:
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/madao1234/article/details/90208080
今日推荐