读取excel

Excel数据读取

HRESULT CreadexcleDlg::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(_T("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);
  CString err;
  err.Format(_T("%s"), buf);
  MessageBox(err);
  _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);
  CString err;
  err.Format(_T("%s"), buf);
  MessageBox(err);
  _exit(0);
  return hr;
 }
 // End variable-argument section...
 va_end(marker);
 delete [] pArgs;
 return hr;
}

//处理所有Excel数据,并把所有数据加入到一个二维数组中
const int  MAX_ROW_NUM = 1000;
const int MAX_COL_NUM = 5;
void CreadexcleDlg::ProcessExcelData()
{
 //初始化com库,必须加上
 CoInitialize(NULL);

 // 获得EXCEL的CLSID
 CLSID clsid;
 HRESULT hr = CLSIDFromProgID(L"Excel.Application", &clsid);
 if(FAILED(hr))
 {
  MessageBox(_T("CLSIDFromProgID() 函数调用失败!"));
  return;
 }

 // 创建实例
 IDispatch *pXlApp;
 hr = CoCreateInstance(clsid, NULL, CLSCTX_LOCAL_SERVER, IID_IDispatch, (void **)&pXlApp);
 if(FAILED(hr))
 {
  MessageBox(_T("请检查是否已经安装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 = _T("D://maliling//C++//readexcle//readexcle//语言.xls");  //Excel表完整路径
 

 // 调用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;
 }

 // 从Application.ActiveSheet属性获得Worksheet对象
 IDispatch *pXlSheet;
 {
  VARIANT result;
  VariantInit(&result);
  AutoWrap(DISPATCH_PROPERTYGET, &result, pXlApp, L"ActiveSheet", 0);
  pXlSheet = result.pdispVal;
 }

 // 选择一个MAX_ROW_NUM*MAX_COL_NUM大小的Range
 IDispatch *pXlRange;
 {
  VARIANT parm;
  parm.vt = VT_BSTR;
  parm.bstrVal = ::SysAllocString(L"A1:P1000");

  VARIANT result;
  VariantInit(&result);
  AutoWrap(DISPATCH_PROPERTYGET, &result, pXlSheet, L"Range", 1, parm);
  VariantClear(&parm);
  pXlRange = result.pdispVal;
 }


 //用来保存信息的数组
 VARIANT arr;
 arr.vt = VT_ARRAY | VT_VARIANT;
 SAFEARRAYBOUND sab[2];
 sab[0].lLbound = 1; sab[0].cElements = MAX_ROW_NUM;
 sab[1].lLbound = 1; sab[1].cElements = MAX_COL_NUM;
 arr.parray = SafeArrayCreate(VT_VARIANT, 2, sab);
 // 用这个Range读取数据
 AutoWrap(DISPATCH_PROPERTYGET, &arr, pXlRange, L"Value",0);

 CString strTmp;   //临时变量,保存单元格数据中的CString型
 double dblTmp;   //临时变量,保存单元格数据中的double型
 int iTmp;

 int row_num = 0;
 do
 {
  VARIANT tmp;
  tmp.vt = VT_BSTR;

  long indices[] = {row_num+1,1};
  SafeArrayGetElement(arr.parray, indices, (void *)&tmp);  
  if(tmp.vt == VT_BSTR)
  {
   strTmp=tmp.bstrVal;
   if(strTmp == _T("end"))
   {
    break;
   }   
  }  
  
  ++row_num;
  

 }while(true);


 CString** m_strArray = new CString*[row_num];

 int i,j;  //用来循环
 for(i=1; i<=row_num; i++)
 {
  m_strArray[i-1] = new CString[MAX_COL_NUM];
  for(j=1; j<=MAX_COL_NUM; 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;
    WCHAR xx = *(tmp.bstrVal);
   }
   else if(tmp.vt==VT_R8)
   {
    dblTmp=tmp.dblVal;
    iTmp = dblTmp;
    strTmp.Format(_T("%d"),iTmp);
   }
   else if(tmp.vt==VT_NULL)
   {
    strTmp="";
   }
   //_bstr_t str1=strTmp;
   //WCHAR *str2=strTmp;
   m_strArray[i-1][j-1]=strTmp;
  }
 }
 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();
 WriteXml(m_strArray, row_num, MAX_COL_NUM);

 for(int i=0; i<row_num; i++)
 {
  delete[] m_strArray[i];
 }

 delete[] m_strArray;
}
//
//<?xml version="1.0" encoding="utf-8"?>
//<ResStringEditor ExportDir="E:/CE Project/工程项目/Tcc7901/ResDll">
//<Languages Count="3">
//<Language>简体中文</Language>
//<Language>繁体中文</Language>
//<Language>英语</Language>
//</Languages>
//<StringList Count="387">
//<String ID="1017" Name="IDSF_TIME_HHMM">
//<STR>%02d:%02d</STR>
//<STR>%02d:%02d</STR>
//<STR>%02d:%02d</STR>
//</String>

const CString XML_HEADER = _T("?xml version=/"1.0/" encoding=/"utf-8/"?");
const CString LANGS_LABEL = _T("Languages");
const CString LANG_LABEL = _T("Language");
const CString COUNT = _T("Count");
const CString EQUAL_CHARA = _T("=");
const CString INVERT_COMMA = _T("/"");
const CString BLANK_LABEL = _T(" ");
const CString LAN_NUM = _T("3");
const CString BRAKET_BEGIN = _T("<");
const CString BRAKET_END = _T(">");
const CString BACKSLASH = _T("/");
const CString STR_LABEL = _T("STR");
const CString ID_LABEL = _T("ID");
const CString NAME_LABEL = _T("Name");
const CString STR_LIST = _T("StringList");
const CString STRING_LABEL = _T("String");
const CString EXPORT_DIR = _T(" ExportDir=/"E://CE Project//工程项目//Tcc7901//ResDll/"");
const CString RESSTRINGEDITOR = _T("ResStringEditor");
const CString LINE_LABEL = _T("/n");

void CreadexcleDlg::WriteXml(CString** strArray, int row, int col)
{
 //char* old_locale = _strdup( setlocale(LC_CTYPE,NULL) );
 //setlocale( LC_CTYPE, "chs" );//设定

 CStdioFile  File;
 if(!File.Open("D://maliling//C++//readexcle//readexcle//语言.xml",CStdioFile::modeCreate|CStdioFile::modeReadWrite))//如果文件事先不存在的话,就需要CFile::modeCreate,否则就不需要。
 {
  MessageBox(_T("Open file fails."));
  return;
 }

 File.WriteString(BRAKET_BEGIN);
 File.WriteString(XML_HEADER);
 File.WriteString(BRAKET_END);
 File.WriteString(LINE_LABEL);

 File.WriteString(BRAKET_BEGIN);
 File.WriteString(RESSTRINGEDITOR);
 File.WriteString(EXPORT_DIR);
 File.WriteString(BRAKET_END);
 File.WriteString(LINE_LABEL);

 File.WriteString(BRAKET_BEGIN);
 File.WriteString(LANGS_LABEL);
 File.WriteString(BLANK_LABEL);
 File.WriteString(COUNT);
 File.WriteString(EQUAL_CHARA);
 File.WriteString(LAN_NUM);
 File.WriteString(BRAKET_END);
 File.WriteString(LINE_LABEL);


 File.WriteString(BRAKET_BEGIN);
 File.WriteString(STR_LIST);
 File.WriteString(BLANK_LABEL);
 File.WriteString(COUNT);
 File.WriteString(EQUAL_CHARA);
 CString str;
 str.Format(_T("%d"), row-1);
 File.WriteString(str);
 File.WriteString(BRAKET_END);
 File.WriteString(LINE_LABEL);

 for(int j=2; j<col; j++)
 {
  File.WriteString(BRAKET_BEGIN);
  File.WriteString(LANG_LABEL);
  File.WriteString(BRAKET_END);
  File.WriteString(strArray[0][j]);
  File.WriteString(BRAKET_BEGIN);
  File.WriteString(BACKSLASH);
  File.WriteString(LANG_LABEL);
  File.WriteString(BRAKET_END);
  File.WriteString(LINE_LABEL);
 }

 
 File.WriteString(BRAKET_BEGIN);
 File.WriteString(BACKSLASH);
 File.WriteString(LANGS_LABEL);
 File.WriteString(BRAKET_END);
 File.WriteString(LINE_LABEL);


 
 for(int i=1; i<row; i++)
 {
  File.WriteString(BRAKET_BEGIN);
  File.WriteString(STRING_LABEL);
  File.WriteString(BLANK_LABEL);
  File.WriteString(ID_LABEL);
  File.WriteString(EQUAL_CHARA);
  File.WriteString(INVERT_COMMA);
  File.WriteString(strArray[i][0]);
  File.WriteString(INVERT_COMMA);
  File.WriteString(BLANK_LABEL);
  File.WriteString(NAME_LABEL);
  File.WriteString(EQUAL_CHARA);
  File.WriteString(INVERT_COMMA);
  File.WriteString(strArray[i][1]);
  File.WriteString(INVERT_COMMA);
  File.WriteString(BRAKET_END);
  File.WriteString(LINE_LABEL);

  for(int j=2; j<col; j++)
  {
   File.WriteString(BRAKET_BEGIN);
   File.WriteString(STR_LABEL);
   File.WriteString(BRAKET_END);
   File.WriteString(strArray[i][j]);
   File.WriteString(BRAKET_BEGIN);
   File.WriteString(BACKSLASH);
   File.WriteString(STR_LABEL);
   File.WriteString(BRAKET_END);
   File.WriteString(LINE_LABEL);
  }

  File.WriteString(BRAKET_BEGIN);
  File.WriteString(BACKSLASH);
  File.WriteString(STRING_LABEL);
  File.WriteString(BRAKET_END);
  File.WriteString(LINE_LABEL);
 }

 File.WriteString(BRAKET_BEGIN);
 File.WriteString(BACKSLASH);
 File.WriteString(STR_LIST); 
 File.WriteString(BRAKET_END);
 File.WriteString(LINE_LABEL);


 File.WriteString(BRAKET_BEGIN);
 File.WriteString(BACKSLASH);
 File.WriteString(RESSTRINGEDITOR);
 File.WriteString(BRAKET_END);
 File.WriteString(LINE_LABEL);

 File.Close();

 //setlocale( LC_CTYPE, old_locale );
 //free( old_locale );//还原区域设定

 /*std::fstream f;
 f.open("D://maliling//C++//readexcle//readexcle//1.xml", std::ios::out);
 if(!f)//判断是否成果开的文件
 {
  MessageBox(_T("Open file fails."));
 }
 else
 {

  f << BRAKET_BEGIN;
  f << XML_HEADER;
  f << BRAKET_END;
  f << LINE_LABEL;

  f << BRAKET_BEGIN;
  f << EXPORT_DIR;
  f << BRAKET_END;
  f << LINE_LABEL;

  f << BRAKET_BEGIN;
  f << LANGS_LABEL;
  f << BLANK_LABEL;
  f << COUNT;
  f << EQUAL_CHARA;
  f << LAN_NUM;
  f << BRAKET_END;
  f << LINE_LABEL;

  for(int j=2; j<col; j++)
  {
   f << BRAKET_BEGIN;
   f << LANG_LABEL;
   f << BRAKET_END;
   f << strArray[0][j];
   f << BRAKET_BEGIN;
   f << BACKSLASH;
   f << LANG_LABEL;
   f << BRAKET_END;
   f << LINE_LABEL;
  }

  f << BRAKET_BEGIN;
  f << BACKSLASH;
  f << LANGS_LABEL;
  f << BRAKET_END;
  f << LINE_LABEL;

  for(int i=0; i<row; i++)
  {
   for(int j=0; j<col; j++)
   {
   }
  }
  
  f.close();
 }*/
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值