zoukankan      html  css  js  c++  java
  • MFC操作excel

    环境:VS2013+office2007

    头文件:

     1 #pragma once
     2 #ifndef __MYEXCEL_H_
     3 #define __MYEXCEL_H_
     4 #include "CApplication.h"
     5 #include "CFont0.h"
     6 #include "CRange.h"
     7 #include "CWorkbook.h"
     8 #include "CWorkbooks.h"
     9 #include "CWorksheet.h"
    10 #include "CWorksheets.h"
    11 
    12 class CMyExcel
    13 {
    14 public:
    15     CMyExcel();
    16     ~CMyExcel();
    17 
    18     CApplication app;
    19     CWorkbook book;
    20     CWorkbooks books;
    21     CWorksheet sheet;
    22     CWorksheets sheets;
    23     CRange range;
    24     CFont0 font;
    25     CRange cols;
    26     LPDISPATCH lpDisp;
    27 
    28     void test();
    29     void create_new_excel(CString filename);
    30     CString change_name_to_current_path(CString filename);
    31     void open_excel(CString filename);
    32     void close_excel();
    33     void save_excel();
    34     void set_value(char* pos, char* val);
    35     CString get_value(char* pos);
    36 };
    37 
    38 #endif

    源文件:

    #include "stdafx.h"
    #include "MyExcel.h"
    #include <shlwapi.h>
    #pragma comment(lib,"Shlwapi.lib") //如果没有这行,会出现link错误
    
    CMyExcel::CMyExcel()
    {
        
    }
    
    
    CMyExcel::~CMyExcel()
    {
        
    }
    
    void CMyExcel::test()
    {
    }
    
    //新建excel,通过save as
    void CMyExcel::create_new_excel(CString path)
    {
        //导出
        COleVariant covOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR);
        if (!app.CreateDispatch(_T("Excel.Application")))
        {
            AfxMessageBox(_T("无法创建Excel应用!"));
            return;
        }
        books = app.get_Workbooks();
        //打开Excel,其中pathname为Excel表的路径名  
    
        book = books.Add(covOptional);
        //CString path = change_name_to_path(filename);
        if (!PathFileExists(path))
        {
            book.SaveAs(COleVariant(path), covOptional,
                covOptional, covOptional,
                covOptional, covOptional, (long)0, covOptional, covOptional, covOptional,
                covOptional, covOptional);
        }
        
        //释放对象(相当重要!)   
        book.ReleaseDispatch();
        books.ReleaseDispatch();
        //退出程序   
        app.Quit();
        //m_ExlApp一定要释放,否则程序结束后还会有一个Excel进程驻留在内存中,而且程序重复运行的时候会出错   
        app.ReleaseDispatch();
    }
    
    //将文件名转化为当前目录下文件的绝对路径
    CString CMyExcel::change_name_to_current_path(CString filename)
    {
        CString theAppPath, theAppName;
        char Path[MAX_PATH];
    
        GetModuleFileName(NULL, Path, MAX_PATH);//得到应用程序的全路径
        theAppPath = (CString)Path;
    
        theAppName = AfxGetApp()->m_pszAppName;
        theAppName += ".exe";
    
        //把最后的文件名去掉
        int length1, length2;
    
        length1 = theAppPath.GetLength();
        length2 = theAppName.GetLength();
    
        theAppPath.Delete(length1 - length2, length2);
    
        CString TempPath = "";
    
        return(theAppPath + filename);//EXCEL模板的路径
    }
    
    //
    void CMyExcel::open_excel(CString path)
    {
        COleVariant covOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR);
        if (!app.CreateDispatch(_T("Excel.Application")))
        {
            AfxMessageBox("无法创建Excel应用!");
            return;
        }
        //CString path = change_name_to_path(filename);
        books = app.get_Workbooks();
        lpDisp = books.Open(path, covOptional, covOptional, covOptional, covOptional, covOptional, covOptional, covOptional, covOptional, covOptional, covOptional, covOptional, covOptional, covOptional, covOptional);
        book.AttachDispatch(lpDisp);
    }
    
    void CMyExcel::save_excel()
    {
        book.Save();
    }
    
    //设置值,pos:指定位置  val:指定值
    void CMyExcel::set_value(char* pos, char* val)
    {
        sheets = book.get_Worksheets();
        sheet = sheets.get_Item(COleVariant((short)1));
        //sheet.put_Name("test");
        range = sheet.get_Range(COleVariant(_T(pos)), COleVariant(_T(pos)));  //获得坐标为(A,1)单元格
        range.put_Value2(COleVariant(_T(val)));   //设置单元格类容为Hello Exce
        cols = range.get_EntireColumn();//选择整列,并设置宽度为自适应
        cols.AutoFit();
        //设置字体为粗体 
        font = range.get_Font();
        font.put_Bold(COleVariant((short)TRUE));
        //选择整列,并设置宽度为自适应  
        cols = range.get_EntireColumn();
        cols.AutoFit();
        //显示Excel表
        //app.put_Visible(TRUE);
        //app.put_UserControl(TRUE);
    }
    
    CString CMyExcel::get_value(char* pos)
    {
        range = sheet.get_Range(COleVariant(_T(pos)), COleVariant(_T(pos)));
        //获得单元格的内容 
        COleVariant rValue;
        rValue = COleVariant(range.get_Value2());
        //转换成宽字符  
        rValue.ChangeType(VT_BSTR);
        //转换格式,并输出 
        AfxMessageBox(CString(rValue.bstrVal));
        return CString(rValue.bstrVal);
    }
    
    void CMyExcel::close_excel()
    {
        //释放对象(相当重要!)   
        range.ReleaseDispatch();
        sheet.ReleaseDispatch();
        sheets.ReleaseDispatch();
        book.ReleaseDispatch();
        books.ReleaseDispatch();
        //退出程序   
        app.Quit();
        //m_ExlApp一定要释放,否则程序结束后还会有一个Excel进程驻留在内存中,而且程序重复运行的时候会出错   
        app.ReleaseDispatch();
    }

    使用:

    CMyExcel t;
        //t.test();
        CString path = t.change_name_to_current_path("3.xlsx");
        
        t.create_new_excel(path);
            
        t.open_excel(path);
        t.set_value("A3","hello hello");
        t.set_value("A8", "hello 123");
        t.get_value("A8");
        t.save_excel();
        t.close_excel();
  • 相关阅读:
    淘宝如何做智能化UI测试?
    摸爬滚打16年的软件测试经验,建议收藏!
    QA如何高效参与技术设计评审
    官宣!新冠疫苗全民免费接种,全部费用政府出!
    2021年第一次,送Python好书
    【Python】自动化抢购茅台,真香。
    3年以上测试工程师,你的出路在哪里?
    性能测试的目的与类型
    Burpsuite的简单应用-y-Proxy
    用Burpsuite破解网站密码
  • 原文地址:https://www.cnblogs.com/karappo/p/5994172.html
Copyright © 2011-2022 走看看