• 在MFC中对Excel的一些操作


    首先要在程序中加载CExcel.h和CExcel.cpp文件,这里面包装了很多函数和对Excel文件的操作,下面所有程序中的m_excel都是类CExcel的对象,如:

    private:

    _Application pApp;
    Workbooks pBooks ;
    _Workbook pBook ;
    Worksheets pSheets ;
    _Worksheet pSheet;
    Range pRange;
    Interior pInterior;
    FontPtr pFont;

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////

    首先在BOOL CVCExcelApp::InitInstance()之中,int nResponse = dlg.DoModal()语句之后加入如下代码:

    if(CoInitialize(NULL)==0)//初始化COM库 

        AfxMessageBox("初始化COM失败!"); 
        exit(1); 
    }
    然后在return FALSE;语句之前加入:
    ::CoUninitialize();//释放COM库

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////

    使用Excel模板来新建一个excel文件,并保存在指定的地址上

    UpdateData();//外部有对话框,此时可以将对话框中数据拷贝给与对话框绑定的变量
    CString modPath = _T("C:\Users\军\Desktop\excel.xls");//模板所在的地址
    CString strName = m_fileName + _T(".xlsx");//新建的Excel文件的文件名
    CString pathName = m_saveAddr + strName;//新建的Excel文件的保存地址
    //启动Excel服务
    CoInitialize(NULL);
    if (!m_execl.pApp.CreateDispatch(_T("Excel.Application"), NULL))
    {
    AfxMessageBox(_T("创建Excel服务失败!"));
    return;
    }
    m_execl.pApp.put_Visible(FALSE);//设置Excel文件不打开
    m_execl.pBooks.AttachDispatch(m_execl.pApp.get_Workbooks(), TRUE);
    m_execl.pBook.AttachDispatch(m_execl.pBooks.Add((_variant_t)modPath), TRUE);
    //加载模板Excel文件
    m_execl.pSheets.AttachDispatch(m_execl.pBook.get_Worksheets(), true);//加载sheet页面
    m_execl.pSheet.AttachDispatch(m_execl.pSheets.get_Item(_variant_t("Sheet1")), true);

    //将新建的Excel文件保存到指定的地址中,此时保存在pathName地址中
    m_execl.pSheet.SaveAs(pathName, vtMissing, vtMissing, vtMissing, vtMissing,
    vtMissing, vtMissing, vtMissing, vtMissing, vtMissing);

    //释放Excel实例
    //释放对象
    m_execl.pRange.ReleaseDispatch();
    m_execl.pSheet.ReleaseDispatch();
    m_execl.pSheets.ReleaseDispatch();
    m_execl.pBook.ReleaseDispatch();
    m_execl.pBooks.ReleaseDispatch();
    //退出程序
    m_execl.pApp.Quit();
    //pApp一定要释放,否侧程序结束后还会有一个Excel进程驻留在内存中,而且程序重复运行的时候回出错
    m_execl.pApp.ReleaseDispatch();

    注:本程序里面的Excel文件后缀名为.xlsx,这个要依据情况定,有时可能是.xls

    /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

    下面介绍怎么向指定路径下的Excel文件中写入数据

    CoInitialize(NULL);
    if (!m_execl.pApp.CreateDispatch(_T("Excel.Application")))
    {
    MessageBox(_T("创建Excell服务失败!"));
    exit(1);
    }
    m_execl.pApp.put_Visible(FALSE);
    m_execl.pBooks.AttachDispatch(m_execl.pApp.get_Workbooks(), true);
    //打开要写数据的Excel文件,其中excelPath为该Excel文件的保存路径
    m_execl.pBook.AttachDispatch(m_execl.pBooks.Open(excelPath, vtMissing, vtMissing,vtMissing,
    vtMissing, vtMissing, vtMissing, vtMissing, vtMissing, vtMissing, vtMissing,
    vtMissing, vtMissing, vtMissing,vtMissing));
    m_execl.pSheets.AttachDispatch(m_execl.pBook.get_Worksheets(), true);
    m_execl.pSheet.AttachDispatch(m_execl.pSheets.get_Item(_variant_t("sheet1")), true);
    m_execl.pRange.AttachDispatch(m_execl.pSheet.get_Cells(), true);

    //获得Excel文件中已经使用了的行数和列数

    //得到该Excel文档中已经使用了的列数
    m_execl.pRange = m_execl.pSheet.get_UsedRange();
    m_execl.pRange = m_execl.pRange.get_Columns();
    long icul = m_execl.pRange.get_Count();

    //得到Excel文档中已经使用了的行数
    m_execl.pRange = m_execl.pSheet.get_UsedRange();
    m_execl.pRange = m_execl.pRange.get_Rows();
    long iRow = m_execl.pRange.get_Count();

    long iRows = iRow + 1;//这里当我们要写数据时,都是从已经使用了的下一行开始写数据,所以要将已经使用的行数+1来得到下一行

    for (int c = 1; c <= icul; )//这里我是使用了CExcel类中自带的写数据的函数
    {

    m_execl.PutValue(c, iRows, strNum);//c表示要写数据的列,iRow表示要写数据的行,strNum表示写入的字符串,这里是CString型

    c++

    }

    /////////////////////////下面是较一般的写数据的方便

     m_pRang.SetItem(_variant_t((long)1),_variant_t((long)1),_variant_t("数学系研究生课程统计")); //往第一行第一列的单元格中写数据

     m_pRang.SetItem(_variant_t((long)2),_variant_t((long)1),_variant_t("课程名")); //往第二行第一列的单元格中写数据
    //数据写完后就是设置格式

    //加载已经使用的单元格
    m_execl.pRange.AttachDispatch(m_execl.pSheet.get_UsedRange());

    //水平对齐:默认=1,居中=-4108,左=-4131,右=-4152 
    //垂直对齐:默认=2,居中=-4108,左=-4160,右=-4107 

    m_execl.pRange.put_HorizontalAlignment(_variant_t((long)-4108));
    m_execl.pRange.put_VerticalAlignment(_variant_t((long)-4108));

    //写完数据后注意一定要释放对象,关闭应用
    m_execl.pRange.ReleaseDispatch();
    m_execl.pSheet.ReleaseDispatch();
    m_execl.pSheets.ReleaseDispatch();
    m_execl.pBook.ReleaseDispatch();
    m_execl.pBooks.ReleaseDispatch();
    //退出程序
    m_execl.pApp.Quit();
    m_execl.pApp.ReleaseDispatch();
  • 相关阅读:
    由基于qml,c++的串口调试工具浅谈qml与c++混合编程
    qt5_qml_Opengl_shader 第一弹----------------------openglunderqml的简化及介绍
    Delphi 的接口机制——接口操作的编译器实现过程(2)
    Delphi 的接口机制——接口操作的编译器实现过程(1)
    ddd
    [leetcode]Gray Code
    synapse socket总结一:服务器模型
    CentOS 6.5(64bit)安装GCC4.8.2+Qt5.2.1(替换GCC的链接库)
    Qt打开外部程序和文件夹需要注意的细节(Qt调用VC写的动态库,VC需要用C的方式输出函数,否则MinGW32编译过程会报错)
    Qt+SQLite数据加密的一种思路(内存数据库)
  • 原文地址:https://www.cnblogs.com/pengjun-shanghai/p/4835910.html
Copyright © 2020-2023  润新知