zoukankan      html  css  js  c++  java
  • Excel文件的读写实现

    要实现对Excel文件的读写,非常简单。按照如下步骤操作:
    1、将Excel9.h和Excel9.cpp两个文件放入到工程中。
    2、使用其中的对象就可以对其进行控制了,示例代码如下:
    //申明使用EXCEL的变量
    _Application ExcelApp;
    Workbooks wbsMyBooks;
    _Workbook wbMyBook;
    Worksheets wssMysheets;
    _Worksheet wsMysheet;
    Range rgMyRge;

    //创建Excel 2000服务器(启动Excel)
    if (!ExcelApp.CreateDispatch("Excel.Application",NULL))
    {
    AfxMessageBox("创建Excel服务失败!");
    return false;
    }

    CString csTemp;
    //然后打开模板文档,开始写入内容
    wbsMyBooks.AttachDispatch(ExcelApp.GetWorkbooks(), true);
    //取得当前执行文件所在目录
    char buf[100];
    GetCurrentDirectory(100, buf);
    csTemp.Format(buf);
    csTemp = csTemp + "\\Blank.xls"; //打开当前目录下的Blank.xls文件
    wbMyBook.AttachDispatch(wbsMyBooks.Add(_variant_t(csTemp)));
    //得到Worksheets
    wssMysheets.AttachDispatch(wbMyBook.GetWorksheets(), true);
    //得到sheet1
    wsMysheet.AttachDispatch(wssMysheets.GetItem(_variant_t("sheet1")), true);
    //得到全部Cells,此时,rgMyRge是cells的集合
    rgMyRge.AttachDispatch(wsMysheet.GetCells(), true);

    3、至此,已经获得了EXCEL中所有单元格的控制对象,然后就可以开始读写了。
    如果是写入,参考以下代码:
    rgMyRge.SetItem(_variant_t((long)nRowIndex), _variant_t((long)nColumnIndex), _variant_t("课题号"));
    如果是读取,参考以下代码:
    COleVariant vResult, vTemp;
    CString csTemp;
    vResult = rgMyRge.GetItem(_variant_t((long)(nRowIndex)),_variant_t((long)nColumnIndex));
    vTemp.ChangeType(VT_BSTR, vResult);
    csTemp = vTemp.bstrVal; //成功将单元格中内容读出并存入CString中

    4、关于保存
    如果是写一个EXCEL文件,就一定需要保存,目前还没有找到一个很好的办法来保存,现在使用的方法是保存整个WorkSpace,如下:
    //保存文件
    CString csSaveFile = "D:\\AAA.xls";
    wbMyBook.Save(); //先把workbook保存起来
    ExcelApp.SaveWorkspace(_variant_t(csSaveFile)); //最后保存整个工作区时给文件取名

    //2003-05-27添加
    以上的方法其实有一个非常非常大的BUG,实质上就是没有理解上述方法的含义。按照上述方法,首先保存workbook,其实是将workbook
    (如Blank.xls)保存到了“我的文档”目录下,然后再保存workspace生成excel文件,其实这样做之后生成了两个xls文件,一个就是
    Blank.xls(被保存到了“我的文档”目录下),还有一个就是取名的xls,保存在了指定路径下,但这个文件如果用写字板打开,会
    发现其实里面是一个链接,指向要打开“我的文档”目录下的那个xls文件,所以如果拷贝这个xls文件到其他机器上,由于缺少Blank.xls
    文件,所以会报告找不到需要打开的文件!!!
    所以其实一个excel文件就是一个workspace,这个workspace里可以包含多个workbook(其实就是打开的多个excel文档),然后每个
    workbook里面还可以包含多个worksheet!
    所以,最佳的保存方法应该如下:
    //保存文件
    CString csSaveFile = "D:\\AAA.xls";
    wbMyBook.SaveCopyAs(_variant_t(csSaveFile)); //先把workbook保存起来

    5、有关内存释放
    内存释放一直是个问题,现象就是程序运行以后,有一个名为EXCEL的进程一直留在进程列表中(随机发生)
    现在比较搓的做法是:将后台启动的EXCEL程序显示出来,让用户手动关闭,代码如下:
    //将窗口显示出来
    CWnd* pWnd = CWnd::FindWindow("XLMAIN", NULL);
    if (pWnd!=NULL)
    {
    pWnd->ShowWindow(SW_SHOWNORMAL);
    pWnd->UpdateWindow();
    pWnd->BringWindowToTop();
    }
    另外,要释放使用过的一些变量
    //释放对象
    rgMyRge.ReleaseDispatch();
    wsMysheet.ReleaseDispatch();
    wssMysheets.ReleaseDispatch();
    wbMyBook.ReleaseDispatch();
    wbsMyBooks.ReleaseDispatch();
    ExcelApp.ReleaseDispatch();


    回复:(Aiolian)Excel文件的读写实现

    在Excel文件读写操作完毕释放方面,上文写的并不正确

    正确的做法应参照MSDN中提供的文档和例子
     

  • 相关阅读:
    Redis源码分析(三十四)--- redis.h服务端的实现分析(1)
    Redis源码分析(三十四)--- redis.h服务端的实现分析(1)
    Redis源码分析(三十三)--- redis-cli.c客户端命令行接口的实现(2)
    C# 接口
    C#属性有什么作用
    字节跳动面试总结
    大厂Redis高并发场景设计,面试问的都在这!
    上班摸鱼 手敲求水仙花数的代码!
    有一群志同道合的程序员朋友是怎样的体验?
    SpringBoot四大核心之自动装配——源码解析
  • 原文地址:https://www.cnblogs.com/super119/p/2011333.html
Copyright © 2011-2022 走看看