您的位置:首页 > 其它

将DBGrid中的数据导出到Word

2015-07-17 16:54 337 查看
转载:点击打开链接

这里把代码复制过来有一些细节上的要注意一下,在代码里面的for循环的次数和你的DBGrid绑定数据有很大关系,比如你是否隐藏某一行,或者说你只需导出哪几列等等;还有导出来的列名一般是DBGrid的列名,不是字段名称,所以注意这里;下面的代码是我根据我的要求改过的;希望对需要的人有用!!

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());
// 要插入表格的行数
int nRowCount(dbg->DataSource->DataSet->RecordCount +1);
nRowCount = nRowCount < 2? 2: nRowCount;
// 要插入表格的列数
int nColCount(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(int i=1; i<nColCount; i++)
{
int nColWidth = dbg->Columns->Items[i]->Width;
vTable.OlePropertyGet("Columns").OleFunction("Item", i )
.OlePropertySet("PreferredWidthType", 3); // wdPreferredWidthPoints

vTable.OlePropertyGet("Columns").OleFunction("Item", i)
.OlePropertySet("PreferredWidth", nColWidth);
}

// 先将列名写入Word表格
for(int j=1; j<dbg->Columns->Count; j++)
{
vCell = vTable.OleFunction("Cell", 1, j + 1);
vCell.OlePropertySet("Range", dbg->Columns->Items[j]->Title->Caption.c_str());//这里是列名,不是字段名
// 列名单元格背景颜色 // wdColorGray125
vCell.OlePropertyGet("Shading")
.OlePropertySet("BackgroundPatternColor", 14737632);
}
// 将DBGrid中的数据写入Word表格
dbg->DataSource->DataSet->First();
for(int i=1; i<nRowCount; i++)
{
// 63 63 72 75 6E 2E 63 6F 6D
for(int j=1; 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);

}

void __fastcall TUserInfoForm::btnWordClick(TObject *Sender)
{
if(MessageDlg("确认要导出数据吗?",
mtConfirmation, TMsgDlgButtons() << mbYes << mbNo, 0)
==mrYes)
{
if(SaveDialog1->Execute())
{
String fileName=SaveDialog1->FileName;
DBGrid2Word(DBGridUser,fileName);

}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: