BCB之OLE方式操作Excel

開頭

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章