龙盟编程博客 | 无障碍搜索 | 云盘搜索神器
快速搜索
主页 > 软件开发 > C/C++开发 >

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

时间:2009-12-22 15:42来源:未知 作者:admin 点击:
分享到:
经常看到有网友发帖子询问如何将DBGrid中的内容导出到Excel或Word文档中,于是笔者花了点时间写了以下两个函数,分别实现将DBGrid中数据导出到Word和Excel文档。需要注重的是DBGrid中的数

  经常看到有网友发帖子询问如何将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

   {

  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; jColumns->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

   {

  // 63 63 72 75 6E 2E 63 6F 6D

  for(int j=0; jColumns->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文档

  

  

  

//---------------------------------------------------------------------------

  // 将DBGrid中的数据导出到Excel文档

  //---------------------------------------------------------------------------

  void __fastcall DBGrid2Excel(TDBGrid *dbg, String strXlsFile)

  {

   if(!dbg->DataSource->DataSet->Active) // 数据集没有打开就返回

  return;

   Variant vExcelApp, vSheet;

   try

   {

  vExcelApp = Variant::CreateObject("Excel.Application");

   }

   catch(...)

   {

  MessageBox(0, "启动 Excel 出错, 可能是没有安装Excel.","DBGrid2Excel", MB_OK MB_ICONERROR);

  return;

   }

   // 隐藏Excel界面

   vExcelApp.OlePropertySet("Visible", false);

   // 新建一个工作表

   vExcelApp.OlePropertyGet("Workbooks").OleFunction("Add", 1); // 工作表

   // 操作这个工作表

   vSheet = vExcelApp.OlePropertyGet("ActiveWorkbook").OlePropertyGet("Sheets", 1);

   // 设置Excel文档的字体

   vSheet.OleProcedure("Select");

   vSheet.OlePropertyGet("Cells").OleProcedure("Select");

   vExcelApp.OlePropertyGet("Selection").OlePropertyGet("Font").OlePropertySet("Size", dbg->Font->Size);

   vExcelApp.OlePropertyGet("Selection").OlePropertyGet("Font").OlePropertySet("Name",dbg->Font->Name.c_str());

   vExcelApp.OlePropertyGet("Selection").OlePropertyGet("Font").OlePropertySet("FontStyle", "常规");

   vSheet.OlePropertyGet("Cells", 1, 1).OleProcedure("Select");

   // 表格的行数

   int nRowCount(dbg->DataSource->DataSet->RecordCount + 1);

   nRowCount = nRowCount < 2? 2: nRowCount;

   // 表格的列数

   int nColCount(dbg->Columns->Count);

   nColCount = nColCount < 1? 1: nColCount;

   // 设置单元格的宽度

   for(int i=0; i

   {

  int nColWidth = dbg->Columns->Items[i]->Width;

  vExcelApp.OlePropertyGet("Columns", i + 1).OlePropertySet("ColumnWidth", nColWidth / 7);

   }

   // 先将列名写入Excel表格

   for(int j=0; jColumns->Count; j++)

   {

  // 标题行的行高

  vExcelApp.OlePropertyGet("Rows", 1).OlePropertySet("RowHeight", 20);

  vSheet.OlePropertyGet("Cells", 1, j + 1)

   .OlePropertySet("Value", dbg->Columns->Items[j]->FieldName.c_str());

  // 设置列名单元格的背景色

  Variant vInter = vSheet.OlePropertyGet( "Cells", 1, j + 1).OlePropertyGet("Interior");

  vInter.OlePropertySet("ColorIndex", 15); // 灰色

  vInter.OlePropertySet("Pattern", 1); // xlSolid

  vInter.OlePropertySet("PatternColorIndex", -4105); // xlAutomatic

   }

   // 将DBGrid中的数据写入Excel表格

   dbg->DataSource->DataSet->First();

   for(int i=0; i

   {

  // 普通数据行的行高16

  vExcelApp.OlePropertyGet("Rows", i + 2).OlePropertySet("RowHeight", 16);

  // 63 63 72 75 6E 2E 63 6F 6D

  for(int j=0; jColumns->Count; j++)

  {

   vSheet.OlePropertyGet("Cells", i + 2, j + 1).OlePropertySet("Value",

   dbg->DataSource->DataSet->FieldByName(

  dbg->Columns->Items[j]->FieldName)->AsString.c_str());

  }

  dbg->DataSource->DataSet->Next();

   }

   // 保存Excel文档并退出

   vExcelApp.OlePropertyGet("ActiveWorkbook").OleFunction("SaveAs", strXlsFile.c_str());

   vExcelApp.OleFunction("Quit");

   vSheet = Unassigned;

   vExcelApp = Unassigned;

   // 工作结束

   MessageBox(0, "DBGrid2Excel 转换结束!","DBGrid2Excel", MB_OK MB_ICONINFORMATION);

  }

  

  

精彩图集

赞助商链接