C++操作Excel时Excel表格的列数怎么会是15????怎么才能自己设置Excel的列数???
#include"stdio.h"
#include <iostream.h>
#include <ole2.h> // 这个头文件一定要包含,否则就不能自动化了
#include <comdef.h>
/**************************************************************
*类功能: 把数组数据保存到Excel中
*创建人: fxl
*创建日期: 2008.4.11
*修改人:
*修改日期:
***************************************************************/
class SaveInExcel
{
private:
char *str;
// 创建实例
IDispatch *pXlApp;
// 显示,将Application.Visible属性置1
VARIANT x;
// 获取Workbooks集合
IDispatch *pXlBooks;
// 调用Workbooks.Add()方法,创建一个新的Workbook
IDispatch *pXlBook;
// 创建一个15x15的数组,用于填充表格
VARIANT arr;
// 从Application.ActiveSheet属性获得Worksheet对象
IDispatch *pXlSheet;
// 选择一个15x15大小的Range
IDispatch *pXlRange;
int ExLines;//行数
int ExCols;//列数
public:
IDispatch *GetpXlApp()
{
return pXlApp;
}
SaveInExcel();
~SaveInExcel();
HRESULT AutoWrap(int autoType, VARIANT *pvResult, IDispatch *pDisp, LPOLESTR ptName, int cArgs...);
void InsertData(int lineIndex,char **pt);
void SetLineCol(int lineNum,int colNum);
};
void SaveInExcel::SetLineCol(int lineNum,int colNum)
{
ExLines=lineNum;//行数
ExCols=colNum;//列数
arr.vt = VT_ARRAY | VT_VARIANT;
SAFEARRAYBOUND sab[2];
sab[0].lLbound = 1; sab[0].cElements = lineNum;
sab[1].lLbound = 1; sab[1].cElements = colNum;
arr.parray = SafeArrayCreate(VT_VARIANT, 2, sab);
}
SaveInExcel::SaveInExcel()
{
// 初始化COM库
CoInitialize(NULL);
// 获得EXCEL的CLSID
CLSID clsid;
HRESULT hr = CLSIDFromProgID(L"Excel.Application", &clsid);
if(FAILED(hr))
{
::MessageBox(NULL, "CLSIDFromProgID() 函数调用失败!", "错误", 0x10010);
exit(1);
}
hr = CoCreateInstance(clsid, NULL, CLSCTX_LOCAL_SERVER, IID_IDispatch, (void **)&pXlApp);
if(FAILED(hr))
{
::MessageBox(NULL, "请检查是否已经安装EXCEL!", "错误", 0x10010);
exit(1);
}
x.vt = VT_I4;
x.lVal = 1;
AutoWrap(DISPATCH_PROPERTYPUT, NULL, pXlApp, L"Visible", 1, x);
{
VARIANT result;
VariantInit(&result);
AutoWrap(DISPATCH_PROPERTYGET, &result, pXlApp, L"Workbooks", 0);
pXlBooks = result.pdispVal;
}
{
VARIANT result;
VariantInit(&result);
AutoWrap(DISPATCH_PROPERTYGET, &result, pXlBooks, L"Add", 0);
pXlBook = result.pdispVal;
}
{
VARIANT result;
VariantInit(&result);
AutoWrap(DISPATCH_PROPERTYGET, &result, pXlApp, L"ActiveSheet", 0);
pXlSheet = result.pdispVal;
}
{
VARIANT parm;
parm.vt = VT_BSTR;
parm.bstrVal = ::SysAllocString(L"A1:O1000");
VARIANT result;
VariantInit(&result);
AutoWrap(DISPATCH_PROPERTYGET, &result, pXlSheet, L"Range", 1, parm);
VariantClear(&parm);
pXlRange = result.pdispVal;
}
}
SaveInExcel::~SaveInExcel()
{
// 释放所有的接口以及变量
pXlRange->Release();
pXlSheet->Release();
pXlBook->Release();
pXlBooks->Release();
pXlApp->Release();
VariantClear(&arr);
// 注销COM库
CoUninitialize();
}
void SaveInExcel::InsertData(int lineIndex,char **pt)
{
// 初始化数组内容
for(int j=1; j<=ExCols; j++)
{
long index=lineIndex+1;
_variant_t lineValue(pt[j-1]);
SafeArrayPutElement(arr.parray, &index, (void *)&lineValue);
}
::MessageBox(NULL, "开始填充数据", "通知", 0x10000);
// 用我们的数组填充这个Range
AutoWrap(DISPATCH_PROPERTYPUT, NULL, pXlRange, L"Value", 1, arr);
}
HRESULT SaveInExcel::AutoWrap(int autoType, VARIANT *pvResult, IDispatch *pDisp, LPOLESTR ptName, int cArgs...)
{
// Begin variable-argument list...
va_list marker;
va_start(marker, cArgs);
if(!pDisp) {
MessageBox(NULL, "NULL IDispatch passed to AutoWrap()", "Error", 0x10010);
_exit(0);
}
// Variables used...
DISPPARAMS dp = { NULL, NULL, 0, 0 };
DISPID dispidNamed = DISPID_PROPERTYPUT;
DISPID dispID;
HRESULT hr;
char buf[200];
char szName[200];
// Convert down to ANSI
WideCharToMultiByte(CP_ACP, 0, ptName, -1, szName, 256, NULL, NULL);
// Get DISPID for name passed...
hr = pDisp->GetIDsOfNames(IID_NULL, &ptName, 1, LOCALE_USER_DEFAULT, &dispID);
if(FAILED(hr)) {
sprintf(buf, "IDispatch::GetIDsOfNames(\"%s\") failed w/err 0x%08lx", szName, hr);
MessageBox(NULL, buf, "AutoWrap()", 0x10010);
_exit(0);
return hr;
}
// Allocate memory for arguments...
VARIANT *pArgs = new VARIANT[cArgs+1];
// Extract arguments...
for(int i=0; i<cArgs; i++) {
pArgs[i] = va_arg(marker, VARIANT);
}
// Build DISPPARAMS
dp.cArgs = cArgs;
dp.rgvarg = pArgs;
// Handle special-case for property-puts!
if(autoType & DISPATCH_PROPERTYPUT) {
dp.cNamedArgs = 1;
dp.rgdispidNamedArgs = &dispidNamed;
}
// Make the call!
hr = pDisp->Invoke(dispID, IID_NULL, LOCALE_SYSTEM_DEFAULT, autoType, &dp, pvResult, NULL, NULL);
if(FAILED(hr)) {
sprintf(buf, "IDispatch::Invoke(\"%s\"=%08lx) failed w/err 0x%08lx", szName, dispID, hr);
MessageBox(NULL, buf, "AutoWrap()", 0x10010);
_exit(0);
return hr;
}
// End variable-argument section...
va_end(marker);
delete [] pArgs;
return hr;
}
int main()
{
SaveInExcel s;
s.SetLineCol(1000,16);
char *pt[]={"ss","ss","ssds","fgdf","eret","vvv","gg","hh","ss","ss","ssds","fgdf","eret","vvv","15","16"};
s.InsertData(0,pt);
s.InsertData(2,pt);
s.InsertData(15,pt);
s.InsertData(16,pt);
s.InsertData(30,pt);
s.InsertData(100,pt);
s.AutoWrap(DISPATCH_METHOD, NULL, s.GetpXlApp(), L"Quit", 0);
return 0;
}