/*****************************************************************
** 函数名:DBGridToExcel
** 输 入:TDBGrid *,AnsiString *
** TDBGrid *:数据来源。
** AnsiString *:Excel模板文件名
** 输 出: void
** x 为 1, 表示...
** x 为 0, 表示...
** 功能描述: 将DBGrid的结果输出到指定目录下的指定文件中。
** 全局变量: 无
** 调用模块: 无
** 作 者: Wing
** 日 期: 2004-04-02
** 修 改:
** 日 期:
** 版本 1.0
****************************************************************/
//---------------------------------------------------------------------------
#include "ComObj.hpp"
#define PG OlePropertyGet
#define PS OlePropertySet
#define FN OleFunction
#define PR OleProcedure
//----------------------------
void DBGridToExcel(TDBGrid *DBGrid,AnsiString strPath)
{
Screen->Cursor=crHourGlass;
//通过调用函数将DBGrid的内容输出到Excel中。
TDataSet *dsDS=DBGrid->DataSource->DataSet;
if(dsDS->RecordCount==0)
{
Application->MessageBox("没有可以导出的数据!/r/n导出数据操作将会提早结束。","提示",IDOK);
Screen->Cursor=crDefault;
return;
}
AnsiString strMessage="报表模板文件:/n/r"+strPath+"/r/n不存在,无法打开";
if(!FileExists(strPath))
{
Application->MessageBox(strMessage.c_str(),"错误",MB_ICONSTOP|MB_OK);
Screen->Cursor=crDefault;
return;
}
//Application->MessageBoxA("导出数据可能需要一段时间,请稍等。","提示",0);
Variant Ex,Wb,Sh1,Range1;
AnsiString EReport=ExtractFilePath(Application->ExeName)+"EReport//AReport"+FormatDateTime("yyyymmddhhnnsszzz",Now())+".xls";
if(FileExists(EReport))
{
AnsiString strT="报表文件:/r/n"+(AnsiString)EReport+"/r/n已存在,确定后打开";
Application->MessageBox(strT.c_str(),"提示",MB_ICONINFORMATION|MB_OK);
//通过OLE找开已存在的报表文件.
try
{
HWND hPrevApp = ::FindWindow(NULL,"Microsoft Excel");
if(!hPrevApp)
{
Ex=Variant::CreateObject("Excel.Application");
}
else
{
Ex=Variant::GetActiveObject("Excel.Application");
}
}
catch(...)
{
Application->MessageBox("无法启动Excel,请确定已正确安装MS OFFICE!","错误",MB_ICONSTOP|MB_OK);
Screen->Cursor=crDefault;
return;
}//End try
// Ex.OlePropertySet("Visible",true);
Ex.OlePropertyGet("WorkBooks").PR("Open",EReport.c_str());
} //End Opend exists file
else //报表不存在,复制模板文件并产生报表.
{
if(CopyFile(strPath.c_str(),EReport.c_str(),1)==0) //复制模板
{
ShowMessage("复制模板失败,请重试.");
Screen->Cursor=crDefault;
return;
}
try
{
HWND hPrevApp = ::FindWindow(NULL,"Microsoft Excel");
if(!hPrevApp)
{
Ex=Variant::CreateObject("Excel.Application");
}
else
{
Ex=Variant::GetActiveObject("Excel.Application");
}
}
catch(...)
{
Application->MessageBox("无法启动Excel,请确定已正确安装MS OFFICE!","错误",MB_ICONSTOP|MB_OK);
Screen->Cursor=crDefault;
return;
}//End try
Ex.OlePropertyGet("WorkBooks").PR("Open",EReport.c_str());
Wb=Ex.PG("ActiveWorkBook"); // 请尝试改名。
Sh1=Wb.PG("ActiveSheet");
int columns=DBGrid->DataSource->DataSet->FieldCount;
int iRow=10,iCol=0;
for(;iCol<columns;iCol++) //写字段名。
{
Sh1.PG("Cells",iRow,iCol+1).PS("Value",DBGrid->Columns->Items[iCol]->Title->Caption.c_str());
}
DBGrid->DataSource->DataSet->DisableControls();
iRow=11; //在这个位置开始写Excel.
try
{
int RecCount=1;
/* WProgress->Show();
WProgress->ProgressBar1->Position=0;*/
for(dsDS->First();!dsDS->Eof;dsDS->Next(),iRow++) //将查询到的记录依次写到工作薄中.
{
for(iCol=0;iCol<columns;iCol++)
{
Sh1.PG("Cells",iRow,iCol+1).PS("Value",dsDS->Fields->Fields[iCol]->AsString.c_str());
/* WProgress->ProgressBar1->Position=int(RecCount*100/dsDS->RecordCount);
WProgress->Label1->Caption=IntToStr(WProgress->ProgressBar1->Position);*/
Application->ProcessMessages();
}
RecCount++;
}
// WProgress->Close();
/*
Sh1.OlePropertyGet("Range", "A12:C10").OleProcedure("Select");
Range1 = Ex.OlePropertyGet("Selection");
//Range1 = Sh1.OlePropertyGet("Selection");
Range1.OlePropertySet("Borders","xlEdgeLeft");
Range1.OlePropertySet("LineStyle","xlThin");
Range1.OlePropertySet("ColorIndex","xlAutomatic");*/
}
catch(...)
{
Application->MessageBox("导出过程出现错误!操作将停止。请尝试重新执行操作。/n/r如果问题继续存在,请联系开发人员。","严重错误",MB_ICONSTOP|MB_OK);
DBGrid->DataSource->DataSet->EnableControls();
Ex=Unassigned;
Wb=Unassigned;
Sh1=Unassigned;
Screen->Cursor=crDefault;
DBGrid->DataSource->DataSet->EnableControls();
return;
}
Wb.PR("Save");
Ex.OlePropertySet("Visible",(Variant)true);
}//end else
Screen->Cursor=crDefault;
DBGrid->DataSource->DataSet->EnableControls();
}
bcb}有关DBGRID导出到EXCEL问题
最新推荐文章于 2021-12-31 22:28:48 发布