MFC往Excel插入表单

void CTestExcelDlg::OnButton2() 
{
    // TODO: Add your control notification handler code here
    _Application ExcelApp;
    Workbooks books;
    _Workbook book;
    Worksheets sheets;
    _Worksheet sheet;
    Range range;
    LPDISPATCH lpDisp = NULL;

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

    ExcelApp.SetVisible(false);
    ExcelApp.SetUserControl(FALSE);

    /*得到工作簿容器*/
    books.AttachDispatch(ExcelApp.GetWorkbooks());

    /*打开一个工作簿,如不存在,则新增一个工作簿*/
    CString strBookPath =_T("f:\\tmpl.xls");
    try
    {
        /*打开一个工作簿*/
        lpDisp = books.Open(strBookPath, 
            vtMissing, vtMissing,vtMissing, vtMissing, vtMissing,
            vtMissing, vtMissing,vtMissing, vtMissing, vtMissing, 
            vtMissing, vtMissing,vtMissing, vtMissing);
        book.AttachDispatch(lpDisp);
    }
    catch(...)
    {
        /*增加一个新的工作簿*/
        lpDisp = books.Add(vtMissing);
        book.AttachDispatch(lpDisp);
    }

/*得到工作簿中的Sheet的容器*/
    sheets.AttachDispatch(book.GetSheets());

    /*打开一个Sheet,如不存在,就新增一个Sheet*/
    CString strSheetName =_T("Sheet1");
    try
    {
        /*打开一个已有的Sheet*/
        lpDisp =sheets.GetItem(_variant_t(strSheetName));
        sheet.AttachDispatch(lpDisp);
    }
    catch(...)
    {
        /*创建一个新的Sheet*/
        lpDisp = sheets.Add(vtMissing, vtMissing, _variant_t((long)1), vtMissing);
        sheet.AttachDispatch(lpDisp);
        sheet.SetName(strSheetName);
    }

    /*向Sheet中写入多个单元格,规模为4*30 */
    lpDisp = sheet.GetRange(_variant_t("C6"),_variant_t("F35"));
    range.AttachDispatch(lpDisp);

    VARTYPE vt = VT_R4; /*数组元素的类型,float*/
    SAFEARRAYBOUND sabWrite[2]; /*用于定义数组的维数和下标的起始值*/
    sabWrite[0].cElements = 30;
    sabWrite[0].lLbound = 0;
    sabWrite[1].cElements = 4;
    sabWrite[1].lLbound = 0;

    COleSafeArray olesaWrite;
    olesaWrite.Create(vt, sizeof(sabWrite)/sizeof(SAFEARRAYBOUND), sabWrite);

    /*通过指向数组的指针来对二维数组的元素进行间接赋值*/
    float (*pArray)[2]= NULL;
    olesaWrite.AccessData((void **)&pArray);
    memset(pArray, 0, sabWrite[0].cElements * sabWrite[1].cElements* sizeof(float));

    /*释放指向数组的指针*/
    olesaWrite.UnaccessData();
    pArray = NULL;

    /*对二维数组的元素进行逐个赋值*/
    long index[2]= {0, 0};
    long lFirstLBound = 0;
    long lFirstUBound = 0;
    long lSecondLBound = 0;
    long lSecondUBound = 0;
    olesaWrite.GetLBound(1, &lFirstLBound);
    olesaWrite.GetUBound(1, &lFirstUBound);
    olesaWrite.GetLBound(2, &lSecondLBound);
    olesaWrite.GetUBound(2, &lSecondUBound);
    long i = 0;
    for (i = lFirstLBound;i <= lFirstUBound; i++)
    {
        index[0] = i;
        for (long j =lSecondLBound; j <= lSecondUBound; j++)
        {
            index[1] = j;
            float lElement = (float)(i * sabWrite[1].cElements + j); 
            olesaWrite.PutElement(index, &lElement);
        }
    }

    /*把ColesaWritefeArray变量转换为VARIANT,并写入到Excel表格中*/
    VARIANT varWrite = (VARIANT)olesaWrite;
    range.SetValue2(varWrite);
    range.SetNumberFormatLocal(COleVariant("0.00"));

    /*根据文件的后缀名选择保存文件的格式*/
    //CString strSaveAsName = _T("C:\\ew.xls");
    //CString strSuffix = strSaveAsName.Mid(strSaveAsName.ReverseFind(_T('.')));
    //XlFileFormat NewFileFormat = xlOpenXMLWorkbook;
    Excel::XlFileFormat NewFileFormat = xlWorkbookNormal;
    //if (0 ==strSuffix.CompareNoCase(_T(".xls")))
    //{
    //    NewFileFormat= xlExcel8;
    //}
    //book.SaveAs(_variant_t(strSaveAsName), _variant_t((long)NewFileFormat),vtMissing, vtMissing, vtMissing, 
    //    vtMissing, 0, vtMissing, vtMissing, vtMissing,
    //    vtMissing, vtMissing);
    book.Save();

    /*释放资源*/
    sheet.ReleaseDispatch();
    sheets.ReleaseDispatch();
    book.ReleaseDispatch();
    books.ReleaseDispatch();
    ExcelApp.Quit();
    ExcelApp.ReleaseDispatch();
}
本文转自:http://zhidao.baidu.com/link?url=mRaQ_oKVmnAYej1CdNVGZwtkbSz01lgZ5ZMC8HGu40Pgsj7qeE4OJ428-qz_WEKabrdXt8lRxAtHyHHg9KB6p_
上述中,函数方法有修改,参考如下:
/***********************************
        /*打开一个Sheet,如不存在,就新增一个Sheet*/
        CString strSheetName =_T("1号工步文件");
        try
        {
            /*打开一个已有的Sheet*/
            lpDisp =sheets.get_Item(_variant_t(strSheetName));
            sheet.AttachDispatch(lpDisp);
        }
        catch(...)
        {
            /*创建一个新的Sheet*/
            lpDisp = sheets.Add(vtMissing, vtMissing, _variant_t((long)1), vtMissing);
            sheet.AttachDispatch(lpDisp);
            sheet.put_Name(strSheetName);
        }
     sheet=sheets.get_Item(COleVariant((short)1));//取一张表
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值