開頭
最近遇到一些項目需要生成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加載項】—>【轉到】—>去掉所有的勾選項保存即可。