您的位置:首页 > 其它

BCB之OLE方式操作Excel

2016-07-22 16:22 1306 查看

开头

最近遇到一些项目需要生成Excel表格,于是在网上搜索了一些资料加上自己的不断摸索,终于写出些代码可以生成和操作Excel文档了,代码在BCB XE2编译运行正常,直接上代码吧。


需要的头文件:

#include "Comobj.hpp"


参照网上通用的例子编写的宏指令:

#define PG OlePropertyGet    //获取对象属性
#define PS OlePropertySet    //设置对象属性
#define FN OleFunction       //调用对象方法
#define PR OleProcedure


代码块

Variant ExcelApp;      //Excel中的Application对象,Excel应用程序对象
Variant WorkBooks;     //Excel中的Workbooks对象,Excel工作簿对象
Variant WorkBook1;
Variant Sheets;        //Excel中的Sheets对象,Excel中的工作表对象
Variant Sheet1;
Variant Cells;         //Excel中的Cells对象,Excel中的单元格对象
Variant Cell;

//设置存储路径
String strResaveName = "";
if(g_strSavePath == "")                 //预设的存储路径
{
char szCurrPath[1000] = {0};        //当前路径
GetCurrentDirectory(999,szCurrPath);
strResaveName.sprintf(L"%s\\测试结果.xls", szCurrPath);
}
else
{
strResaveName = g_strSavePath + "\\" + "测试结果.xls";
}
Variant vSaveName;                  //存储路径
vSaveName.vt = VT_BSTR;
vSaveName.bstrVal = SysAllocString(strResaveName.c_str());

//找到模板
Variant vTemplateName;
String strFilePath = "";
if(FileExists("测试结果.xlt"))
{
strFilePath = ExpandFileName("测试结果.xlt").c_str();
}
else
{
MessageBox(NULL, "测试结果.xlt模板文件丢失,无法保存!", "提示", 0);
return;
}

vTemplateName.vt = VT_BSTR;
vTemplateName.bstrVal = SysAllocString(strFilePath.c_str());

//判断是否安装有Excel
try
{
ExcelApp = Variant::CreateObject("Excel.Application");
if(ExcelApp.IsNull() || ExcelApp.IsEmpty())
{
return;
}
}
catch(...)
{
Application->MessageBox(L"无法启动Excel", L"错误",MB_ICONSTOP|MB_OK);
return;
}

//创建工作簿
WorkBooks = ExcelApp.OlePropertyGet("Workbooks");
if(FileExists(strResaveName.c_str()))
{
WorkBook1 = WorkBooks.OleFunction("open", vSaveName);
}
else
{
WorkBook1 = WorkBooks.OleFunction("add", vTemplateName);                //open:打开已有,add以模板创建工作簿
}
//创建工作表
Sheets = WorkBook1.OlePropertyGet("Worksheets");
Sheet1 = Sheets.OlePropertyGet("Item", 1);
Sheet1.OlePropertyGet("Activate");
//写入项目名称、测试人员、测试日期、测试条件
Variant  vProjName;
Variant  vDevAddr;
Variant  vAdmin;
Variant  vDateTime;
vProjName.vt = VT_BSTR;
vProjName.bstrVal = SysAllocString(g_strProjName.c_str());
vDevAddr.vt = VT_BSTR;
vDevAddr.bstrVal = SysAllocString(edtDevAddr->Text.c_str());
vAdmin.vt = VT_BSTR;
vAdmin.bstrVal = SysAllocString(g_strAdmin.c_str());
vDateTime.vt = VT_BSTR;
vDateTime.bstrVal = SysAllocString(Now().DateTimeString().c_str());

char chCond[64] = {0};              //测试条件
sprintf(chCond,"测试包数量:%d, 测试包长度:%d, 测试包间隔:%dms", edtTestCount->Text.ToInt(),
edtTestLen->Text.ToInt(), edtTestTime->Text.ToInt());
Variant  vConds;
vConds.vt = VT_BSTR;
vConds.bstrVal = SysAllocString(String(chCond).c_str());

Sheet1.PG("Cells", 1, 2).PS("Value", vProjName);
Sheet1.PG("Cells", 1, 4).PS("Value", vAdmin);
Sheet1.PG("Cells", 1, 7).PS("Value", vDateTime);
Sheet1.PG("Cells", 2, 2).PS("Value", vConds);

Variant vRange;
Variant vRange1;
String strRange = "B2:C2:D2:E2:F2:G2";
vRange.vt = VT_BSTR;
vRange.bstrVal = SysAllocString(strRange.c_str());
vRange1 = Sheet1.PG("Range", vRange);               //单元格合并
vRange1.FN("Merge", false);

//写入测试结果
Variant vTime;
Variant vSendAvg;
Variant vSendLose;
Variant vRecvAvg;
Variant vRecvLose;
vTime.vt = VT_BSTR;
vTime.bstrVal = SysAllocString(Now().DateTimeString().c_str());
vDevAddr.vt = VT_BSTR;
vDevAddr.bstrVal = SysAllocString(edtDevAddr->Text.c_str());
vSendAvg.vt = VT_BSTR;
vSendAvg.bstrVal = SysAllocString(edtSendSignal->Text.c_str());
vSendLose.vt = VT_BSTR;
vSendLose.bstrVal = SysAllocString(edtSendLose->Text.c_str());
vRecvAvg.vt = VT_BSTR;
vRecvAvg.bstrVal = SysAllocString(edtRecvSignal->Text.c_str());
vRecvLose.vt = VT_BSTR;
vRecvLose.bstrVal = SysAllocString(edtRecvLose->Text.c_str());

int iRowCount = 0;
iRowCount = Sheet1.PG("UsedRange").PG("Rows").PG("Count");

Sheet1.PG("Rows", iRowCount+1).PR("Insert");
Sheet1.PG("Cells", iRowCount+1, 1).PS("Value", iRowCount-2);                //行编号
Sheet1.PG("Cells", iRowCount+1, 2).PS("Value", vDevAddr);                   //设备地址
Sheet1.PG("Cells", iRowCount+1, 3).PS("Value", vSendAvg);                   //发送强度
Sheet1.PG("Cells", iRowCount+1, 4).PS("Value", vSendLose/100);              //发送丢包率
Sheet1.PG("Cells", iRowCount+1, 5).PS("Value", vRecvAvg);                   //接收强度
Sheet1.PG("Cells", iRowCount+1, 6).PS("Value", vRecvLose/100);              //接收丢包率
Sheet1.PG("Cells", iRowCount+1, 7).PS("Value", vTime);                      //记录时间

if(FileExists(strResaveName.c_str()))
{
WorkBook1.PR("Save");
}
else
{
WorkBook1.OleFunction("SaveAs", vSaveName);   //将Excel表格另存为     //  vSaveName                   //工作簿保存为,文件路径注意用“//”
}
if(1 == g_iOpen)
{
ExcelApp.OlePropertySet("Visible", true);//将Excel表格设为可见
}
else
{
WorkBook1.PR("Close");              //关闭表格
ExcelApp.Exec(Procedure("Quit"));   //关闭Excel程序
}


可能出现的错误

保存提示出现“服务器出现异常情况”,以模板文件方式创建的Excel文档解决方法是:将模板文件打开,菜单栏右键—->自定义快速访问工具栏—>左侧【加载项】–>最下方【管理:COM加载项】—>【转到】—>去掉所有的勾选项保存即可。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  excel BCB-OLE