实现功能:
在基于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("数据保存成功!"));
以上就完成了,点击保存按钮后就可以保存数据了。 可以根据自己的需求 做相应的修改。
保存后的效果如下: