MFC对导出Excel的详细讲解

MFC读写Excel详细步骤

说明 : 代码编译可能会编译不通过,主要是看注释说明.

准备工作:
打开开发环境VC或VS新建一个基于对话框的简单工程; 通过类向导添加类-->类型库中的MFC类

打开创建类对话框

       选择文件,位置编辑框填入Excel.exe的详细目录,可以通过浏览选择,在接口下方选择_Application(应用),_Workbook(视窗)Workbooks(整个视窗),Worksheets(单个表单),Worksheets(整个表单),Range(元素集合)六个基本的接口并生成类。选择接口后单击向右的单箭头即可,双箭头是生成所有接口的类;

       生成类之后将添加的几个类的头文件中的#import "E:\\Microsoft Office\\Office14\\EXCEL.EXE" no_namespace 注释掉,加上#include<afxdisp.h>。然后编译,出现下面这俩个错误;点击DialodBoxA找到错误位置将DialodBox改为_DialodBox;再编译,没有错误;warning C4003: “DialogBoxA”宏的实参不足 error C2059: 语法错误:“,” 在要操作Excel类的CPP文件中包含头文件:

准备工作完成。

向Excel写数据:

CFileDialogdlg(FALSE, ".xlsx",NULL,
            OFN_FILEMUSTEXIST|OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,
            "Microsoft ExcelFiles(*.xls)|*.xls|Microsoft Excel Files(*.xlsx)(推荐)|*.xlsx|All Files (*.*)|*.*||");
    Files(*.xls)|*.xls|Microsoft Excel Files(*.xlsx)(推荐)|*.xlsx|All Files (*.*)|*.*||");
    dlg.m_ofn.lpstrTitle =	" 保存到 Excel" ;
    if(dlg.DoModal() ==	IDOK)
    {
    // 获取路径
    CString strFileName=dlg.GetPathName(); CWorkbooks	books;
    CWorkbook book; 
    CApplication app; 
    CWorksheets	sheets;
    CWorksheet sheet;
    CRange range;
    CMyFont	font;
    CRange cols;
    COleVariant covOptional(( long ) DISP_E_PARAMNOTFO,UVNTD_ERROR); 
    if(!app.CreateDispatch("Excel.Application"))
    {
        this -> MessageBox("无法创建 Excel 应用!"); 
        return;
    }
    books=app.get_Workbooks();
    book=books.Add(covOptional); 
    sheets=book.get_Worksheets(); 
    sheet=sheets.get_Item(COleVariant((short)1));
    //获得(A,1)(B,1) 两个单元格
    range=sheet.get_Range(COleVariant("A1"),COleVariant("B6"));
    //设置公式“=RAND()*100000”
    range.put_Formula(COleVariant("=RAND()*1000"));
    //选择整列,并设置宽度为自适应
    cols = range.get_EntireColumn(); 
    cols.AutoFit();
    //设置字体为粗体
    font = range.get_Font();
    font.put_Bold(COleVariant((short)TRUE));
    //设置数字格式为货币型
    //range.put_NumberFormat(COleVariant("$0.00"));
    CString	Range327[]={"C1","C2","C3","C4","C5","C6"};
    CString fileinfo[]={"齿形","齿向","齿距","左齿面","右齿面","径跳"}; 
    for(int	i=0;i<6;i++)
    {
        range = sheet.get_Range(COleVariant(Range327[i]),COleVariant(Range327[i]));
        range.put_Value2(COleVariant (fileinfo[i]));
    }
    /*
    //获得坐标为(C,2)单元格   
    //显示Excel 表
    range = sheet.get_Range(COleVariant("C1"), COleVariant("F10"));
    //设置单元格内容位 Hello Excel
    range.put_Value2(COleVariant("哈尔滨精达测量仪器有限公司"));
    */
    //选择整列,并设置宽度为自适应
    cols = range.get_EntireColumn(); 
    cols.AutoFit();

     //显示列表控件
 
    //app.put_Visible(TRUE);
    //允许其他用户控制 Excel ,否则 Excel 、将一闪而过
    //app.put_UserControl(TRUE);
 
    book.SaveCopyAs( COleVariant (strFileName)); 
    book.put_Saved( true );

    range.ReleaseDispatch(); 
    font.ReleaseDispatch(); 
    cols.ReleaseDispatch(); 
    sheet.ReleaseDispatch(); 
    sheets.ReleaseDispatch(); 
    book.ReleaseDispatch(); 
    books.ReleaseDispatch();
    //以下关闭应用的两条代码结合使用且顺序不能反,否则无法关闭进程
    app.Quit(); 
    app.ReleaseDispatch();
    }

    读取Excel中的数据:
    UpdateData(TRUE); 
    str327=""; 
    UpdateData(FALSE); 
    CApplication app; 
    CWorkbooks books; 
    CWorkbook book; 
    CWorksheets sheets; 
    CWorksheet sheet; 
    CRange range; 
    CRange oCurCell;
    CString	strFileName1;
    CFileDialog	dlg(TRUE,".xlsx",NULL,
                    OFN_FILEMUSTEXIS| OT FN_HIDEREADON| OLYFN_OVERWRITEPRO, 
                    M"MPiTcrosoft ExcelFiles(*.xls)|*.xls|Microsoft Excel Files(*.xlsx)|*.xlsx|All Files(*.*)|*.*||");
    dlg.m_ofn.lpstrTitle ="打开Excel文件";
    int nRetVal = dlg.DoModal(); 
    if(nRetVal == IDOK)
    {
        if(!app.CreateDispatch(_T("Excel.Application"),NULL))
        {
            ::MessageBox(NULL,_T("创建Excel 服务失败"),_T("错误提示"),MB_OK|MB_ICONERROR); 
            return;
            //exit(1);
        }
        // 设置为显示
        app.put_Visible(FALSE); 
        books.AttachDispatch(app.get_Workbooks(),TRUE); 
        LPDISPATClHpDisp = NULL;
        COleVariant covTrue((short)TRUE);
        COleVariant covFalse((short)FALSE);
        COleVariant covOptional((long)DISP_E_PARAMNOTFO,UNVDT_ERROR);

        //打开文件
        CString strFilePath=dlg.GetPathName(); 
        strFileName1=strFilePath;
        //研发人员名单  2016.xls";
        lpDisp = books.Open( strFilePath,
        _variant_t	(vtMissing),
        _variant_t	(vtMissing),
        _variant_t	(vtMissing),
 
        _variant_t	(vtMissing),
        _variant_t	(vtMissing),
        _variant_t	(vtMissing),
        _variant_t	(vtMissing),
        _variant_t	(vtMissing),
        _variant_t	(vtMissing),
        _variant_t	(vtMissing),
        _variant_t	(vtMissing),
        _variant_t	(vtMissing),
        _variant_t	(vtMissing),
        _variant_t	(vtMissing) );

        //获得活动的WorkBook(工作簿) 
        book.AttachDispatch(lpDisp,	TRUE);
        //获得活动的WorkSheet(工作表) 
        sheet.AttachDispatch(book.get_ActiveSheet(),TRUE);
        //获得使用的区域 Range(区域) 
        range.AttachDispatch(sheet.get_UsedRange(),TRUE);

        //获得使用的行数
        long lgUsedRowNum = 0; 
        range.AttachDispatch(range.get_Rows(),TRUE); 
        lgUsedRowNum = range.get_Count();
        //获得使用的列数
        long lgUsedColumnNum = 0; 
        range.AttachDispatch(range.get_Columns(),TRUE); 
        lgUsedColumnNum = range.get_Count();
        //读取Sheet的名称
        CString strSheetName = sheet.get_Name();

        //得到全部Cells ,此时,CurrRange 是cells	的集合
        range.AttachDispatch(sheet.get_Cells(),	TRUE);
        //遍历整个Excel 表格
        CStringArray* arrayStr;
        arrayStr =newCStringArray [lgUsedRowNum]; 
        for (int i = 0; i <lgUsedRowNum; )	// 遍历行
        {
            for(int	j = 1; j <= lgUsedColumnNum; )	// 遍历列
            {
                    oCurCell.AttachDispatch(range.get_Item(COleVariant((long)(i+ 1)),COleVariant((long)j)).pdispVal,TRUE);
                    VARIANTvarItemName = oCurCell.get_Text();
                    CString strItemName;
                    strItemName = varItemName.bstrVal;
                    //AfxMessageBox(strItemName );
                    //判断是否是合并的单元格
                    VARIANTvarMerge = oCurCell.get_MergeCells(); CString
                    PosInfo1[]={"A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T"};
                    CString PosInfo2[]={"1","2","3","4","5","6","7","8","9","10","11","12","13","14","15","16","17","18","19","20"};
                    if(varMerge.boolVal == -1 )
                    {
                        AfxMessageBox( PosInfo1[j-1]+PosInfo2[i]+"是合并的单元格!");
                    }
                    //else if ( varMerge.boolVal == 0 )
                    //{
                    //AfxMessageBox( _T( "	不是合并的单元格 !" ) );
                    //}
         } i++;
}
 
        arrayStr[i].Add( strItemName ); 
        j++;

        if(lgUsedColumnNum*lgUsedRowNum>=300)
        {
            MessageBox( " 文件过大,存储空间不足,无法读取!	" ); goto LLL;
        }

        CString strTempValue[20][20];
        for(int	i = 0; i <lgUsedColumnNum; i++)	// 遍历列
        {
            for(int	j = 0; j <lgUsedRowNum; j++)// 遍历行
            {
                  strTempValue[i][j]=arrayStr[j].GetAt(i);
            }
        }
        //释放二维数组
        delete [] arrayStr;

        //这里设置了字符串类型,应该还能设置其它类型参数,比如说整型。解开上面代码中的注释,
        可以尝试下其它功能。参考资源	[1]
        // 释放资源
        //	book.SaveCopyAs(COleVariant(strFilePath));
        //	book.put_Saved(true); 
        book.ReleaseDispatch();
        books.ReleaseDispatch(); 
        app.Quit(); 
        app.ReleaseDispatch();
        long size327=lgUsedColumnNum*lgUsedRowNum;
        datafloat=atof(strTempValue[0][0]); UpdateData( TRUE);
        for (int i = 0; i <lgUsedColumnNum; i++)// 遍历列
        {
            if(i!=0)
            {
                str327=str327+"\r\n";
            }
            for	( int	j = 0; j <lgUsedRowNum; j++)
            {
                if	(!strTempValue[i][j].IsEmpty())
                {
                    str327=str327+	"\r\n"	+strTempValue[i][j];
                }
            }
        }
            m_ddd=datafloat; 
            UpdateData(FALSE);
        }
        //book.SaveCopyAs(COleVariant(strFileName1));
        //book.put_Saved(true);
        // 不显示任何警告对话框
        // 在保存文件代码之前加上下面两句语句
        app.put_AlertBeforeOverwriting(	false );
        app.put_DisplayAlerts(false );
        // 将对应 Excel 进程关闭
        range.ReleaseDispatch(); 
        oCurCell.ReleaseDispatch(); 
        sheet.ReleaseDispatch(); 
        sheets.ReleaseDispatch(); 
        book.ReleaseDispatch();
        books.ReleaseDispatch();
        // 以下关闭应用的两条代码结合使用且顺序不能反,否则无法关闭进程
        app.Quit();
        app.ReleaseDispatch();
        }
    }
}

转载自 : 百度文库

下面也有相应的详细文章:

第一篇 : https://www.cnblogs.com/tianya2543/p/4165997.html

第二篇 : https://blog.csdn.net/qivan/article/details/7599924

猜你喜欢

转载自blog.csdn.net/Superman___007/article/details/84838486