C++中将DBGrid中的数据导出到Word和Excel
昨天ccrun刚写了将ListView中内容导出到Word文档和Excel文档的一篇文章,今天写程序凑巧用到了将DBGrid中数据导出到Office的功能,干脆再写个兄弟版的函数出来,DBGrid2Word和DBGrid2Excel,分别实现将DBGrid中数据导出到Word和Excel文档。需要注重的是DBGrid中的数据并不代码数据库中所有的数据,因为数据集在打开的时候有可能进行了筛选,取决于使用者如何打开这个数据集,总之就是DBGrid中显示多少数据,就导出多少。看在写代码很辛劳的份上,请在转载时留下出处和原作者信息。Thank了。:D
假如您有好的想法,或者代码中存在的BUG,欢迎来信讨论: info@ccrun.com
2005.10.13 v0.1
初版发布
//---------------------------------------------------------------------------
// 将DBGrid中的数据导出到Word文档
// v0.1 by ccrun(老妖) 2005.10.13 1:40
//---------------------------------------------------------------------------
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=0; i { int nColWidth = 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); } //---------------------------------------------------------------------------- // 抱歉,这个提示又来了,为了防止不负责任的转载者,只好在此留些信息。 // 作者:ccrun(老妖) info@ccrun.com // 本文转自 C++Builder 研究 - http://www.ccrun.com/article/go.ASP?i=635&d=g75jbn //---------------------------------------------------------------------------- // 先将列名写入Word表格 for(int j=0; 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(int i=0; i { // 63 63 72 75 6E 2E 63 6F 6D for(int j=0; j { &n
- 上一篇:C++中建立对象间消息连接的一种系统方法
- 下一篇:C++语言简介