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

    技术2022-05-20  33

    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);     }  


    最新回复(0)