描述:
被要求用C++导出一个已存在的EXCEL文件,字段间用,分隔,并保存为同名的.TXT
其间,并非所有字段都要保存,如
A列,在字段前加IDC_保存,B-G按原数据保存,H-O无需保存,P到末(可能为AP)按原数据保存~~~
本姑娘C++编程弱弱~~~转换的注意点,流程,细节都不知道在哪里~~~如果有源码能一并附上更好~~谢谢各位啦!
解决方案1:
从Excel中读取内容生成文本的源码(原创):
// OLE Variant for Optional.
COleVariant VOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR);
_Application objApp;
_Workbook objBook;
Workbooks objBooks;
Worksheets objSheets;
_Worksheet objSheet;
Comments comments;
Comment comment;
Range objRange;
VARIANT ret;
// Instantiate Excel and open an existing workbook.
objApp.CreateDispatch("Excel.Application");
objBooks = objApp.GetWorkbooks();
objBook = objBooks.Open(SourcePath,
VOptional, VOptional, VOptional, VOptional,
VOptional, VOptional, VOptional, VOptional,
VOptional, VOptional, VOptional, VOptional);
objSheets = objBook.GetWorksheets();
int SheetsCount=objSheets.GetCount();//这里获得了sheet的数目,这里应当有一个循环,读取所有的sheet
FILE *fp;
if( access(TargetPath,0)==-1 )
fp=fopen(TargetPath,"wt");
else
fp=fopen(TargetPath,"wt");
for(int sheet=1;sheet<=SheetsCount;sheet++){//注意:从1开始。
objSheet = objSheets.GetItem(COleVariant((short)sheet));
//开始把每一行转换为一个单独的记录,记录中的字段有用户指定
objRange = objSheet.GetUsedRange();//这里获得所有的已用的Cells
ret = objRange.GetValue();
if(ret.vt == VT_EMPTY) continue;
//Create the SAFEARRAY from the VARIANT ret.
COleSafeArray sa(ret);
//Determine the array's dimensions.
//获得表格总的的行数和列数
long lNumRows;
long lNumCols;
sa.GetUBound(1, &lNumRows);
sa.GetUBound(2, &lNumCols);
//定义处理每行时要用到的变量
Range objRange_curLine;
VARIANT ret_curLine;
//获得本行的行数和列数
long lNumRows_curLine;
long lNumCols_curLine;
//Display the elements in the SAFEARRAY.
long index[2];
VARIANT val;
int r, c;
//按行处理
for(r=1;r<=lNumRows;r++)
{
//写入记录开始符号
fprintf(fp,"%s",RecFlag);
fprintf(fp,"\n");
CString contents;
bool bEmpty=true;
CString sText, sType, sTemp;
CString sTitle;
bool bText;
int nCount = RecNames.GetSize();
CString sRecName;
for (int i=0; i<nCount; i++)
{
//写入字段名
if(fp){
fprintf(fp,"<%s>=",RecNames[i]);
}
CString contents;
for(int k=0;k<RecContents[i].GetSize();k++)
{
sType = RecContents[i][k];
if (CCELTools::IsFieldName(sType)) // 不是字段名
{
sType = sType.Mid(1, sType.GetLength()-2);
//sRecName = RecNames[i]; //例如 sType="AC"
int len = sType.GetLength(); // len=2
char tail;
tail = sType.GetAt(len-1); // tail='C'
char tmp[8];
CString start=sType.GetAt(0); // start="AC"
itoa(r,tmp,10); // 例如 r=12
start+=tmp; // start="AC12"
CString end=sType;
end.SetAt(len-1,tail+1); // end="AD"
end+=tmp; // end="AD12"
objRange_curLine = objSheet.GetRange(COleVariant(start), COleVariant(end));
ret_curLine = objRange_curLine.GetValue();
if(ret_curLine.vt == VT_EMPTY) continue;
//Create the SAFEARRAY from the VARIANT ret.
COleSafeArray sa_curLine(ret_curLine);
//Determine the array's dimensions.
//获得指定的区域
sa_curLine.GetUBound(1, &lNumRows_curLine);
sa_curLine.GetUBound(2, &lNumCols_curLine);
//开始取出选中的区域的内容
long index[2];
VARIANT val;
int rr, cc;
for(rr=1;rr<=lNumRows_curLine;rr++)
{
bool bEmpty=true;
for(cc=1;cc<lNumCols_curLine;cc++)//注意不要用cc<=lNumCols_curLine
{
index[0]=rr;
index[1]=cc;
sa_curLine.GetElement(index, &val);
switch(val.vt)
{
case VT_BOOL:
{
bool flag=val.boolVal;
if(flag==true) contents+="TRUE ";
else contents+="FALSE ";
bEmpty=false;
break;
}
case VT_R4://VT_UI4://unsigned long
{
unsigned long value=val.ulVal;//.fltVal;//.ulVal;
char buffer[30];
_ui64toa(value,buffer,10);
contents+=buffer;
bEmpty=false;
contents+=" ";//tab
break;
}
case VT_R8://数字
{
//fprintf(fp,"%1.2f",val.dblVal);
float value=val.dblVal;
char buffer[20];
//_ui64toa(value,buffer,10);
sprintf(buffer,"%f",value);
CString tmp=buffer;
int dot=tmp.Find('.');
CString Left=tmp.Left(dot);
tmp=tmp.Mid(dot+1);
if(tmp=="000000") contents+=Left;
else contents+=buffer;
//contents+=(CString)value;
bEmpty=false;
//if(1==cc) Ar=contents.GetLength();
contents+=" ";//tab
break;
}
case VT_BSTR://文字
{
contents+=(CString)val.bstrVal;
//if(1==cc) Ar=contents.GetLength();
contents+=" ";//tab
bEmpty=false;
break;
}
default: break;
}//end of switch
}//end of col
}
//结束处理选中的区域内容
}
}
if(fp){
fprintf(fp,"%s",contents);
fprintf(fp,"\n");
}
}//完成一条记录
}//结束行的处理
//结束处理
}//end of deal with different sheet.
if(fp) fclose(fp);
objBook.Close(COleVariant((short)FALSE), VOptional, VOptional);
objApp.Quit();