我的程序需要实现的目标:每秒一次向EXCEL动态追加一行数据(在这个程序中我的数据是用固定的"test"字符串来代替,实际情况我会需要从文本框读取数据,所以这里只要实现每秒追加一行"test"就行了)
看了很多如何操作EXCEL的文章,东拼西凑总算调试通过,不过程序的实现是用 for(int k=1;k<=5000;k++) 和 _sleep(1000);这种很弱智的方法实现的,谁能帮我用类似 SetTimer(1,1000,NULL);周期性触发某事件的方法改写一下程序,晚辈在此不甚感激!
程序添加了EXCEL类(EXCEL2003):
选择Menu->View->ClassWizade,打开ClassWizade窗口,选择Add Class->From a type library,选择C:\Program Files\Microsoft Office\OFFICE11\EXCEL.EXE,选择_Application、Workbooks、_Workbook、Worksheets、_Worksheet、Range,加入新类,增加头文件#include "comdef.h" #include "Excel.h"
在BOOL CTEXTApp::InitInstance()中,dlg.DoModal();之前增加代码:
if (CoInitialize(NULL)!=0)
{
AfxMessageBox("初始化COM支持库失败!");
exit(1);
}
在return FALSE; 语句前,加入:
CoUninitialize();
然后新建一个按钮,加入下面的代码。
void CTEXTDlg::OnExceltest()
{
// TODO: Add your control notification handler code here
CString strPath = "D:\\test.xls";
COleVariant
covTrue((short)TRUE),
covFalse((short)FALSE),
covOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR);
_Application ExcelApp;
Workbooks wbsMyBooks;
_Workbook wbMyBook;
Worksheets wssMysheets;
_Worksheet wsMysheet;
Range rgMyRge;
//创建Excel 2000服务器(启动Excel)
if (!ExcelApp.CreateDispatch("Excel.Application",NULL))
{
AfxMessageBox("Create Excel service failure!");
return;
}
ExcelApp.SetVisible(false);
//利用模板文件建立新文档
wbsMyBooks.AttachDispatch(ExcelApp.GetWorkbooks(),true);
wbMyBook = wbsMyBooks.Add(covOptional);
for(int k=1;k<=5000;k++){
//得到Worksheets
wssMysheets.AttachDispatch(wbMyBook.GetWorksheets(),true);
//得到sheet1
wsMysheet.AttachDispatch(wssMysheets.GetItem(_variant_t("sheet1")),true);
//得到全部Cells,此时,rgMyRge是cells的集合
rgMyRge.AttachDispatch(wsMysheet.GetCells(),true);
//设置1行1列的单元的值
rgMyRge.SetItem(_variant_t((long)k),_variant_t((long)1),_variant_t("test"));
rgMyRge.SetItem(_variant_t((long)k),_variant_t((long)2),_variant_t("test"));
rgMyRge.SetItem(_variant_t((long)k),_variant_t((long)3),_variant_t("test"));
rgMyRge.SetItem(_variant_t((long)k),_variant_t((long)4),_variant_t("test"));
wbMyBook.SaveCopyAs(_variant_t(strPath));
ExcelApp.SetVisible(true);
_sleep(1000);
}
}