VC导出大数据到EXCEL解决方案

void   CExcelPrintDlg::OnBtnExcel()    
  {  
  CWaitCursor wait;     //  
等待光标  
   
  //
====================创建Excel文档对象部分===================//  
  _Application objApp;                   //
定义应用程序变量  
  _Workbook objBook;                 //
定义工作薄对象变量  
  Workbooks objBooks;               //
定义工作薄集合对象  
  _Worksheet objSheet;               //
定义工作表对象          
  Worksheets objSheets;             //
定义工作表集合对象  
  Range objRange;               //
定义区域对象  
  Font objFont;                 //
定义字体对象  
   
  //
创建Excel应用程序对象  
  if(!objApp.CreateDispatch("Excel.Application"))  
  {  
  AfxMessageBox("
新建Excel文档失败");  
  return   ;  
  }  
   
  //
可选参数的使用方法应该如下:  
  VARIANT   varOptional;  
  VariantInit(&varOptional);  
  varOptional.vt=VT_ERROR;  
  varOptional.scode   =DISP_E_PARAMNOTFOUND;  
   
   
  objBooks     =   objApp.GetWorkbooks();                 //
得到工作薄集合对象  
  objBook       =   objBooks.Add(varOptional);         //
向工作薄集合对象添加工作薄对象,并返回工作薄对象  
   
  objSheets   =   objBook.GetWorksheets();             //
得到工作表集合对象  
  //
向工作表集合对象添加工作表,并返回工作表对象  
  objSheet     =   objSheets.Add(varOptional,   varOptional,   varOptional,   varOptional);  
  //
====================创建Excel文档对象部分===================//  
   
   
  //
===============开始设置表格部分======================//  
   
  //
设置表格的行数与列数  
  long   nRows,   nCols;  
  nCols   =   m_pRs.GetFieldCount();  
  nRows   =   m_pRs.GetRecordCount()   +   1;       //
因为有表头所以要加1  
   
  //
可选参数的使用方法应该如下:  
  VARIANT   varCol;  
  VariantInit(&varCol);  
  varCol.vt   =   VT_R4;  
   
  //
指定单元格的列宽  
  long nSize;  
  long nstrLen;  
  CString strFld;  
   
  //
这几个变量是为了获取表格中的每一列  
  char cCol   =   'A';  
  CString strTempCol   =   "1";  
  CString strCol;  
   
  for(long   i   =   0;   i   <   nCols;   i   ++)  
  {  
  nSize   =   10;               //
获取字段的大小                                
  m_pRs.GetFieldName(i,strFld);         //
获取字段的名字  
  nstrLen   =   strFld.GetLength();       //
获取字段名的字符串的长度  
                   
  //
从字符'A'开始获取每一列  
  cCol   =   cCol   +   i;  
  strCol   =   cCol;  
  strCol   =   strCol   +   strTempCol;  
   
  //
获得工作区  
  objRange   =   objSheet.GetRange(COleVariant(strCol),   varOptional);  
   
  //
设置单元格的宽度  
  if(nstrLen   <   nSize)  
  {  
  varCol.fltVal   =   nSize   +6;  
  objRange.SetColumnWidth(varCol);  
  }  
  else  
  {  
  varCol.fltVal   =   nstrLen   +6;  
  objRange.SetColumnWidth(varCol);  
  }  
  }  
  //
===============开始设置表格部分======================//  
   
  ///
用来获取单元格区间的一个过程/  
  char chr;  
  chr   =   'A'   +   nCols   -1;  
  CString   strChr;  
  CString   strTemp;  
  CString   cstrTemp;  
  cstrTemp.Format("%d",   2);  
   
  strChr   =   chr;  
  strTemp   =   cstrTemp;  
  strChr   =   strChr   +   strTemp;    
  ///  
   
  VARIANT   varUnit;  
  VariantInit(&varUnit);  
  varUnit.vt   =   VT_I4;  
  varUnit.lVal   =   15;  
   
  //
获取指定的单元格区域  
  objRange   =   objSheet.GetRange(COleVariant("A1"), COleVariant(strChr));  
  objRange.Merge(varOptional);             //  
合并单元格  
   
  //
获取字体对象并设置字体属性  
  objFont   =   objRange.GetFont();  
  objFont.SetName(COleVariant("
黑体"));  
  objFont.SetSize(varUnit);  
   
  //
设置报表的标题  
  objRange.SetValue2(COleVariant("
我的第一个Excel打印程序"));  
   
  //
设置居中显示属性  
  varUnit.lVal   =   -4108;  
  objRange.SetHorizontalAlignment(varUnit);     //   xlCenter  
  objRange.SetVerticalAlignment(varUnit);       //   xlCenter  
   
  //  
开始将数据库中的内容写入到安全数组  
   
          COleSafeArray   saRet;             //
定义一个安全数组SAFEARRAY  
   
          DWORD   numElements[2];           //
设置安全数组的边界  
          numElements[0]=   nRows;         //  
objRange中的行数.  
          numElements[1]=   nCols;         //  
objRange中的列数.  
   
  //
创建一个二维数组,数组中存放的元素类型为VT_BSTR  
          saRet.Create(VT_BSTR,   2,   numElements);  
           
  //
填充   SAFEARRAY  
          long index[2];  
          long iRow;  
          long iCol;  
  CString strValue;  
  CString strVal;  
  VARIANT varVal;       //  
该变量用来为安全数组赋值  
   
  m_pRs.MoveFirst();         //
将读写光标移到记录集的第一条记录处  
   
  for(iRow=0;   iRow   <=   nRows-1;   iRow++)  
          {  
                for(iCol=0;   iCol   <=   nCols-1;   iCol++)  
                {  
                      index[0]   =   iRow;  
                      index[1]   =   iCol;  
   
      if(0   ==   iRow)  
      {      
      m_pRs.GetFieldName(iCol,strVal);         //
获取字段的名字;  
     
      VariantInit(&varVal);  
      varVal.vt   =   VT_BSTR;  
      varVal.bstrVal   =   strVal.AllocSysString();  
       
      saRet.PutElement(index,   varVal.bstrVal);  
      SysFreeString(varVal.bstrVal);  
      VariantClear(&varVal);  
      }  
      else  
      {  
      m_pRs.GetFieldValue(iCol,strVal);  
       
      strVal.TrimLeft();  
      strVal.TrimRight();  
   
      VariantInit(&varVal);  
      varVal.vt   =   VT_BSTR;  
      varVal.bstrVal   =   strVal.AllocSysString();  
       
      saRet.PutElement(index,   varVal.bstrVal);  
      SysFreeString(varVal.bstrVal);  
      VariantClear(&varVal);  
      }  
        }  
        if(iRow   >   0)  
        {  
    m_pRs.MoveNext();  
        }  
          }  
   
  ///
用来获取单元格区间的一个过程/  
  cstrTemp.Format("%d",   nRows+2);  
  strChr   =   chr;  
  strTemp   =   cstrTemp;  
  strChr   =   strChr   +   strTemp;  
  ///  
   
 
将安全数组中的内容直接赋值给单元格  
  objRange   =   objSheet.GetRange(COleVariant("A3"),    
  COleVariant(strChr)   );  
  objFont   =   objRange.GetFont();  
  objFont.SetName(COleVariant("
宋体"));  
  varUnit.lVal   =   12;  
  objFont.SetSize(varUnit);  
   
  objRange.SetValue2(COleVariant(saRet));  
   
  varUnit.lVal   =   -4108;  
  objRange.SetHorizontalAlignment(varUnit);     //   xlCenter  
  objRange.SetVerticalAlignment(varUnit);     //   xlCenter  
  ///  
   
  objApp.SetVisible(true);  
  }  

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值