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();
}*/
}