C++ Builder ADOQuery将数据导出EXCEL 不能执行第二次导出,求助
简单说明:
我用的控件是ADOQuery.DBGrid,ADOConnection,DataSource,SaveDialog
准备了两个文件夹,一个是trpt,专门放Excel模板(muban.xls,运行程序前已经存在,将字段名字提前写好了,只有一个sheet),与中间过渡桥梁的EXCEL表(muban1.xls,程序运行过程中产生);
另一个文件夹是Report,用来存放最终的Excel表(jieguo.xls,此表的路径及名字是在SaveDialog中设置的,程序运行过程中产生)。
void __fastcall TForm28::BtnExportClick(TObject *Sender)
{
AnsiString strRowTemp;
AnsiString StrFileName=GetCurrentDir()+"\\trpt\\muban1.xls";//过渡表
AnsiString StrFileName1=GetCurrentDir()+"\\trpt\\muban.xls"; //模板
AnsiString StrFileName2;//结果表
bool save_st=true;
if(save_st==true)
{
if(!CopyFile(StrFileName1.c_str(),StrFileName.c_str(),false)){
Application->MessageBox("复制文件操作失败,Excel文件可能正在使用中!","错误",MB_ICONSTOP|MB_OK);
return;
}
if(!FileExists(StrFileName)){
MessageBox(Handle,"Excel文件 muban1.xls 不存在!","信息提示",MB_OK);
return;
}
}
Variant ExcelApp; //对象
Variant WorkBook1; //工作薄
Variant WorkSheet1,WSH[255]; //工作表
try
{
ExcelApp=Variant::CreateObject("Excel.Application");
}
catch(...)
{
MessageBox(Handle,"无法启动Excel!","信息提示",MB_ICONSTOP|MB_OK);
return;
}
ExcelApp.OlePropertySet("Visible",false);//设置Excel为不可见
//打开指定的Excel文件,文件中最好只设定一个Sheet
ExcelApp.OlePropertyGet("WorkBooks").OleProcedure("Open",StrFileName.c_str());
WorkBook1=ExcelApp.OlePropertyGet("ActiveWorkBook");
WorkSheet1=WorkBook1.OlePropertyGet("ActiveSheet");//获得当前默认的Sheet
ADOQuery1->Open();
ADOQuery1->First();
int iCols,iRows;//记录列数和行数
iRows=2;//因为第一行是字段名称,所以从第二行开始记录数据
int iRowsCount = StrToInt(StatusBar1->Panels->Items[1]->Text) ;
int Count= iRowsCount+1; //导出的Excel表的行数
//循环取字段的数据放到Excel表对应的行列中
for(iRows=2;iRows<=Count;iRows++) //行
{
for(iCols=1;iCols<=69;iCols++) //列
{
strRowTemp = ADOQuery1->Fields->Fields[iCols-1]->AsString;
WorkSheet1.OlePropertyGet("Cells",iRows,iCols).OlePropertySet("Value",strRowTemp.c_str());
}
if(ADOQuery1->RecNo!=ADOQuery1->RecordCount)
ADOQuery1->Next();
}
ADOQuery1->Close();
WorkBook1.OleProcedure("Save");//保存表格
WorkBook1.OleProcedure("Close");//关闭表格
ExcelApp.OleFunction("Quit");//退出Excel
if(SaveDialog1->Execute())
{ StrFileName2=SaveDialog1->FileName+".xls";
if(!CopyFile(StrFileName.c_str(),StrFileName2.c_str(),false))
{
Application->MessageBox("复制文件操作失败,Excel文件可能正在使用中!","错误",MB_ICONSTOP|MB_OK);
return;
}
}
}
第一次执行,在report文件夹中可以得到想要的结果表。
但是再次执行“导出”,弹出MessageBox("复制文件操作失败,Excel文件可能正在使用中!","错误",MB_ICONSTOP|MB_OK)。并不再执行导出程序。
将muban1.xls表与jieguo.xls表删除,再次执行“导出”,还是报同样的错误。
求解:如何才能让其可以执行多次执行导出。