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加载项】—>【转到】—>去掉所有的勾选项保存即可。相关文章推荐
- 使用Python生成Excel格式的图片
- Excel 曝出 Power Query 安全漏洞,1.2 亿用户易受远程 DDE 攻击
- VBA将excel数据表生成JSON文件
- excel vba 限制工作表的滚动区域代码
- excel vba 高亮显示当前行代码
- C#控制Excel Sheet使其自适应页宽与列宽的方法
- SQL 导入导出Excel数据的语句
- 文本、Excel、Access数据导入SQL Server2000的方法
- C#实现Excel动态生成PivotTable
- C#基于COM方式读取Excel表格的方法
- C#导出数据到Excel文件的方法
- Vbscript生成Excel报表的常用操作总结
- C#实现导入CSV文件到Excel工作簿的方法
- C#基于NPOI生成具有精确列宽行高的Excel文件的方法
- 总提示[Microsoft][ODBC Excel Driver] 数值字段溢出官方解决方法
- C#实现DataSet内数据转化为Excel和Word文件的通用类完整实例
- C#将Sql数据保存到Excel文件中的方法
- VC6.0实现读取Excel数据的方法
- C#定制Excel界面并实现与数据库交互的方法
- 把excel表格里的数据导入sql数据库的两种方法