VC中实现读取Excel表数据总结

作者在 2009-07-05 09:04:52 发布以下内容
利用VC对Excel进行操作。主要的函数是从网上找的,有些东西自己做了修改。可以对一个目录下的所有Excel表进行处理。主要代码如下:
 
//获取一个目录下所有Excel表名,并加入到一个数组中。
char oldPath[MAX_PATH];
 getcwd(oldPath,MAX_PATH);
 chdir(m_strDirectory);
 CFileFind fileFind;
 BOOL bExist=FALSE;
 bExist=fileFind.FindFile("*.xls");
 while(bExist)
 {
  bExist=fileFind.FindNextFile();
  CString strTitle=fileFind.GetFileTitle();
  m_strTableAll.Add(strTitle);
 }
 fileFind.Close();
 chdir(oldPath);
 
 
//处理所有Excel数据,并把所有数据加入到一个二维数组中
CString m_strArray[i][j]
 
CoInitialize(NULL);
 int i,j;  //用来循环
 // 获得EXCEL的CLSID
 CLSID clsid;
 HRESULT hr = CLSIDFromProgID(L"Excel.Application", &clsid);
 
 if(FAILED(hr)) {
  AfxMessageBox("CLSIDFromProgID() 函数调用失败!");
  return;
 }
 
 // 创建实例
 IDispatch *pXlApp;
 hr = CoCreateInstance(clsid, NULL, CLSCTX_LOCAL_SERVER, IID_IDispatch, (void **)&pXlApp);
 if(FAILED(hr)) {
  AfxMessageBox("请检查是否已经安装EXCEL!");
  return;
 }
 
 // 显示,将Application.Visible属性置1
 /VARIANT x;
 x.vt = VT_I4;
 x.lVal = 1;
 AutoWrap(DISPATCH_PROPERTYPUT, NULL, pXlApp, L"Visible", 1, x);
 // 获取Workbooks集合
 IDispatch *pXlBooks;
 {
  VARIANT result;
  VariantInit(&result);
  AutoWrap(DISPATCH_PROPERTYGET, &result, pXlApp, L"Workbooks", 0);
  pXlBooks = result.pdispVal;
 }
 
 CString strName;  //Excel表完整路径
 CString strTmp;   //临时变量,保存单元格数据中的CString型
 double dblTmp;   //临时变量,保存单元格数据中的double型
 //用来保存信息的数组
 VARIANT arr;
 arr.vt = VT_ARRAY | VT_VARIANT;
 SAFEARRAYBOUND sab[2];
 sab[0].lLbound = 1; sab[0].cElements = 40;
 sab[1].lLbound = 1; sab[1].cElements = 16;
 arr.parray = SafeArrayCreate(VT_VARIANT, 2, sab);
 int tableNum;
 int nCount=m_DataConn.m_strTableAll.GetSize();
 for(tableNum=0;tableNum<nCount;tableNum++)
 {
  strName.Format("%s\\%s",m_DataConn.m_strDirectory,m_DataConn.m_strTableAll.GetAt(tableNum));
    
  // 调用Workbooks.Open()方法,打开一个已经存在的Workbook
  IDispatch *pXlBook;
  {
   VARIANT parm;
   parm.vt = VT_BSTR;
   // parm.bstrVal = ::SysAllocString(L"''strName''");
   parm.bstrVal=strName.AllocSysString();
   VARIANT result;
   VariantInit(&result);
   AutoWrap(DISPATCH_PROPERTYGET, &result, pXlBooks, L"Open", 1,parm);
   pXlBook = result.pdispVal;
  }
 
  // 初始化数组内容
  /*
  for(int i=1; i<=15; i++) {
  for(int j=1; j<=15; j++) {
  VARIANT tmp;
  tmp.vt = VT_BSTR;
  wsprintfW(szTmp,L"%i,%i",i,j);
  tmp.bstrVal = SysAllocString(szTmp);
  // 添加数据到数组中
  long indices[] = {i,j};
  SafeArrayPutElement(arr.parray, indices, (void *)&tmp);
  }
  }
  */
  // 从Application.ActiveSheet属性获得Worksheet对象
  IDispatch *pXlSheet;
  {
   VARIANT result;
   VariantInit(&result);
   AutoWrap(DISPATCH_PROPERTYGET, &result, pXlApp, L"ActiveSheet", 0);
   pXlSheet = result.pdispVal;
  }
 
  // 选择一个16x40大小的Range
  IDispatch *pXlRange;
  {
   VARIANT parm;
   parm.vt = VT_BSTR;
   parm.bstrVal = ::SysAllocString(L"A1:P40");
   
   VARIANT result;
   VariantInit(&result);
   AutoWrap(DISPATCH_PROPERTYGET, &result, pXlSheet, L"Range", 1, parm);
   VariantClear(&parm);
   
   pXlRange = result.pdispVal;
  }
  // 用这个Range读取数据
  AutoWrap(DISPATCH_PROPERTYGET, &arr, pXlRange, L"Value",0);
  for(i=1; i<=40; i++)
  {
   for(j=1; j<=16; j++)
   {
    VARIANT tmp;
    //tmp.vt = VT_BSTR;
    // 添加数据到数组中
    long indices[] = {i,j};
    SafeArrayGetElement(arr.parray, indices, (void *)&tmp);
    if(tmp.vt ==VT_BSTR)
    {
     strTmp=tmp.bstrVal;
    }
    else if(tmp.vt==VT_R8)
    {
     dblTmp=tmp.dblVal;
     strTmp.Format("%f",dblTmp);
    }
    else if(tmp.vt=VT_NULL)
    {
     strTmp="";
    }
    _bstr_t str1=strTmp;
    WCHAR *str2=str1;
    pDoc->m_strArray[tableNum*40+i][j]=str2;
   }
  }
  AutoWrap(DISPATCH_METHOD, NULL, pXlBook, L"Close", 0);
  VariantClear(&arr);
  pXlRange->Release();
  pXlSheet->Release();
  pXlBook->Release();
 }
 // 退出,调用Application.Quit()方法
 // 释放所有的接口以及变量
 AutoWrap(DISPATCH_METHOD, NULL, pXlApp, L"Quit", 0);
 pXlBooks->Release();
 pXlApp->Release();
 
 // 注销COM库
 CoUninitialize();
 
