MFC之CListCtrl导出excel

转自:http://blog.csdn.net/qivan/article/details/7599924

 

代码编译会出现错误,修改:双击提示,在DialogBox()前加下划线,就可以了

CListCtrl控件导出excel大概步骤如下:

 

1.首先打开vs2010,建一个项目(ExportExcel),建立完后点击右键,添加--类--MFC--TypeLib中的MFC类,到该页面点添加如下:

2.点添加完后,注意下,找到相关头文件,注释红色那行

//#import "D:\\Program Files\\Microsoft Office\\OFFICE11\\EXCEL.EXE" no_namespace
// CWorkbook 包装类

class CWorkbook : public COleDispatchDriver
{
public:
 CWorkbook(){} // 调用 COleDispatchDriver 默认构造函数
 CWorkbook(LPDISPATCH pDispatch) : COleDispatchDriver(pDispatch) {}
 CWorkbook(const CWorkbook& dispatchSrc) : COleDispatchDriver(dispatchSrc) {}

 

3.注释完后,把上面添加的类的头文件加到你要实现导出excel功能的类中,如下:

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

4.实现主要代码如下:

[cpp] view plain copy print ?
  1. static void   GetCellName(int nRow, int nCol, CString &strName)
    {
        CString strRow;
        char cCell = (char)('A' + nCol - 1);

        strName.Format(_T("%c"), cCell);
        strRow.Format(_T( "%d "), nRow);
        strName += strRow;
    }

