经常看到有网友发帖子询问如何将DBGrid中的内容导出到Excel或Word文档中,于是笔者花了点时间写了以下两个函数,分别实现将DBGrid 中数据导出到Word和Excel文档。需要注意的是DBGrid中的数据并不代表数据库中所有的数据,因为数据集在打开的时候有可能进行了筛选,取决于 使用者如何打开这个数据集,总之就是DBGrid中显示多少数据,就导出多少。
一、将DBGrid中的内容导出到Word文档
//---------------------------------------------------------------------------
//将DBGrid中的数据导出到Word文档
//---------------------------------------------------------------------------
void__fastcall DBGrid2Word(TDBGrid*dbg, String strDocFile)
{
if(!dbg->DataSource->DataSet->Active)//数据集没有打开就返回
return;
Variant vWordApp, vTable, vCell;
try
{
vWordApp=Variant::CreateObject("Word.Application");
}
catch(...)
{
MessageBox(0,"启动 Word 出错, 可能是没有安装Word.","DBGrid2Word", MB_OK|MB_ICONERROR);
vWordApp=Unassigned;
return;
}
//隐藏Word界面
vWordApp.OlePropertySet("Visible",false);
//新建一个文档
vWordApp.OlePropertyGet("Documents").OleFunction("Add");
Variant vSelect=vWordApp.OlePropertyGet("Selection");
//设置一下字体,大小
vSelect.OlePropertyGet("Font").OlePropertySet("Size", dbg->Font->Size);
vSelect.OlePropertyGet("Font").OlePropertySet("Name", dbg->Font->Name.c_str());
//要插入表格的行数
intnRowCount(dbg->DataSource->DataSet->RecordCount+1);
nRowCount=nRowCount<2?2: nRowCount;
//要插入表格的列数
intnColCount(dbg->Columns->Count);
nColCount=nColCount<1?1: nColCount;
//在Word文档中插入与DBGrid行数列数基本相同的一个表格
vWordApp.OlePropertyGet("ActiveDocument").OlePropertyGet("Tables").OleProcedure("Add",
vSelect.OlePropertyGet("Range"),
nRowCount,//行数
nColCount,//列数
1,//DefaultTableBehavior:=wdWord9TableBehavior
0);//AutoFitBehavior:=wdAutoFitFixed
//操作这个表格
vTable=vWordApp.OlePropertyGet("ActiveDocument").
OleFunction("Range").OlePropertyGet("Tables").OleFunction("Item",1);
//设置单元格的宽度
for(inti=0; i<nColCount; i++)
{
intnColWidth=dbg->Columns->Items[i]->Width;
vTable.OlePropertyGet("Columns").OleFunction("Item", i+1)
.OlePropertySet("PreferredWidthType",3);//wdPreferredWidthPoints
vTable.OlePropertyGet("Columns").OleFunction("Item", i+1)
.OlePropertySet("PreferredWidth", nColWidth);
}
//先将列名写入Word表格
for(intj=0; j<dbg->Columns->Count; j++)
{
vCell=vTable.OleFunction("Cell",1, j+1);
vCell.OlePropertySet("Range", dbg->Columns->Items[j]->FieldName.c_str());
//列名单元格背景颜色//wdColorGray125
vCell.OlePropertyGet("Shading").OlePropertySet("BackgroundPatternColor",14737632);
}
//将DBGrid中的数据写入Word表格
dbg->DataSource->DataSet->First();
for(inti=0; i<nRowCount; i++)
{
//63 63 72 75 6E 2E 63 6F 6D
for(intj=0; j<dbg->Columns->Count; j++)
{
vCell=vTable.OleFunction("Cell", i+2, j+1);
vCell.OlePropertySet("Range",
dbg->DataSource->DataSet->FieldByName(
dbg->Columns->Items[j]->FieldName)->AsString.c_str());
}
dbg->DataSource->DataSet->Next();
}
//保存Word文档并退出
vWordApp.OlePropertyGet("ActiveDocument").OleProcedure("SaveAs", strDocFile.c_str());
vWordApp.OlePropertyGet("ActiveDocument").OleProcedure("Close");
Application->ProcessMessages();
vWordApp.OleProcedure("Quit");
Application->ProcessMessages();
vWordApp=Unassigned;
//工作结束
MessageBox(0,"DBGrid2Word 转换结束!","DBGrid2Word", MB_OK|MB_ICONINFORMATION);
}
二、将DBGrid中的内容导出到Excel文档
//***********
//***********
//模块名称 : 打印模块
//函数名称 : DBGrid2Excel
//函数功能 : 执行打印功能
//输入数值 : dgGrid, XlsPath+XlsFile
//输出数值 : xls文件
//返回数值 :
//***********
//注意事项 :
//***********
voidTfsForm::DBGrid2Excel(TDBGrid*dbg, String strXlsFile)
{
//判断是否已经存在,如果存在删除
if(FileExists(strXlsFile)!=false&&DeleteFile(strXlsFile)==false)
{
MessageBox(0,"导出途中请勿\n打开目标文件\n否则导出失败","Warning", MB_OK|MB_ICONERROR);
return;
}
//定义对象
intnIndex,yPos, xPos;
AnsiString Cell;
Variant ExcelMain=Unassigned;
Variant ExcelBook=Unassigned;
Variant ExcelPage=Unassigned;
//创建对象
try
{
ExcelMain=Variant::CreateObject("Excel.Application");
}
catch(...)
{
MessageBox(0,"启动 Excel 出错, 可能是没有安装Excel.","DBGrid2Excel", MB_OK|MB_ICONERROR);
return;
}
ExcelMain.OlePropertySet("Visible", False);
//新建一个工作表
ExcelBook=ExcelMain.OlePropertyGet("Workbooks").OleFunction("Add",1);//工作表
ExcelPage=ExcelMain.OlePropertyGet("ActiveWorkBook").OlePropertyGet("Sheets",1);
//设置标题
yPos=1;
xPos=1;
for(nIndex=0; nIndex<dbg->Columns->Count; nIndex+=1)
{
Cell=dbg->Columns->Items[nIndex]->Title->Caption;
ExcelMain.OlePropertyGet("Columns", xPos).OlePropertySet("ColumnWidth", dbg->Columns->Items[nIndex]->Width/6+1);
ExcelMain.OlePropertyGet("Cells", yPos, xPos).OlePropertySet("HorizontalAlignment",3);//居中
ExcelPage.OlePropertyGet("Cells", yPos, xPos).OlePropertySet("Value", Cell.c_str());
ExcelPage.OlePropertyGet("Cells", yPos, xPos).OlePropertyGet("Font").OlePropertySet("Color", RGB(0,0,255));
xPos+=1;
}
//查询数据
//while(qrAlarm->ControlsDisabled() == false) { qrAlarm->DisableControls(); }
for(dbg->DataSource->DataSet->First(), yPos=2; dbg->DataSource->DataSet->Eof==false; dbg->DataSource->DataSet->Next(), yPos+=1)
{
for(nIndex=0, xPos=1; nIndex<dbg->Columns->Count; nIndex+=1)
{
if(dbg->Columns->Items[nIndex]->Alignment==taLeftJustify)
{
ExcelMain.OlePropertyGet("Cells", yPos, xPos).OlePropertySet("HorizontalAlignment",2);//居左
}
if(dbg->Columns->Items[nIndex]->Alignment==taCenter)
{
ExcelMain.OlePropertyGet("Cells", yPos, xPos).OlePropertySet("HorizontalAlignment",3);//居中
}
if(dbg->Columns->Items[nIndex]->Alignment==taRightJustify)
{
ExcelMain.OlePropertyGet("Cells", yPos, xPos).OlePropertySet("HorizontalAlignment",4);//居右
}
ExcelPage.OlePropertyGet("Cells", yPos, xPos).OlePropertySet("Value", dbg->DataSource->DataSet->FieldByName(dbg->Columns->Items[nIndex]->FieldName)->AsString.c_str());
xPos+=1;
}
}
//保存Excel文档并退出
ExcelBook.OleProcedure("SaveAs",strXlsFile.c_str());
ExcelBook.OleFunction("Close");
ExcelMain.OleFunction("Quit");
ExcelMain=Unassigned;
ExcelBook=Unassigned;
ExcelPage=Unassigned;
//工作结束
MessageBox(0,"DBGrid2Excel 转换结束!","DBGrid2Excel", MB_OK|MB_ICONINFORMATION);
return;
}
三、EXCLE2DB:
c++builder EXCLE2DB 仅仅是一个框架,具体数据格式问题,和过滤检错问题,还要加强。
//***********
//modelname: 从EXCEL文件导入到数据库
//functionname : Excel2ADOQuery
//function : 从EXCEL文件导入到数据库
//input : adoqr, tableName, XlsPath+XlsFil
//output :
//return :
//***********
//attention :
//***********
DWORD WINAPI Excel2ADOQuery(TADOQueryadoqr,String tableName,String strXlsFile)
{
AnsiString query;
if(FileExists(strXlsFile)==false)
{
MessageBox(0,"请确定EXCLE文件是否存在\n导入途中请勿\n打开EXCLE文件\n否则导入失败","Warning", MB_OK|MB_ICONERROR);
return-1;
}
//定义对象
Variant ExcelMain=Unassigned;
Variant Wb=Unassigned;
Variant Sheet=Unassigned;
//创建对象
try
{
ExcelMain=Variant::CreateObject("Excel.Application");
}
catch(...)
{
MessageBox(0,"启动 Excel 出错, 可能是没有安装Excel.","DBGrid2Excel", MB_OK|MB_ICONERROR);
return-1;
}
//设置Excel为不可见
ExcelMain.OlePropertySet("Visible",false);
ExcelMain.OlePropertyGet("WorkBooks").OleProcedure("Open",strXlsFile.c_str());
Wb=ExcelMain.OlePropertyGet("ActiveWorkBook");
Sheet=Wb.OlePropertyGet("ActiveSheet");//获得当前默认的Sheet
//从excel导入数据
//得到工作表的行数和列数
intiCols,iRows;//记录列数和行数
iRows=(int) Sheet.OlePropertyGet("UsedRange").OlePropertyGet("Rows").OlePropertyGet("Count");
iCols=(int) Sheet.OlePropertyGet("UsedRange").OlePropertyGet("Columns").OlePropertyGet("Count");
for(introw=2;row<=iRows;row++)
{
adoqr->Append();
for(intcol=1;col<iCols;col++)
{//得到单元格的值
adoqr->Fields->Fields[col]->AsString=Sheet.OlePropertyGet("Cells",row,col).OlePropertyGet("Value");
/
AnsiString str("");
str=Sheet.OlePropertyGet("Cells",row,col).OlePropertyGet("Value");
ShowMessage(str);
*/
}
}
//更新数据库
adoqr->UpdateBatch();
adoqr->Close();
//退出Excel文档
Wb.OleFunction("Close");
ExcelMain.OleFunction("Quit");
ExcelMain=Unassigned;
Wb=Unassigned;
Sheet=Unassigned;
return0;
}
转载:http://hi.baidu.com/msingle/blog/item/185f2b0f711fe32e6059f39a.html
http://hi.baidu.com/msingle/blog/item/2a274e9bd89d53bcc9eaf4a7.html
原文链接: https://www.cnblogs.com/red_giser/archive/2010/11/03/1868509.html
欢迎关注
微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍
原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/16969
非原创文章文中已经注明原地址,如有侵权,联系删除
关注公众号【高性能架构探索】,第一时间获取最新文章
转载文章受原作者版权保护。转载请注明原作者出处!