//**********************//
// AutoWrap 函数的正体
// 先声明:这个函数不是偶写的
// AutoWrap() - Automation helper function...
HRESULT CExcelView::AutoWrap(int autoType, VARIANT *pvResult, IDispatch *pDisp, LPOLESTR ptName, int cArgs...)
{
    // Begin variable-argument list...
    va_list marker;
    va_start(marker, cArgs);
    if(!pDisp) {   
  AfxMessageBox("NULL IDispatch passed to AutoWrap()");
        _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);
        AfxMessageBox(buf);
        _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);
        AfxMessageBox(buf);
        _exit(0);
        return hr;
    }
    // End variable-argument section...
    va_end(marker);
    delete [] pArgs;
    return hr;
}

文章出处:http://www.diybl.com/course/3_program/vc/vc_js/2008114/96483_2.html

技术 | 阅读 14064 次
文章评论,共1条
vfdff(作者)
2009-07-05 09:06
1
纯 C++ 代码创建并保存 EXCEL 文件<br />
<br />
最近发现很多人都在研究OFFICE方面的编程,当然,偶也是一个啦:)<br />
可是这方面的资料却很难找,而且大部分(几乎全部)都是英文的。<br />
于是,便有了写这篇文章的念头(好了,言归正传)。<br />
<br />
本来OFFICE已经为大家提供了很好用的COM组件,但我发现我怎么用怎么不顺手(估计是本人太菜了)。<br />
于是便绞尽脑汁想用纯 C++ 代码来实现,终于,哈哈,嘿嘿,嚯嚯……<br />
<br />
好了,下面是我的步骤(偶用的VC++ 6.0):<br />
1. 先新建一个“Win32 控制台应用/Win32 Console Application”工程,工程名不妨叫做“createXLS”。<br />
2. 工程向导里选择“A &quot;Hello,World!&quot; application”,新建完毕(废话)。<br />
3. 打开“createXLS.cpp”文件,添加代码(本不想贴代码的,想做个工程让大家下载,因为太简单,不好意思兴师动众了):<br />
<br />
#include &lt;ole2.h&gt;&nbsp;&nbsp;// 这个头文件一定要包含,否则就不能自动化了<br />
<br />
// 接着修改我们添加一个函数,这个函数是整个程序的基础<br />
// 若以后写别的程序而想用纯 C++ 来实现自动化,这个函数是可以复用的<br />
HRESULT AutoWrap(int autoType, VARIANT *pvResult, IDispatch *pDisp, LPOLESTR ptName, int cArgs...);<br />
<br />
// 修改主函数<br />
int main(int argc, char* argv[])<br />
{<br />
 // printf(&quot;Hello World!\n&quot;); // 注释掉这一句<br />
<br />
 // 初始化COM库<br />
 CoInitialize(NULL);<br />
<br />
 // 获得EXCEL的CLSID<br />
 CLSID clsid;<br />
 HRESULT hr = CLSIDFromProgID(L&quot;Excel.Application&quot;, &amp;clsid);<br />
<br />
 if(FAILED(hr)) {<br />
&nbsp;&nbsp;::MessageBox(NULL, &quot;CLSIDFromProgID() 函数调用失败!&quot;, &quot;错误&quot;, 0x10010);<br />
&nbsp;&nbsp;return -1;<br />
 }<br />
<br />
 // 创建实例<br />
 IDispatch *pXlApp;<br />
 hr = CoCreateInstance(clsid, NULL, CLSCTX_LOCAL_SERVER, IID_IDispatch, (void **)&amp;pXlApp);<br />
 if(FAILED(hr)) {<br />
&nbsp;&nbsp;::MessageBox(NULL, &quot;请检查是否已经安装EXCEL!&quot;, &quot;错误&quot;, 0x10010);<br />
&nbsp;&nbsp;return -2;<br />
 }<br />
<br />
 // 显示,将Application.Visible属性置1<br />
 VARIANT x;<br />
 x.vt = VT_I4;<br />
 x.lVal = 1;<br />
 AutoWrap(DISPATCH_PROPERTYPUT, NULL, pXlApp, L&quot;Visible&quot;, 1, x);<br />
<br />
 // 获取Workbooks集合<br />
 IDispatch *pXlBooks;<br />
 {<br />
 VARIANT result;<br />
 VariantInit(&amp;result);<br />
 AutoWrap(DISPATCH_PROPERTYGET, &amp;result, pXlApp, L&quot;Workbooks&quot;, 0);<br />
 pXlBooks = result.pdispVal;<br />
 }<br />
 <br />
 // 调用Workbooks.Add()方法,创建一个新的Workbook<br />
 IDispatch *pXlBook;<br />
 {<br />
 VARIANT result;<br />
 VariantInit(&amp;result);<br />
 AutoWrap(DISPATCH_PROPERTYGET, &amp;result, pXlBooks, L&quot;Add&quot;, 0);<br />
 pXlBook = result.pdispVal;<br />
 }<br />
 <br />
 // 创建一个15x15的数组,用于填充表格<br />
 VARIANT arr;<br />
 WCHAR szTmp[32];<br />
 arr.vt = VT_ARRAY | VT_VARIANT;<br />
 SAFEARRAYBOUND sab[2];<br />
 sab[0].lLbound = 1; sab[0].cElements = 15;<br />
 sab[1].lLbound = 1; sab[1].cElements = 15;<br />
 arr.parray = SafeArrayCreate(VT_VARIANT, 2, sab);<br />
<br />
 // 初始化数组内容<br />
 for(int i=1; i&lt;=15; i++) {<br />
&nbsp;&nbsp;for(int j=1; j&lt;=15; j++) {<br />
&nbsp;&nbsp;&nbsp;VARIANT tmp;<br />
&nbsp;&nbsp;&nbsp;tmp.vt = VT_BSTR;<br />
&nbsp;&nbsp;&nbsp;wsprintfW(szTmp,L&quot;%i,%i&quot;,i,j);<br />
&nbsp;&nbsp;&nbsp;tmp.bstrVal = SysAllocString(szTmp);<br />
&nbsp;&nbsp;&nbsp;// 添加数据到数组中<br />
&nbsp;&nbsp;&nbsp;long indices[] = {i,j};<br />
&nbsp;&nbsp;&nbsp;SafeArrayPutElement(arr.parray, indices, (void *)&amp;tmp);<br />
&nbsp;&nbsp;}<br />
 }<br />
 <br />
 // 从Application.ActiveSheet属性获得Worksheet对象<br />
 IDispatch *pXlSheet;<br />
 {<br />
 VARIANT result;<br />
 VariantInit(&amp;result);<br />
 AutoWrap(DISPATCH_PROPERTYGET, &amp;result, pXlApp, L&quot;ActiveSheet&quot;, 0);<br />
 pXlSheet = result.pdispVal;<br />
 }<br />
<br />
 // 选择一个15x15大小的Range<br />
 IDispatch *pXlRange;<br />
 {<br />
 VARIANT parm;<br />
 parm.vt = VT_BSTR;<br />
 parm.bstrVal = ::SysAllocString(L&quot;A1:O15&quot;);<br />
<br />
 VARIANT result;<br />
 VariantInit(&amp;result);<br />
 AutoWrap(DISPATCH_PROPERTYGET, &amp;result, pXlSheet, L&quot;Range&quot;, 1, parm);<br />
 VariantClear(&amp;parm);<br />
<br />
 pXlRange = result.pdispVal;<br />
 }<br />
<br />
 ::MessageBox(NULL, &quot;我要填充数据了哈!&quot;, &quot;通知&quot;, 0x10000);<br />
<br />
 // 用我们的数组填充这个Range<br />
 AutoWrap(DISPATCH_PROPERTYPUT, NULL, pXlRange, L&quot;Value&quot;, 1, arr);<br />
 pXlRange-&gt;Release();<br />
<br />
 // 另外再选择一个Range<br />
 {<br />
 VARIANT parm;<br />
 parm.vt = VT_BSTR;<br />
 parm.bstrVal = ::SysAllocString(L&quot;A11:O25&quot;);<br />
&nbsp;&nbsp;<br />
 VARIANT result;<br />
 VariantInit(&amp;result);<br />
 AutoWrap(DISPATCH_PROPERTYGET, &amp;result, pXlSheet, L&quot;Range&quot;, 1, parm);<br />
 VariantClear(&amp;parm);<br />
&nbsp;&nbsp;<br />
 pXlRange = result.pdispVal;<br />
 }<br />
 <br />
 ::MessageBox(NULL, &quot;我还要填充一次哈!&quot;, &quot;通知&quot;, 0x10000);<br />
<br />
 // 用我们的数组再次填充这个Range<br />
 AutoWrap(DISPATCH_PROPERTYPUT, NULL, pXlRange, L&quot;Value&quot;, 1, arr);<br />
<br />
 ::MessageBox(NULL, &quot;好了,我们该保存文件了!&quot;, &quot;通知&quot;, 0x10000);<br />
<br />
 // 接下来我们该保存文件了,利用Worksheet.SaveAs()方法(我这里忽略了其他所有参数,除了文件名)<br />
 {<br />
 VARIANT filename;<br />
 filename.vt = VT_BSTR;<br />
 filename.bstrVal = SysAllocString(L&quot;c:\\test.xls&quot;);<br />
 AutoWrap(DISPATCH_METHOD, NULL, pXlSheet, L&quot;SaveAs&quot;, 1, filename);<br />
 }<br />
<br />
 ::MessageBox(NULL, &quot;哈哈,收工了!&quot;, &quot;通知&quot;, 0x10000);<br />
<br />
 // 退出,调用Application.Quit()方法<br />
 AutoWrap(DISPATCH_METHOD, NULL, pXlApp, L&quot;Quit&quot;, 0);<br />
 <br />
 // 释放所有的接口以及变量<br />
 pXlRange-&gt;Release();<br />
 pXlSheet-&gt;Release();<br />
 pXlBook-&gt;Release();<br />
 pXlBooks-&gt;Release();<br />
 pXlApp-&gt;Release();<br />
 VariantClear(&amp;arr);<br />
 <br />
 // 注销COM库<br />
 CoUninitialize();<br />
<br />
 return 0;<br />
}<br />
<br />
// AutoWrap 函数的正体(真身,哈哈)<br />
// 先声明:这个函数不是偶写的哈(别问是谁写的,偶也不知道)<br />
// AutoWrap() - Automation helper function...<br />
HRESULT AutoWrap(int autoType, VARIANT *pvResult, IDispatch *pDisp, LPOLESTR ptName, int cArgs...) {<br />
&nbsp;&nbsp;&nbsp; // Begin variable-argument list...<br />
&nbsp;&nbsp;&nbsp; va_list marker;<br />
&nbsp;&nbsp;&nbsp; va_start(marker, cArgs);<br />
<br />
&nbsp;&nbsp;&nbsp; if(!pDisp) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MessageBox(NULL, &quot;NULL IDispatch passed to AutoWrap()&quot;, &quot;Error&quot;, 0x10010);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_exit(0);<br />
&nbsp;&nbsp;&nbsp; }<br />
<br />
&nbsp;&nbsp;&nbsp; // Variables used...<br />
&nbsp;&nbsp;&nbsp; DISPPARAMS dp = { NULL, NULL, 0, 0 };<br />
&nbsp;&nbsp;&nbsp; DISPID dispidNamed = DISPID_PROPERTYPUT;<br />
&nbsp;&nbsp;&nbsp; DISPID dispID;<br />
&nbsp;&nbsp;&nbsp; HRESULT hr;<br />
&nbsp;&nbsp;&nbsp; char buf[200];<br />
&nbsp;&nbsp;&nbsp; char szName[200];<br />
<br />
&nbsp;&nbsp;&nbsp; // Convert down to ANSI<br />
&nbsp;&nbsp;&nbsp; WideCharToMultiByte(CP_ACP, 0, ptName, -1, szName, 256, NULL, NULL);<br />
<br />
&nbsp;&nbsp;&nbsp; // Get DISPID for name passed...<br />
&nbsp;&nbsp;&nbsp; hr = pDisp-&gt;GetIDsOfNames(IID_NULL, &amp;ptName, 1, LOCALE_USER_DEFAULT, &amp;dispID);<br />
&nbsp;&nbsp;&nbsp; if(FAILED(hr)) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sprintf(buf, &quot;IDispatch::GetIDsOfNames(\&quot;%s\&quot;) failed w/err 0x%08lx&quot;, szName, hr);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MessageBox(NULL, buf, &quot;AutoWrap()&quot;, 0x10010);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_exit(0);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return hr;<br />
&nbsp;&nbsp;&nbsp; }<br />
<br />
&nbsp;&nbsp;&nbsp; // Allocate memory for arguments...<br />
&nbsp;&nbsp;&nbsp; VARIANT *pArgs = new VARIANT[cArgs+1];<br />
&nbsp;&nbsp;&nbsp; // Extract arguments...<br />
&nbsp;&nbsp;&nbsp; for(int i=0; i&lt;cArgs; i++) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pArgs[i] = va_arg(marker, VARIANT);<br />
&nbsp;&nbsp;&nbsp; }<br />
<br />
&nbsp;&nbsp;&nbsp; // Build DISPPARAMS<br />
&nbsp;&nbsp;&nbsp; dp.cArgs = cArgs;<br />
&nbsp;&nbsp;&nbsp; dp.rgvarg = pArgs;<br />
<br />
&nbsp;&nbsp;&nbsp; // Handle special-case for property-puts!<br />
&nbsp;&nbsp;&nbsp; if(autoType &amp; DISPATCH_PROPERTYPUT) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dp.cNamedArgs = 1;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dp.rgdispidNamedArgs = &amp;dispidNamed;<br />
&nbsp;&nbsp;&nbsp; }<br />
<br />
&nbsp;&nbsp;&nbsp; // Make the call!<br />
&nbsp;&nbsp;&nbsp; hr = pDisp-&gt;Invoke(dispID, IID_NULL, LOCALE_SYSTEM_DEFAULT, autoType, &amp;dp, pvResult, NULL, NULL);<br />
&nbsp;&nbsp;&nbsp; if(FAILED(hr)) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sprintf(buf, &quot;IDispatch::Invoke(\&quot;%s\&quot;=%08lx) failed w/err 0x%08lx&quot;, szName, dispID, hr);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MessageBox(NULL, buf, &quot;AutoWrap()&quot;, 0x10010);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_exit(0);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return hr;<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; // End variable-argument section...<br />
&nbsp;&nbsp;&nbsp; va_end(marker);<br />
<br />
&nbsp;&nbsp;&nbsp; delete [] pArgs;<br />
<br />
&nbsp;&nbsp;&nbsp; return hr;<br />
}<br />
<br />
程序在WINDOWS2000+EXCEL2000环境下运行良好,呵呵<br />
收工,手都酸了(看来得弄个C++转HTML的软件用用了,手工着色真的很辛苦啊)。<br />
发表于 2005-09-25 11:11 阿智 阅读(6844) 评论(26)&nbsp;&nbsp;编辑 收藏 引用<br />
 <br />
