导出Excel示例(C++)【设置边框、设置背景色、合并单元格的示例】

本示例导出的Excel图片如“下图”所示(设置边框、设置背景色、合并单元格的示例)



1.将附件中exportExcel.zip解压并将文件夹拷到你工程所在目录下



2.包含以下头文件

#include "exportExcel/CApplication.h"
#include "exportExcel/CFont0.h"
#include "exportExcel/Cnterior.h"
#include "exportExcel/CRange.h"
#include "exportExcel/CWorkbook.h"
#include "exportExcel/CWorkbooks.h"
#include "exportExcel/CWorksheet.h"
#include "exportExcel/CWorksheets.h"


3.本示例的字符集为“使用多字节字符集”(在工程属性--配置属性--常规--字符集 下设置)



4.示例代码

void ExportExcel()
{
CFileDialog dlg(FALSE,_T("(*.xls)"),NULL,OFN_HIDEREADONLY |OFN_OVERWRITEPROMPT, 
_T("(*.xls)|*.xls||"),NULL);


if(dlg.DoModal()==IDOK)
{
CString strFileName=dlg.GetPathName();
COleVariant covTrue((short)TRUE),covFalse((short)FALSE),covOptional((long)DISP_E_PARAMNOTFOUND,VT_ERROR);


CApplication app;
CWorkbook book;
CWorkbooks books;
CWorksheet sheet;
CWorksheets sheets;
CRange range;
CFont0 font;


if (!app.CreateDispatch(_T("Excel.Application")))
{
MessageBox(_T("EXCEL Error!"));
}


books = app.get_Workbooks();
book = books.Add(covOptional);
sheets = book.get_Worksheets();
sheet = sheets.get_Item(COleVariant((short)1));


//有多少列(Head[5], ListHead[5])
//表格的插入--有多少列就一直沿着26个英文字母往下排序,A,B,C,D,E,F,G...w
const char   Head[5]={'A','B','C','D','E'};
const char*   ListHead[5]={"编号","车辆名称","过车时间","设备名称","故障等级"};


//从第三行才是正式的数据(第一行是导出的表名、第二行是每列的列名)
int nExcelColcount=3;


CString StrTemp,StrHead;


CRange cExcelRange; 
LPDISPATCH lpDisp = NULL;


//合并A1-E1单元格,并设置表名"过车信息报表"
lpDisp = sheet.get_Range(_variant_t("A1"),_variant_t("E1"));  
cExcelRange.AttachDispatch(lpDisp,TRUE);
cExcelRange.Merge(_variant_t(0));//合并单元格
cExcelRange.put_Value2(COleVariant(_T("过车信息报表")));//设置表名
//设置合并单元格的文字的对齐方式【水平垂直居中、竖直垂直居中】   
//水平对齐:默认=1,居中=-4108,左=-4131,右=-4152   
//垂直对齐:默认=2,居中=-4108,左=-4160,右=-4107   
cExcelRange.put_HorizontalAlignment(_variant_t((long)-4108));   
cExcelRange.put_VerticalAlignment(_variant_t((long)-4108));   
//改变合并单元格的底色  
Cnterior interior;  
interior.AttachDispatch(cExcelRange.get_Interior());
//将底色改为浅青色 37-对应浅青色 具体数值对应颜色看这个链接 https://msdn.microsoft.com/en-us/library/cc296089.aspx
interior.put_ColorIndex(_variant_t((long)37)); 




CFont0 ft;  
ft.AttachDispatch(cExcelRange.get_Font());  
ft.put_Size(_variant_t(20));  


//设置第二行的五个列的列名
for (int i=0;i<5;i++)
{
StrHead=Head[i];
StrHead.AppendFormat("%d",2);//列名设置在第二行
range   =   sheet.get_Range(COleVariant(_T(StrHead)),COleVariant(_T(StrHead)));
StrTemp=ListHead[i];
range.put_Value2(COleVariant(_T(StrTemp)));


//D+ 设置导出的EXCEL列宽 根据实际的需求,看你设置的每一个单元格的字符串的长度来调整这个参数
VARIANT nWidht;
nWidht.vt=VT_I4;///指明整型数据


if (i == 0)
{
nWidht.lVal = 4;
}
else if (i == 2)
{
nWidht.lVal = 20;
}
else
{
nWidht.lVal = 10;
}


range.put_ColumnWidth(nWidht);
}


int nIndex = 1;
CString strIndex;


//第一行数据
{
strIndex.Format("%d",nIndex++);


//每一行有5列数据
for (int i=0;i<5;i++)
{
StrHead=Head[i];
StrHead.AppendFormat("%d",nExcelColcount);//从第三行才是正式的表格里面的数据
range = sheet.get_Range(COleVariant(_T(StrHead)),COleVariant(_T(StrHead)));


if (i == 0)
StrTemp=strIndex;//第一个数据 序号
else if(i==1)
StrTemp="HXD1C3080";//第二个数据 车号
else if(i==2)
StrTemp="2016/12/28-17:16:25";//第三个数据 时间
else if(i == 3)//设备名称
StrTemp="设备1";//第四个数据 设备名称
else//过车的最高故障等级
{
StrTemp = "没有故障";//第五个数据 故障情况
}
range.put_Value2(COleVariant(_T(StrTemp)));//给单元格设置值
}
nExcelColcount++;//移到下一行
}


//第二行数据
{
strIndex.Format("%d",nIndex++);
for (int i=0;i<5;i++)
{
StrHead=Head[i];
StrHead.AppendFormat("%d",nExcelColcount);
range = sheet.get_Range(COleVariant(_T(StrHead)),COleVariant(_T(StrHead)));


if (i == 0)
StrTemp=strIndex;
else if(i==1)
StrTemp="HXD1C3047";
else if(i==2)
StrTemp="2016/12/27-13:30:34";
else if(i == 3)//设备名称
StrTemp="设备1";
else//过车的最高故障等级
{
StrTemp = "没有故障";
}
range.put_Value2(COleVariant(_T(StrTemp)));
}
nExcelColcount++;
}




//画边框
long lColor  = RGB(255, 0, 0);  
COleVariant varColor(lColor);    
CString strCellName;   
CRange UnitRge;
for(int i=1;i< nExcelColcount;i++)   
{   
for(int j=1;j<=5;j++)   
{       
strCellName.Format("%c%d",j+64,i);//单元格的名称   
UnitRge.AttachDispatch(sheet.get_Range(_variant_t(strCellName),_variant_t(strCellName)));//加载单元格   
//LineStyle=线型 Weight=线宽 ColorIndex=线的颜色(-4105为自动)   
UnitRge.BorderAround(_variant_t((long)1),_variant_t((long)2),_variant_t((long)-4105),varColor,varColor);//设置边框   
}   
}   


//在边框右下方添加导出时间
CRange cExcelRangeB; 
CString strBegin;
CString strEnd;
CString strExportTime;
CTime tmNowDay;//当前时间
tmNowDay  = CTime::GetCurrentTime();//获得当前日期
CString strTimeNow;
strExportTime.Format("导出时间:%4d-%02d-%02d %d:%d:%d",tmNowDay.GetYear(),tmNowDay.GetMonth(),tmNowDay.GetDay(),
tmNowDay.GetHour(),tmNowDay.GetMinute(),tmNowDay.GetSecond()); 


strBegin.AppendFormat("A%d",nExcelColcount);
strEnd.AppendFormat("E%d",nExcelColcount);
cExcelRangeB.AttachDispatch(sheet.get_Range(_variant_t(strBegin),_variant_t(strEnd)),TRUE);
cExcelRangeB.Merge(_variant_t(0));
cExcelRangeB.put_Value2(COleVariant(_T(strExportTime)));
//设置齐方式为水平垂直居中   
//水平对齐:默认=1,居中=-4108,左=-4131,右=-4152   
//垂直对齐:默认=2,居中=-4108,左=-4160,右=-4107   
cExcelRangeB.put_HorizontalAlignment(_variant_t((long)-4152));   
cExcelRangeB.put_VerticalAlignment(_variant_t((long)-4107));   


book.SaveCopyAs(COleVariant(strFileName));
book.put_Saved(true); 
book.ReleaseDispatch();  
books.ReleaseDispatch();  
app.Quit();
app.ReleaseDispatch();
}
}

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值