CListCtrl控件导出excel

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

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

6.重新编译,OK

你可能感兴趣的:(MFC)