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