评论<br />
# re: 纯 C++ 代码创建并保存 EXCEL 文件<br />
这BLOG的编辑器有代码高亮的功能啊,插入代码就行了。<br />
cpunion 评论于 2005-09-25 13:41&nbsp;&nbsp;回复&nbsp;&nbsp;更多评论&nbsp;&nbsp;&nbsp; <br />
# re: 纯 C++ 代码创建并保存 EXCEL 文件<br />
不是吧?<br />
我的代码都是贴过来的啊,怎么没见自动着色啊?<br />
难道是我菜?怪了?!<br />
阿智 评论于 2005-09-25 14:30&nbsp;&nbsp;回复&nbsp;&nbsp;更多评论&nbsp;&nbsp;&nbsp; <br />
# re: 纯 C++ 代码创建并保存 EXCEL 文件<br />
编辑器上面工具栏按钮中有个按钮,上面有“代码”二字,速度稍慢,不过还可以。<br />
cpunion 评论于 2005-09-25 16:56&nbsp;&nbsp;回复&nbsp;&nbsp;更多评论&nbsp;&nbsp;&nbsp; <br />
# re: 纯 C++ 代码创建并保存 EXCEL 文件<br />
哦,明白了,下次一定注意了:)<br />
谢谢大哥哈~```<br />
阿智 评论于 2005-09-25 17:14&nbsp;&nbsp;回复&nbsp;&nbsp;更多评论&nbsp;&nbsp;&nbsp; <br />
# re: 纯 C++ 代码创建并保存 EXCEL 文件<br />
这些代码MSDN上都有,一模一样!<br />
unknown 评论于 2005-12-20 18:57&nbsp;&nbsp;回复&nbsp;&nbsp;更多评论&nbsp;&nbsp;&nbsp; <br />
# re: 纯 C++ 代码创建并保存 EXCEL 文件<br />
学习~ 谢谢<br />
小银子 评论于 2006-04-13 10:44&nbsp;&nbsp;回复&nbsp;&nbsp;更多评论&nbsp;&nbsp;&nbsp; <br />
# re: 纯 C++ 代码创建并保存 EXCEL 文件<br />
如何设置内容格式?对齐方式?颜色等等?<br />
asdf 评论于 2006-06-05 09:27&nbsp;&nbsp;回复&nbsp;&nbsp;更多评论&nbsp;&nbsp;&nbsp; <br />
# re: 纯 C++ 代码创建并保存 EXCEL 文件<br />
如果要设置内容格式、对齐方式、颜色等。<br />
可以查阅 OFFICE 联机帮助,找 RANGE、CELL、SELECTION 等对象的属性以及方法。<br />
不过本人不推荐使用这种方式来对 EXCEL 进行比较复杂的操作。<br />
azhi 评论于 2006-06-05 11:26&nbsp;&nbsp;回复&nbsp;&nbsp;更多评论&nbsp;&nbsp;&nbsp; <br />
# re: 纯 C++ 代码创建并保存 EXCEL 文件<br />
如何用C++语言对图表进行操作,如用折线图或是饼状图来显示数据。<br />
spedit 评论于 2006-06-09 19:35&nbsp;&nbsp;回复&nbsp;&nbsp;更多评论&nbsp;&nbsp;&nbsp; <br />
# re: 纯 C++ 代码创建并保存 EXCEL 文件<br />
这个范例只是简单的示范了如何创建EXCEL文件和保存。如果想做更多对象的操作,也同样是支持的,但前提是你必须知道接口的名称及接口提供的各种属性和方法,比如图表是 IChart(好象是吧)等,你都可以这样做。<br />
<br />
其实这个范例也是一个COM后绑定操作的示范,关键就在 AutoWrap 函数了,这个函数虽然具有通用性,但是大量使用这个函数会影响程序的效率。<br />
azhi 评论于 2006-06-10 09:38&nbsp;&nbsp;回复&nbsp;&nbsp;更多评论&nbsp;&nbsp;&nbsp; <br />
# re: 纯 C++ 代码创建并保存 EXCEL 文件<br />
能不能给一个示例.<br />
spedit 评论于 2006-06-12 12:16&nbsp;&nbsp;回复&nbsp;&nbsp;更多评论&nbsp;&nbsp;&nbsp; <br />
# re: 纯 C++ 代码创建并保存 EXCEL 文件<br />
过段时间吧,最近很忙!!!<br />
等清闲点,我再贴篇教程~```<br />
azhi 评论于 2006-06-15 08:28&nbsp;&nbsp;回复&nbsp;&nbsp;更多评论&nbsp;&nbsp;&nbsp; <br />
# re: 纯 C++ 代码创建并保存 EXCEL 文件<br />
不错的程序,我也学习一下。<br />
虚拟主机 评论于 2006-06-19 17:33&nbsp;&nbsp;回复&nbsp;&nbsp;更多评论&nbsp;&nbsp;&nbsp; <br />
# re: 纯 C++ 代码创建并保存 EXCEL 文件<br />
hr = CoInitialize(NULL);<br />
if(FAILED(hr))<br />
{MessageBox(&quot;组件初始化失败!&quot;);<br />
return false;<br />
}<br />
<br />
hr = CoInitializeSecurity(NULL,-1, NULL, NULL,RPC_C_AUTHN_LEVEL_DEFAULT,RPC_C_IMP_LEVEL_IDENTIFY, NULL, 0,NULL);<br />
COSERVERINFO ServerInfo={0,L&quot;administator&quot;,NULL,0};<br />
MULTI_QI MultiQi={&amp;IID_IUnknown,NULL,NOERROR};<br />
hr=CoCreateInstanceEx(CLSID_Account,NULL,CLSCTX_REMOTE_SERVER,&amp;ServerInfo,1,&amp;MultiQi);<br />
if(FAILED(hr))<br />
{<br />
MessageBox(&quot;创建对象实例失败!&quot;);<br />
return false;<br />
}<br />
按以上步骤进行com对象的创建却老是提示创建对象失败。各位指导一下,谢谢
游客请输入验证码
浏览1941058次