C++ Builder ADOQuery将数据导出EXCEL 不能执行第二次导出,求助

C520CC 2014-08-22 04:15:02
简单说明:
我用的控件是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表删除,再次执行“导出”,还是报同样的错误。

求解:如何才能让其可以执行多次执行导出。
...全文
249 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
C520CC 2014-09-04
  • 打赏
  • 举报
回复
解决了,我是这样解决的,将文件的地址写确定了,而不是自动得到地址的函数,如图:

改为:
AnsiString StrFileName="C:\\trpt\\muban1.xls";//过渡表
AnsiString StrFileName1="C:\\trpt\\muban.xls"; //模板
即可!每次导出都将覆盖上次导出的文件。

谢谢回复我的两位兄台。
sczyq 2014-08-26
  • 打赏
  • 举报
回复
ExcelApp.OleFunction("Quit");//退出Excel ExcelApp = NULL; // 还要紧跟这一行, 必须的
宝龙哥 2014-08-23
  • 打赏
  • 举报
回复
这个是这样,要在最后加入:
 
   // 结束,如果没有如下代码,EXCEL线程直到应用程序退出才结束
    Variant Axl,Workbook,AxSheet,nms,bef,aft;
    Axl=Unassigned;
    Workbook=Unassigned;
    AxSheet=Unassigned;
    bef=Unassigned;
    aft=Unassigned;
    nms=Unassigned;
C520CC 2014-08-23
  • 打赏
  • 举报
回复
没有人理我吗?

1,178

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder 数据库及相关技术
社区管理员
  • 数据库及相关技术社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