  2. //导出   
  3. void Cimportexcel2Dlg::OnBnClickedButton1()  
  4. {  
  5.  CFileDialog FileDialog(FALSE,L"xls",NULL,OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT, _T("Microsoft Excel 2000(*.xls)|*.xls|所有文件(*.*)"),this);   
  6.  if(FileDialog.DoModal()!=IDOK)   
  7.  {  
  8.   return;   
  9.  }  
  10.  CString cStrFile=FileDialog.GetPathName();  //选择保存路径名称  
  11.   
  12.  if(::PathFileExists(cStrFile))   
  13.  DeleteFile(cStrFile);   
  14.   
  15.  //CString cStrFile = _T("E:\\myexcel.xls");  
  16.  COleVariant covTrue((short)TRUE),covFalse((short)FALSE),covOptional((long)DISP_E_PARAMNOTFOUND,VT_ERROR);  
  17.   
  18.  CApplication app; //Excel程序   
  19.  CWorkbooks books; //工作簿集合   
  20.  CWorkbook book;  //工作表   
  21.  CWorksheets sheets;  //工作簿集合   
  22.  CWorksheet sheet; //工作表集合   
  23.  CRange range; //使用区域   
  24.    
  25.  CoUninitialize();  
  26.    
  27.  book.PrintPreview(_variant_t(false));  
  28.  if(CoInitialize(NULL)==S_FALSE)   
  29.  {  
  30.   MessageBox(L"初始化COM支持库失败!");  
  31.   return;  
  32.  }  
  33.   
  34.  if(!app.CreateDispatch(_T("Excel.Application"))); //创建IDispatch接口对象  
  35.  {  
  36.   //MessageBox(_T("Error!"));   
  37.    
  38.  }  
  39.   
  40.    
  41.  books = app.get_Workbooks();  
  42.  book = books.Add(covOptional);  
  43.    
  44.   
  45.  sheets = book.get_Worksheets();  
  46.  sheet = sheets.get_Item(COleVariant((short)1));  //得到第一个工作表  
  47.   
  48.  CHeaderCtrl   *pmyHeaderCtrl= m_list.GetHeaderCtrl(); //获取表头  
  49.   
  50.     int   m_cols   = pmyHeaderCtrl-> GetItemCount(); //获取列数  
  51.     int   m_rows = m_list.GetItemCount();  //获取行数  
  52.   
  53.   
  54.  TCHAR     lpBuffer[256];      
  55.   
  56.  HDITEM   hdi; //This structure contains information about an item in a header control. This structure has been updated to support header item images and order values.  
  57.     hdi.mask   =   HDI_TEXT;  
  58.     hdi.pszText   =   lpBuffer;  
  59.     hdi.cchTextMax   =   256;   
  60.   
  61.     CString   colname;  
  62.     CString strTemp;  
  63.   
  64.  int   iRow,iCol;  
  65.  for(iCol=0;   iCol //将列表的标题头写入EXCEL   
  66.  {   
  67.   GetCellName(1 ,iCol + 1, colname); //(colname就是对应表格的A1,B1,C1,D1)  
  68.   
  69.   range   =   sheet.get_Range(COleVariant(colname),COleVariant(colname));    
  70.   
  71.   pmyHeaderCtrl-> GetItem(iCol,   &hdi); //获取表头每列的信息  
  72.   
  73.   range.put_Value2(COleVariant(hdi.pszText));  //设置每列的内容  
  74.   
  75.   int   nWidth   =   m_list.GetColumnWidth(iCol)/6;   
  76.   
  77.   //得到第iCol+1列      
  78.   range.AttachDispatch(range.get_Item(_variant_t((long)(iCol+1)),vtMissing).pdispVal,true);     
  79.   
  80.   //设置列宽     
  81.   range.put_ColumnWidth(_variant_t((long)nWidth));  
  82.   
  83.     }   
  84.   
  85.   range   =   sheet.get_Range(COleVariant( _T("A1 ")),   COleVariant(colname));   
  86.   
  87.   range.put_RowHeight(_variant_t((long)50));//设置行的高度   
  88.   
  89.   
  90.   range.put_VerticalAlignment(COleVariant((short)-4108));//xlVAlignCenter   =   -4108   
  91.   
  92.   COleSafeArray   saRet; //COleSafeArray类是用于处理任意类型和维数的数组的类  
  93.   DWORD   numElements[]={m_rows,m_cols};       //行列写入数组  
  94.   saRet.Create(VT_BSTR,   2,   numElements); //创建所需的数组  
  95.   
  96.   range = sheet.get_Range(COleVariant( _T("A2 ")),covOptional); //从A2开始  
  97.   range = range.get_Resize(COleVariant((short)m_rows),COleVariant((short)m_cols)); //表的区域  
  98.   
  99.   long   index[2];    
  100.   
  101.   for(   iRow   =   1;   iRow   <=   m_rows;   iRow++)//将列表内容写入EXCEL   
  102.   {   
  103.    for   (   iCol   =   1;   iCol   <=   m_cols;   iCol++)    
  104.    {   
  105.      index[0]=iRow-1;   
  106.      index[1]=iCol-1;   
  107.   
  108.      CString   szTemp;   
  109.   
  110.      szTemp=m_list.GetItemText(iRow-1,iCol-1); //取得m_list控件中的内容  
  111.   
  112.      BSTR   bstr   =   szTemp.AllocSysString(); //The AllocSysString method allocates a new BSTR string that is Automation compatible  
  113.   
  114.      saRet.PutElement(index,bstr); //把m_list控件中的内容放入saRet  
  115.   
  116.      SysFreeString(bstr);  
  117.    }   
  118.   }    
  119.   
  120.       
  121.    
  122.     range.put_Value2(COleVariant(saRet)); //将得到的数据的saRet数组值放入表格  
  123.   
  124.   
  125.  book.SaveCopyAs(COleVariant(cStrFile)); //保存到cStrFile文件  
  126.  book.put_Saved(true);  
  127.   
  128.    
  129.   
  130.  books.Close();  
  131.    
  132.  //   
  133.    
  134.  book.ReleaseDispatch();  
  135.  books.ReleaseDispatch();   
  136.   
  137.  app.ReleaseDispatch();  
  138.  app.Quit();  
  139. }  
//导出
void Cimportexcel2Dlg::OnBnClickedButton1()
{
 CFileDialog FileDialog(FALSE,L"xls",NULL,OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT, _T("Microsoft Excel 2000(*.xls)|*.xls|所有文件(*.*)"),this); 
 if(FileDialog.DoModal()!=IDOK) 
 {
  return; 
 }
 CString cStrFile=FileDialog.GetPathName();  //选择保存路径名称

 if(::PathFileExists(cStrFile)) 
 DeleteFile(cStrFile); 

 //CString cStrFile = _T("E:\\myexcel.xls");
 COleVariant covTrue((short)TRUE),covFalse((short)FALSE),covOptional((long)DISP_E_PARAMNOTFOUND,VT_ERROR);

 CApplication app; //Excel程序
 CWorkbooks books; //工作簿集合
 CWorkbook book;  //工作表
 CWorksheets sheets;  //工作簿集合
 CWorksheet sheet; //工作表集合
 CRange range; //使用区域
 
 CoUninitialize();
 
 book.PrintPreview(_variant_t(false));
 if(CoInitialize(NULL)==S_FALSE) 
 {
  MessageBox(L"初始化COM支持库失败!");
  return;
 }

 if(!app.CreateDispatch(_T("Excel.Application"))); //创建IDispatch接口对象
 {
  //MessageBox(_T("Error!"));
 
 }

 
 books = app.get_Workbooks();
 book = books.Add(covOptional);
 

 sheets = book.get_Worksheets();
 sheet = sheets.get_Item(COleVariant((short)1));  //得到第一个工作表

 CHeaderCtrl   *pmyHeaderCtrl= m_list.GetHeaderCtrl(); //获取表头

    int   m_cols   = pmyHeaderCtrl-> GetItemCount(); //获取列数
    int   m_rows = m_list.GetItemCount();  //获取行数


 TCHAR     lpBuffer[256];    

 HDITEM   hdi; //This structure contains information about an item in a header control. This structure has been updated to support header item images and order values.
    hdi.mask   =   HDI_TEXT;
    hdi.pszText   =   lpBuffer;
    hdi.cchTextMax   =   256; 

    CString   colname;
    CString strTemp;

 int   iRow,iCol;
 for(iCol=0;   iCol  GetItem(iCol,   &hdi); //获取表头每列的信息

  range.put_Value2(COleVariant(hdi.pszText));  //设置每列的内容

  int   nWidth   =   m_list.GetColumnWidth(iCol)/6; 

  //得到第iCol+1列   
  range.AttachDispatch(range.get_Item(_variant_t((long)(iCol+1)),vtMissing).pdispVal,true);   

  //设置列宽  
  range.put_ColumnWidth(_variant_t((long)nWidth));

    } 

  range   =   sheet.get_Range(COleVariant( _T("A1 ")),   COleVariant(colname)); 

  range.put_RowHeight(_variant_t((long)50));//设置行的高度 


  range.put_VerticalAlignment(COleVariant((short)-4108));//xlVAlignCenter   =   -4108 

  COleSafeArray   saRet; //COleSafeArray类是用于处理任意类型和维数的数组的类
  DWORD   numElements[]={m_rows,m_cols};       //行列写入数组
  saRet.Create(VT_BSTR,   2,   numElements); //创建所需的数组

  range = sheet.get_Range(COleVariant( _T("A2 ")),covOptional); //从A2开始
  range = range.get_Resize(COleVariant((short)m_rows),COleVariant((short)m_cols)); //表的区域

  long   index[2];  

  for(   iRow   =   1;   iRow   <=   m_rows;   iRow++)//将列表内容写入EXCEL 
  { 
   for   (   iCol   =   1;   iCol   <=   m_cols;   iCol++)  
   { 
     index[0]=iRow-1; 
     index[1]=iCol-1; 

     CString   szTemp; 

     szTemp=m_list.GetItemText(iRow-1,iCol-1); //取得m_list控件中的内容

     BSTR   bstr   =   szTemp.AllocSysString(); //The AllocSysString method allocates a new BSTR string that is Automation compatible

     saRet.PutElement(index,bstr); //把m_list控件中的内容放入saRet

     SysFreeString(bstr);
   } 
  }  

    
 
    range.put_Value2(COleVariant(saRet)); //将得到的数据的saRet数组值放入表格


 book.SaveCopyAs(COleVariant(cStrFile)); //保存到cStrFile文件
 book.put_Saved(true);

 

 books.Close();
 
 //
 
 book.ReleaseDispatch();
 books.ReleaseDispatch(); 

 app.ReleaseDispatch();
 app.Quit();
}

5.添加完,代码编译会出现错误,修改:双击提示,在DialogBox()前加下划线,就可以了

6.重新编译,OK

你可能感兴趣的:(VS2010,2013)