今天我們來聊一下關于C語言和Oracle如何導出Excel的問題。
通常在業務中需要向用戶提供數據,一種常見的方式就是將數據庫表格的數據,以一定的格式寫到硬盤上的Excel文件中。而對于C語言和Oracle環境,我們可以使用PL/SQL來處理這個問題。
下面我們來看一個實例,假設我們需要導出Oracle中表格“MY_TABLE”中的數據到一個Excel文件中。我們可以使用以下的PL/SQL代碼:
SET feedback OFF; SET heading OFF; SET pagesize 0; SET linesize 32767; SET colsep ","; SET tab OFF; SPOOL /my_file_path/my_file_name.csv; SELECT COL_1, COL_2, COL_3 FROM MY_TABLE; SPOOL OFF;
在上面的代碼中,“SET”語句用于設置命令行工具(SQL Plus)的行為方式,而“SPOOL”語句會將輸出結果寫到一個.csv文件中。在我們的例子中,我們可以將這個.csv文件轉換成Excel文件即可。
對于這種方式導出的Excel文件,我們也可以使用C語言來實現,只需要使用system函數來執行上面的PL/SQL代碼,然后再通過使用C語言庫中的相關API,將.csv文件轉換為Excel文件即可。
在C語言中,我們可以使用以下的代碼來執行上面的PL/SQL命令:
char sql[512] = "sqlplus -S user/password@DB< script.sql"; system(sql);
在以上的代碼中,“sqlplus”是Oracle的一個客戶端工具,而“-S”參數用于設置靜默模式,避免在輸出結果中出現一些額外的信息。最后,我們再來一段代碼,將.csv文件轉成Excel文件:
#include#include #include #include #include void csvToExcel(char* csv_file_name, char* excel_file_name) { CoInitialize(NULL); IUnknown* pIUnknown = NULL; HRESULT result = CoCreateInstance(&CLSID_Application, NULL, CLSCTX_SERVER, &IID_Application, &pIUnknown); if(!result && pIUnknown) { IDispatch* pDispatch = NULL; result = pIUnknown->QueryInterface(IID_Dispatch, (void**)&pDispatch); if(!result && pDispatch) { VARIANT varxlFilename; VariantInit(&varxlFilename); varxlFilename.vt = VT_BSTR; char* excelFileName[512]; sprintf(excelFileName, "%s", excel_file_name); BSTR bstrxlFilename = SysAllocString((OLECHAR*)excelFileName); varxlFilename.bstrVal = bstrxlFilename; VARIANT rvt; VariantInit(&rvt); VARIANT arg; VariantInit(&arg); DISPID dispid; DISPPARAMS dispParams; LPOLESTR ptrName; BSTR bstrText = SysAllocString(L"ConvertTextToColumns"); ptrName = (LPOLESTR)objText; result = pDispatch->GetIDsOfNames(IID_NULL, &ptrName, 1, LOCALE_SYSTEM_DEFAULT, &dispid); if(!result) { dispParams.rgdispidNamedArgs = NULL; dispParams.cArgs = 2; VARIANT argv1; VariantInit(&argv1); argv1.vt = VT_DISPATCH | VT_BYREF; argv1.pdispVal = pDispatch; dispParams.rgvarg[1] = argv1; VARIANT argv2; VariantInit(&argv2); argv2.vt = VT_I4 | VT_BYREF; dispParams.rgvarg[0] = argv2; dispParams.rgvarg[0].plVal = (long*)&arg.pdispVal; dispParams.rgvarg[0].vt=VT_I4 | VT_BYREF; VARIANTARG args[2]; args[0].vt=VT_BSTR; args[0].bstrVal=bstrText; args[1].vt=VT_I4|VT_BYREF; args[1].plVal=&lidx; ptrName = (LPOLESTR)L"CommandText"; result = pDispatch->GetIDsOfNames(IID_NULL, &ptrName, 1, LOCALE_SYSTEM_DEFAULT, &dispid); if(!result) { dispParams.rgdispidNamedArgs = NULL; dispParams.cArgs = 1; dispParams.rgvarg[0] = args[0]; result = pDispatch->Invoke(dispid, IID_NULL, LOCALE_SYSTEM_DEFAULT, DISPATCH_PROPERTYPUT, &dispParams, NULL, NULL, NULL); } ptrName = (LPOLESTR)L"RecordsAffected"; result = pDispatch->GetIDsOfNames(IID_NULL,&ptrName,1, LOCALE_SYSTEM_DEFAULT,&dispid); result = pDispatch->Invoke(dispid,IID_NULL,LOCALE_SYSTEM_DEFAULT,DISPATCH_PROPERTYGET,&dispParams,&rvt,NULL,NULL); ptrName = (LPOLESTR)L"Execute"; result = pDispatch->GetIDsOfNames(IID_NULL, &ptrName, 1, LOCALE_SYSTEM_DEFAULT, &dispid); if(!result) { dispParams.rgdispidNamedArgs = NULL; dispParams.cArgs = 0; result = pDispatch->Invoke(dispid, IID_NULL, LOCALE_SYSTEM_DEFAULT, DISPATCH_METHOD, &dispParams, NULL, NULL, NULL); } int xlDone = 0; while (!xlDone) { ptrName = (LPOLESTR)L"Ready"; result = pDispatch->GetIDsOfNames(IID_NULL, &ptrName, 1, LOCALE_SYSTEM_DEFAULT, &dispid); if(!result) { dispParams.rgdispidNamedArgs = NULL; dispParams.cArgs = 0; result = pDispatch->Invoke(dispid, IID_NULL, LOCALE_SYSTEM_DEFAULT, DISPATCH_METHOD, &dispParams, NULL, NULL, NULL); VariantClear(&argv1); VariantClear(&rvt); VariantClear(&arg); VariantClear(&argv2); } } } pDispatch->Release(); pIUnknown->Release(); } } CoUninitialize(); }
至此,我們便完成了從Oracle中導出數據到Excel的過程,相信有了以上的代碼,讀者們也可以按照自己的需求,來實現類似的功能。
上一篇AS語句oracle
下一篇as在oracle