技术开发 频道

C++将DBGrid中数据导出到Word和Excel


【IT168技术文档】

  经常看到有网友发帖子询问如何将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());  // 要插入表格的行数  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<nColCount; 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);  }  // 先将列名写入Word表格  for(int j=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(int i=0; i<nRowCount; i++)  {   // 63 63 72 75 6E 2E 63 6F 6D   for(int j=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); }
0
相关文章