zoukankan      html  css  js  c++  java
  • MFC -- Excel操作简介(基于VS2010)

     一、添加与 Excel 操作相关的头文件

      项目 -> 类向导,在右上方有一个下拉栏,选择其中的 类型库中的MFC类(T),即可看到下图所示界面,选择“文件”选项,然后在下方的位置选项中添加本地文件,本人电脑中的EXCEL是安装在 C 盘的,故文件目录为:C:Program FilesMicrosoft OfficeOffice14EXCEL.EXE。

      添加了 EXCEL.EXE 后,可以看到一系列接口,选择其中的: _Application、_Workbook、_Worksheet、Workbooks、Worksheets、Font、Range 并添加,然后在主程序中添加其头文件:

    #include "CApplication.h"
    #include "CWorkbook.h"
    #include "CWorkbooks.h"
    #include "CWorksheet.h"
    #include "CWorksheets.h"
    #include "CRange.h"
    #include "CFont0.h"

       逐次打开上述头文件,并将其中的 “ #import "C:\Program Files\Microsoft Office\Office14\EXCEL.EXE" no_namespace ” 这句话给屏蔽掉,不然会报错,无法编译成功。这样之后,编译还是不能通过,会出现以下报错:

      点击 warning 来到报错处,在 DialogBox() 前面加上下划线 "_",即 "_DialogBox()" 即可。

     

    二、创建并保存一个 Excel

      直接上代码先:

    void CExcel_ExampleDlg::SaveDataToExcel()
    {
        CString cellNum;
    
        CApplication m_ExcelApp;            // Excel 应用程序接口
        CWorkbook m_ExcelBook;             // 工作簿
        CWorkbooks m_ExcelBooks;           // 工作簿集合
        CWorksheet m_ExcelSheet;            // 工作表
        CWorksheets m_ExcelSheets;         // 工作表集合
        CRange m_ExcelRange;                // 用于对单元格进行操作
        CRange m_ExcelCols;
        CFont0 m_ExcelFont;                    // 用于字体操作
    
        // 获取系统时间并保存为 CString 类型
        CString timeStr;                       // 获取系统时间
        SYSTEMTIME sysTime;
        GetLocalTime(&sysTime);
    
        CString m_saveFilePath;                // 保存路径
        timeStr.Format(L"_%4d.%2d.%2d_%2d.%2d",sysTime.wYear , sysTime.wMonth , sysTime.wDay , sysTime.wHour , sysTime.wMinute);
        m_saveFilePath =  _T("E:\Workplace\ExcelExample") + timeStr + _T(".xlsx"); 
      
        CString str;
        for(int i = 0;i <20;i++)
        {
            str.Format(L"%d",i);
            ValueArray1.Add(str);
    
            str.Format(L"%d",2 * i);
            ValueArray2.Add(str);
    
            str.Format(L"%d",3 * i);
            SumArray.Add(str);
    
        }
    
        COleVariant covTrue((short)TRUE);
        COleVariant covFalse((short)FALSE);
        COleVariant covOptional((long)DISP_E_PARAMNOTFOUND,VT_ERROR);
    
        if(!m_ExcelApp.CreateDispatch(_T("Excel.Application")))
        {
            AfxMessageBox(_T("创建Excel失败"),MB_OK | MB_ICONWARNING);
            return;
        }
    
        m_ExcelBooks = m_ExcelApp.get_Workbooks();        // 获取一个工作簿集合
        m_ExcelBook = m_ExcelBooks.Add(covOptional);        // 添加一个工作簿
    
        m_ExcelSheets = m_ExcelBook.get_Sheets();            // 获取一个工作表集合
        m_ExcelSheet = m_ExcelSheets.get_Item(COleVariant((short)1));   // 获取一个工作表
    
        // 向 Excel 中添加数据
        // 选择工作表中 A1-A1 单元格区域
        m_ExcelRange = m_ExcelSheet.get_Range(COleVariant( _T("A1")), COleVariant(_T("A1")));        
        m_ExcelRange.put_Value2(COleVariant( _T("变量名1")));              // 设置 A1 内容
        m_ExcelCols = m_ExcelRange.get_EntireColumn();                    // 选择整列
        m_ExcelCols.put_HorizontalAlignment(COleVariant((long)-4108));    // 设置居中对齐
    
        // 选择工作表中 B1-B1 单元格区域
        m_ExcelRange = m_ExcelSheet.get_Range(COleVariant( _T("B1")), COleVariant(_T("B1")));            
        m_ExcelRange.put_Value2(COleVariant( _T("")));                  // 设置 B1 内容
        m_ExcelCols = m_ExcelRange.get_EntireColumn();                    // 选择整列
        m_ExcelCols.put_HorizontalAlignment(COleVariant((long)-4108));    // 设置居中对齐
    
        // 选择工作表中 C1-C1 单元格区域
        m_ExcelRange = m_ExcelSheet.get_Range(COleVariant( _T("C1")), COleVariant(_T("C1")));            
        m_ExcelRange.put_Value2(COleVariant( _T("变量名2")));              // 设置 C1 内容
        m_ExcelCols = m_ExcelRange.get_EntireColumn();                    // 选择整列
        m_ExcelCols.put_HorizontalAlignment(COleVariant((long)-4108));    // 设置居中对齐
         
        // 选择工作表中 D1-D1 单元格区域   
        m_ExcelRange = m_ExcelSheet.get_Range(COleVariant( _T("D1")), COleVariant(_T("D1")));        
        m_ExcelRange.put_Value2(COleVariant( _T("")));                  // 设置 D1 内容
        m_ExcelCols = m_ExcelRange.get_EntireColumn();                   // 选择整列
        m_ExcelCols.put_HorizontalAlignment(COleVariant((long)-4108));   // 设置居中对齐
    
        // 选择工作表中 E1-E1 单元格区域
        m_ExcelRange = m_ExcelSheet.get_Range(COleVariant( _T("E1")), COleVariant(_T("E1")));            
        m_ExcelRange.put_Value2(COleVariant( _T("")));                 // 设置 E1 内容
        m_ExcelCols = m_ExcelRange.get_EntireColumn();                   // 选择整列
        m_ExcelCols.put_HorizontalAlignment(COleVariant((long)-4108));   // 设置居中对齐
    
        for(int i = 0;i < 20;i++)
        {    
            cellNum.Format(L"%d",i+2);
            cellNum = _T("A") + cellNum;
            // 依次选择工作表中 A 列 的单元格
            m_ExcelRange = m_ExcelSheet.get_Range(COleVariant(cellNum), COleVariant(cellNum));        
            m_ExcelRange.put_Value2(COleVariant(_T("a")));          // 设置 A 列内容
    
            cellNum.Format(L"%d",i+2);
            cellNum = _T("B") + cellNum;
            // 依次选择工作表中 B 列 的单元格
            m_ExcelRange = m_ExcelSheet.get_Range(COleVariant(cellNum), COleVariant(cellNum));        
            m_ExcelRange.put_Value2(COleVariant(ValueArray1[i]));   // 设置 B 列内容
    
            cellNum.Format(L"%d",i+2);
            cellNum = _T("C") + cellNum;
            // 依次选择工作表中 C 列 的单元格
            m_ExcelRange = m_ExcelSheet.get_Range(COleVariant(cellNum), COleVariant(cellNum));        
            m_ExcelRange.put_Value2(COleVariant(_T("b")));          // 设置 C 列内容
    
            cellNum.Format(L"%d",i+2);
            cellNum = _T("D") + cellNum;
            // 依次选择工作表中 D 列 的单元格
            m_ExcelRange = m_ExcelSheet.get_Range(COleVariant(cellNum), COleVariant(cellNum));        
            m_ExcelRange.put_Value2(COleVariant(ValueArray2[i]));  // 设置 D 列内容
    
            cellNum.Format(L"%d",i+2);
            cellNum = _T("E") + cellNum;
            // 依次选择工作表中 E 列 的单元格
            m_ExcelRange = m_ExcelSheet.get_Range(COleVariant(cellNum), COleVariant(cellNum));        
            m_ExcelRange.put_Value2(COleVariant(SumArray[i]));    // 设置 E 列内容
    
        }
    
        m_ExcelApp.put_Visible(FALSE);                        // 不显示 Excel 表格
        m_ExcelApp.put_UserControl(FALSE);                    // 设置表格状态为用户不可控制
    
        m_ExcelBook.SaveCopyAs(COleVariant(m_saveFilePath));  // 保存Excel表格
        m_ExcelBook.put_Saved(TRUE);
    
        // 释放对象
        m_ExcelBooks.ReleaseDispatch();
        m_ExcelBook.ReleaseDispatch();
        m_ExcelSheets.ReleaseDispatch();
        m_ExcelSheet.ReleaseDispatch();
        m_ExcelRange.ReleaseDispatch();
    
        m_ExcelApp.Quit();          // 退出 Excel 程序,注意这里要先退出,后释放
        m_ExcelApp.ReleaseDispatch();
    
    }

      这段代码创建了一个 Excel ,然后向 Excel 中添加了 5 列 21 行的数据并保存到本地,最终所得到的 Excel 如下:

      整个代码不复杂,设置好一切后向 Excel 中添加数据即可,添加完数据后,记得保存表格,并释放相应的资源,否则程序结束后会有一个 Excel 进程驻留在内存中,这样重复运行程序时会出错。

  • 相关阅读:
    crawler碎碎念4 关于python requests、Beautiful Soup库、SQLlite的基本操作
    另类爬取表格数据
    如何选择kmeans中的k值——肘部法则–Elbow Method和轮廓系数–Silhouette Coefficient
    欧几里得距离
    数据导入+欧式距离计算+互信息计算
    轮廓系数
    肘部法则
    利用键值对进行排序的操作
    NMI计算
    彻底搞懂 C# 的 async/await
  • 原文地址:https://www.cnblogs.com/tongye/p/10212901.html
Copyright © 2011-2022 走看看