在网上查阅了很多VC++6.0对EXECL文件的读写资料,都有一些问题,不能完全满足我的要求。经过几个小时的整理和调试,已完成对EXECL文件的读写,现将我的经验分享给大家,希望对这方面需求的人有所帮助。
一、运行环境
操作系统:WINDOWS XP SP3
编辑器:VC++6.0
OFFICES:MS OFFICES 2003
二、得到EXECL 2003的函数库
打开一个工程,对话框的、文档-视图的都行,我是打开的已有文档-视图工程(图1)。
图1
在图2 所示的“查看—新建工程”向导下,打开MFC 类向导对话框(图3)。
图2
图3
在图3中点击“ADD Class”,下的“”,选择EXECL 2003的执行文件(图4)。
在下面弹出的窗口(图5)中选择所有的类(当然也可以只选择需要的几个类,为了以后方便使用,建议选择所有的类),得到2个文件:execl.h和execl.cpp。从execl中导入的类已自
动加入到工程中(图6)
                                                               
图5
图6
在你需要读写execl数据(*.XLS)的*.CPP的相关*.件中加入execl.h,就可以使用execl中的函数了(图7)。
图7
三、实现的源代码及说明
LRESULT CMapgistwoView::ReadDataFramFile(WPARAM wParam, LPARAM lParam)//从文件读数
{
    //if(m_DataFileName.CompareNoCase(m_ReadDataFromFile.m_FileName)!=0){
        delete []data;//存放数据的变量
        //m_DataFileName=m_ReadDataFromFile.m_FileName;
    //}
    //else{
        //MessageBox("请选择一个不同的文件!");
        //return 0;
    //}
    _Application app; //定义读写XLS文件的execl变量
    Workbooks books;
    _Workbook book;
    Worksheets sheets;
    _Worksheet sheet;
    Range range;
    COleVariant VOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR);
    //------------------
    //CompareNoCase为不区分大小写比较,而Compare为区分大小写比较
    //如果两个对象完全一致则返回0,如果小于lpsz,则返回-1,否则返回1.
   
    m_DataFileName=m_ReadDataFromFile.m_FileName;//从对话框中得到选择的文件名,存入视窗类的变量中
    //创建Excel 2000服务器(启动Excel)
    if (!app.CreateDispatch("Excel.Application",NULL))
    {
            AfxMessageBox("创建Excel服务失败!");
            return FALSE;
    }
    app.SetVisible(FALSE); // TRUE使Excel可见  FALSE--不可见 
    app.SetUserControl(TRUE); // 允许其他用户控制Excel       
    books.AttachDispatch(app.GetWorkbooks(),true);
    /*
    //新建一个XLS文件
    book = books.Add(COleVariant(""));    // 得到Workbook  book1.xls
    sheets = book.GetWorksheets();    // 得到Worksheets
    sheet = sheets.GetItem(COleVariant((short)1)); // 得到Worksheet
        //-------------------SetCellValue--------------
    range=sheet.GetRange(COleVariant(IndexToString(5,1)),COleVariant(IndexToString(8,2)));
    range.SetValue2(COleVariant("OK"));//设定范围内的值
      app.SetAlertBeforeOverwriting(FALSE);  //取消提示是否覆盖的对话框
    app.SetDisplayAlerts(FALSE);//取消提示是否保存的对话框
    book.SaveAs(COleVariant("D:\\3.xls"),VOptional,VOptional,
                                VOptional,VOptional,VOptional,0,
                                VOptional,VOptional,VOptional,VOptional,VOptional);
      */
//上面未用的代码在这没用使用,所以就屏蔽了,但在调试的时候顺利通过。
    //打开一个已存在的XLS文件
    app.SetVisible(FALSE); // TRUE使Excel可见  FALSE--不可见 
    app.SetUserControl(TRUE); // 允许其他用户控制Excel       
    book.AttachDispatch(books.Open(m_DataFileName,VOptional, VOptional, VOptional, VOptional,  VOptional,
    VOptional, VOptional, VOptional,  VOptional, VOptional, VOptional, VOptional,  VOptional, VOptional
));
    sheets.AttachDispatch(book.GetWorksheets(),true); //得到Worksheets
       
    //怎样获取所有表单的名称,如下:
    long lCount = sheets.GetCount();
    CString strSheetName;
    for(long n=1; n<=lCount; n++)
    {
            sheet.AttachDispatch(sheets.GetItem(COleVariant((long)n)));
            //strSheetName = (sheet.GetName());//得到了,类推可得到所有的
            //MessageBox(strSheetName);
            break;
    }
    //---------------得到行数和列数----------------
    range.AttachDispatch(sheet.GetUsedRange());   
    range.AttachDispatch(range.GetRows()); 
    ROWS=range.GetCount();//已经使用的行数
    range.AttachDispatch(range.GetColumns());
    COLS=range.GetCount();//已经使用的列数
    //------------------------
    //分配数据空间
    m_ReadDataFromFile.m_ColsName.ResetContent();//重置保存XLS标题行数据的LISTBOX的数据。
    data=new CString[COLS*ROWS];
    //MessageBox("OK");
    int n0,i,j;
    if(m_ReadDataFromFile.m_ChechBTH){//有标题行
        n0=1;
        for(i=0;i<COLS;i++){
            range = sheet.GetRange(COleVariant(IndexToString(1,i+1)),COleVariant(IndexToString(1,i+1)));
            strSheetName.Format(_T("%d."),i+1);
            strSheetName+=range.GetText().bstrVal;
            m_ReadDataFromFile.m_ColsName.InsertString(i, strSheetName);
        }
    }else{ //无标题行
        n0=0;
        for(i=0;i<COLS;i++){
            //range = sheet.GetRange(COleVariant(IndexToString(1,i+1)),COleVariant(IndexToString(1,i+1)));
            strSheetName.Format(_T("%d.%c"),i+1,'A'+i);
            m_ReadDataFromFile.m_ColsName.InsertString(i, strSheetName);
        }
    }
    if( COLS > 26 )
    {
        m_ReadDataFromFile.m_Cols.Format(_T("%d(%c%c)"),COLS,'A' + (COLS-1)/26-1,'A' + (COLS-1)%26);
    }
    else
    {
        m_ReadDataFromFile.m_Cols.Format(_T("%d(%c)"),COLS, 'A' + (COLS-1)%26);
    }
    //-------------------GetCellValue--------------
    StartProgress();
    SetSubProgressName("正在读取数据,请等待.......");
    SetRange(0,ROWS);rows函数的使用方法及实例
    for(i=n0;i<ROWS;i++){
        SetPos(i);
        for(j=0;j<COLS;j++){
            range = sheet.GetRange(COleVariant(IndexToString(i+1,j+1)),COleVariant(IndexToString(i+1,j+1)));

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。