本站首页    管理页面    写新日志    退出


«January 2026»
123
45678910
11121314151617
18192021222324
25262728293031


公告
暂无公告...

我的分类(专题)

日志更新

最新评论

留言板

链接


Blog信息
blog名称:
日志总数:21
评论数量:94
留言数量:1
访问次数:145871
建立时间:2006年1月9日




[转帖]C++将DBGrid中数据导出到Word和Excel.mht
文章收藏

joinclear 发表于 2006/1/13 9:08:29

转载自: mhtml:file://F:\资料\C++将DBGrid中数据导出到Word和Excel.mht经常看到有网友发帖子询问如何将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);}  二、将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<nColCount; i++) {  int nColWidth = dbg->Columns->Items[i]->Width;  vExcelApp.OlePropertyGet("Columns", i + 1).OlePropertySet("ColumnWidth", nColWidth / 7); } // 先将列名写入Excel表格 for(int j=0; j<dbg->Columns->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<nRowCount; i++) {  // 普通数据行的行高16  vExcelApp.OlePropertyGet("Rows", i + 2).OlePropertySet("RowHeight", 16);  // 63 63 72 75 6E 2E 63 6F 6D  for(int j=0; j<dbg->Columns->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);}


阅读全文(2205) | 回复(0) | 编辑 | 精华
 



发表评论:
昵称:
密码:
主页:
标题:
验证码:  (不区分大小写,请仔细填写,输错需重写评论内容!)



站点首页 | 联系我们 | 博客注册 | 博客登陆

Sponsored By W3CHINA
W3CHINA Blog 0.8 Processed in 0.798 second(s), page refreshed 144810407 times.
《全国人大常委会关于维护互联网安全的决定》  《计算机信息网络国际联网安全保护管理办法》
苏ICP备05006046号