编程笔记--excel 连接MFC (vs2010)(一)
2012-11-06 14:15阅读:
要实现,将excel 与MFC 连接,并且对txt文件中的信息进行筛选后显示到新建的excel表中。
前提条件:电脑上已经安装了某版本的offic。我安装的是offic 2007.
主要步骤:
1. 创建新的C++工程
创建基于对话框的MFC程序
2. 添加库、添加Excel类库
选择“项目”-》“类向导”-》添加类-》选择“数据库中的MFC类”,
类来源选“注册表”,在可用的类型库中选择“Microsoft Excel 11.0 ObjectLibrary”(或者 类来源选“文件”,在当地磁盘中,按照offic的安装路径(如:C:\ProgramFiles\MicrosoftOffice\Office12)找到excel.exe,双击选中),在接口列表框中选择需要的类,在此,我们选择_Application,_Workbook,Worksheet,Range,Workbooks,Worksheets这六个就可以了。
X
可以看到,六个类被添加了进来。
3. 修改头文件
分别将加进来的六个头文件上面的“#import 'C:\\Program Files\\MicrosoftOffice\\OFFICE11\\EXCEL.EXE' no_namespace”注释掉。
4. 添加头文件
在stdAfx.h头文件中添加加进来的这几个头文件
#include 'CApplication.h'
#include 'CRange.h'
#include
加载中...
内容加载失败,点击此处重试
加载全文
'CWorkbook.h'
#include 'CWorkbooks.h'
#include 'CWorksheet.h'
#include 'CWorksheets.h'
5. 修改错误
编译,会出现两个错误:
…\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()”,这样就可以编译成功了。
////////////////////////////////////////////////////////////
//实现新建一Excel文件(存在则覆盖),并向文件中写入数据。
//////////////////////////////////////////////////////////////////////////////////////
//excel 格式
//////////////////////////////////////////////////////////////////////////////////////
COleVariant
covTrue((short)TRUE),
covFalse((short)FALSE),
covOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR);
CApplication app;
CWorkbook book;
CWorkbooks books;
CWorksheet sheet;
CWorksheets sheets;
CRange range;
CFont0 font;
if (::CoInitialize( NULL ) == E_INVALIDARG)
{
AfxMessageBox(_T('初始化Com失败!'));
}
if (!app.CreateDispatch(_T('Excel.Application')))
{
MessageBox(_T('Error!Create Excel Application ServerFaile!'));
}
//////////////////////////////////////////////
////////////////////////////////////////////////
books = app.get_Workbooks();
//books.AttachDispatch(app.get_Workbooks());可代替上面一行
book = books.Add(covOptional);
//book.AttachDispatch(books.Add(covOptional),true); 可代替上面一行
sheets=book.get_Worksheets();
//sheets.AttachDispatch(book.get_Worksheets(),true); 可代替上面一行
sheet = sheets.get_Item(COleVariant((short)1));
//添加工作表的名称
LPCTSTR st=strtime;
sheet.put_Name(st);
////////////////////////////////////////////////////////////
VARIANT varUnit;
VariantInit(&varUnit);
varUnit.vt = VT_I4;
varUnit.lVal = 15;
range =sheet.get_Range(COleVariant(_T('A1')),COleVariant(_T('D2')));
range.Merge(covOptional);
font = range.get_Font();
font.put_Name(COleVariant(_T('黑体')));
font.put_Size(varUnit);
range.put_Value2(COleVariant(_T('刷写日志')));
varUnit.lVal = -4108;//水平:-4131靠左;-4152靠右。垂直:-4160靠上;-4107靠下。
range.put_HorizontalAlignment(varUnit); //xlCenter 水平居中
range.put_VerticalAlignment(varUnit);//xlCenter 垂直居中
//////////////////////////////////////////////////////////////
range =sheet.get_Range(COleVariant(_T('A3')),COleVariant(_T('D3')));
range.Merge(covOptional);
font = range.get_Font();
font.put_Name(COleVariant(_T('宋体')));
varUnit.lVal = 10;
font.put_Size(varUnit);
CString strdate;
strdate = '日期:';
strdate +=strtime;
range.put_Value2(COleVariant(strdate));
//设置表头
range.put_Item(_variant_t((long)2),_variant_t((long)1),_variant_t(_T('时间')));//行号,列号,内容
range.put_Item(_variant_t((long)2),_variant_t((long)2),_variant_t(_T('设备号')));
range.put_Item(_variant_t((long)2),_variant_t((long)3),_variant_t(_T('刷写情况')));
range.put_Item(_variant_t((long)2),_variant_t((long)4),_variant_t(_T('失败原因')));
//设置列宽
range =sheet.get_Range(COleVariant(_T('A1')),COleVariant(_T('C1')));
range.put_ColumnWidth(_variant_t((long)15));
range =sheet.get_Range(COleVariant(_T('D1')),COleVariant(_T('D1')));
range.put_ColumnWidth(_variant_t((long)40));
range =sheet.get_Range(COleVariant(_T('A1')),COleVariant(_T('D1')));
///////////////////////////////////
CString sumstr,rowstr,endstr;
CString sr;
rowstr.Format(_T('%d'),(int)row);
sumstr='A';
sumstr+=rowstr;
endstr= 'D';
endstr +=rowstr;
range =sheet.get_Range(COleVariant(sumstr),COleVariant(endstr));
range.Merge(covOptional);
font = range.get_Font();
font.put_Name(COleVariant(_T('宋体')));
varUnit.lVal = 10;
font.put_Size(varUnit);
sumstr.Format(_T('%d'),sum);
sr='刷写总次数:';
sr +=sumstr;
range.put_Value2(COleVariant(sr));
row++;
/////////////////////////////////////////
rowstr.Format(_T('%d'),(int)row);
sumstr='A';
sumstr+=rowstr;
endstr= 'D';
endstr +=rowstr;
range =sheet.get_Range(COleVariant(sumstr),COleVariant(endstr));
range.Merge(covOptional);
font = range.get_Font();
font.put_Name(COleVariant(_T('宋体')));
varUnit.lVal = 10;
font.put_Size(varUnit);
sumstr.Format(_T('%d'),pass);
sr='刷写成功次数:';
sr +=sumstr;
range.put_Value2(COleVariant(sr));
row++;
/////////////////////////////////////////
rowstr.Format(_T('%d'),(int)row);
sumstr='A';
sumstr+=rowstr;
endstr= 'D';
endstr +=rowstr;
range =sheet.get_Range(COleVariant(sumstr),COleVariant(endstr));
range.Merge(covOptional);
font = range.get_Font();
font.put_Name(COleVariant(_T('宋体')));
varUnit.lVal = 10;
font.put_Size(varUnit);
sumstr.Format(_T('%d'),fail);
sr='刷写失败次数:';
sr +=sumstr;
range.put_Value2(COleVariant(sr));
row++;
/////////////////////////////////////////////////////////
//显示表格
app.put_Visible(TRUE);
//保存
CString strFile = _T('D:\\WriteToExcelTest.xlsx');
strFile = 'D:\\';
strFile +=strtime;
strFile +='.xlsx';
book.SaveCopyAs(COleVariant(strFile));
book.put_Saved(true);
//结尾,释放
book.ReleaseDispatch();
books.ReleaseDispatch();
app.ReleaseDispatch();
app.Quit();
分享
我的博客
微博
微信
朋友圈
4
N
同时转发到微博
发送