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);
}
VC导出大数据到EXCEL解决方案
最新推荐文章于 2014-04-16 17:39:24 发布