问题1:
如何读取和写入excel文件单元格中的时间数据,如 10:30:11,按照小时:分钟:秒的格式。问题2:
我用OLE方式将excel中的数据导入,但是发现关闭程序后会出现一个问题。Excel.exe为什么没有关闭?在任务管理器出现一大堆Excel.exe进程。
不知道是不是什么东西没有释放?
程序大致框架如下:
//初始化部分
if (::CoInitialize(NULL) == E_INVALIDARG) 
{
AfxMessageBox("Failed to initialize COM!");
return;
}
if (!app.CreateDispatch("Excel.Application"))
{
AfxMessageBox("Failed to create excel server!");
::CoUninitialize();
return;
}
app.SetVisible(FALSE); wbsBooks.AttachDispatch(app.GetWorkbooks());   //类WorkBooks 的Add方法实效
wbsBook.AttachDispatch(wbsBooks.Add(COleVariant(strPath)), TRUE);
wsSheets = wbsBook.GetWorksheets(); ……
…… //释放资源
wbsBooks.DetachDispatch();
wbsBook.DetachDispatch();
app.DetachDispatch();
app.Quit();
::CoUninitialize();这部分代码都在对话框的一个 按钮 关联函数内,是不是要把什么放在OnInitDialog()或者InitInstance()里面呢?

解决方案 »

  1.   

    ::CoUninitialize();要放在CWinApp::ExitInstance()里
      

  2.   

    第一个问题怎么解决呢?
    COleVariant里面好像没有关于时间的成员变量,我用GetValue()后,显示的是VT_R8类型(double).
    dblVal是0.……的一个值。不知道该怎么处理了?
    第二个问题:
    我打开文件使用CFileDialog来取得文件路径名(如c:\test.xls)(不知道这个是否有影响),然后用AttachDispatch()函数来关联。
    当我把我编写的程序关掉后,除了发现进程管理器里有excel.exe进程外,还发现了一个现象。
    就是我双击.xls类型文件时,会打开两个文件。两个文件之间的差别就是一个在另一个文件名后
    加了数字1。怎么打开两个excel文件?怎么回事?
    谁能解释一下?谢谢了。分不够再加。
    to goodboyws(深夜不眠者): 你说的还是不行,我把CoInitialize()放在InitInstance()里面,
    把::CoUninitialize();放在CWinApp::ExitInstance()里,发现进程管理器里还是有excel.exe
    进程。而且反复几次后,excel.exe进程越多。不知道是哪个地方没有释放掉?
      

  3.   

    释放资源处改成这样也不行: wsSheets.DetachDispatch();
    wsSheets.ReleaseDispatch(); wbsBook.DetachDispatch();
    wbsBook.ReleaseDispatch(); wbsBooks.DetachDispatch();
    wbsBooks.ReleaseDispatch();
    wbsBooks.Close(); app.DetachDispatch();
    app.ReleaseDispatch() ;
    app.Quit();
    delete app;该怎么办呢?
    谁能说一下啊,谢谢了
      

  4.   

    问题1
    不清楚怎么用,没试过类型转换成COleTime吗?
    把存储时间的单元格改成文本格式,然后处理字符串应该行。
    问题2
    先调用app.Quit();看看行不行。
      

  5.   

    app.Quit();
    app.DetachDispatch();
    app.ReleaseDispatch() ;delete app;,顺序
      

  6.   

    谢谢 casinosun(姑苏慕容)
    你说的是对的第一个问题怎么解决呢?
      

  7.   

    我以前也有过这样的问题。以下方法应该没问题
    _Application app;
    Workbooks books;
    _Workbook book;
    Worksheets sheets;
    _Worksheet sheet;
    Range range;
    //////////
    book.SetSaved(true);
    book.ReleaseDispatch(); 
    books.ReleaseDispatch(); 
    app.Quit();
    app.ReleaseDispatch();
      

  8.   

    LOOK下面是我以前发的帖子
    http://community.csdn.net/Expert/topic/3817/3817644.xml?temp=.8584864
      

  9.   

    我摸索出来的顺序,希望对大家有用: oFont = NULL;   //这几个NULL要加上,免得单步运行时产生AV警告信息
    range = NULL;   //虽然不加上,不单步运行没什么事,建议加上好,免得有隐含错误
    wsSheet = NULL;

    wsSheets.DetachDispatch();
    wsSheets.ReleaseDispatch();

    newBook.DetachDispatch();
    newBook.ReleaseDispatch();

    wbsBooks.Close();
    wbsBooks.DetachDispatch();
    wbsBooks.ReleaseDispatch();

    app.Quit();
    app.DetachDispatch();
    app.ReleaseDispatch();
    delete app;

    ::CoUninitialize();